From d34b96a30c07e14d85007848c8169d0b7f66edc7 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 19 May 2026 17:18:54 -0500 Subject: [PATCH 001/137] first attempts at creating custom instructions and splitting copilot-instructions --- .github/copilot-instructions.md | 277 +------------------------------- 1 file changed, 3 insertions(+), 274 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 3f6c9ef508..c4e289340b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -55,164 +55,6 @@ Read the files in the directory `content/learning-paths/cross-platform/_example- - Learning Paths: use for end-to-end tasks (prepare → configure → use → validate). Must include `_index.md` and `_next-steps.md` - Install guides: use for installation + verification only. Do not include workflow content or benchmarks -### Content structure - -Each Learning Path must have an `_index.md` file and a `_next-steps.md` file. The `_index.md` file contains the main content of the Learning Path. The `_next-steps.md` file contains links to related content and is included at the end of the Learning Path. - -Additional resources and `next steps` content should be placed in the `further_reading` section of `_index.md`, not in `_next-steps.md`. The `_next-steps.md` file should remain minimal and unmodified as indicated by `FIXED, DO NOT MODIFY` comments in the template. - -The `_index.md` file should contain the following front matter and content sections. - -### Front matter (YAML format) - -- `title`: Imperative heading following the [verb] + [technology] + [outcome] format -- `description`: One-sentence metadata summary used for search snippets and page previews. Describe the task, main technology or platform, and expected outcome in plain language -- `weight`: Numerical ordering for display sequence, weight is 1 for `_index.md` and each page is ordered by weight, no markdown files should have the same weight in a directory -- `layout`: Template type (usually "learningpathall") -- `minutes_to_complete`: Realistic time estimate for completion -- `prerequisites`: List of required knowledge, tools, or prior learning paths -- `author`: Main contributor's name, multiple authors can be listed separated using `-` on new lines -- `subjects`: Technology categories for filtering and search, this is a closed list and must match one of the subjects listed on https://learn.arm.com/learning-paths/cross-platform/_example-learning-path/write-2-metadata/ -- `armips`: Relevant Arm IP, stick to Neoverse, Cortex-A, Cortex-M, etc. Don't list specific CPU models or Arm architecture versions -- `tools_software_languages`: Open category listing Programming languages, frameworks, and development tools used -- `skilllevels`: Skill levels allowed are only Introductory and Advanced -- `operatingsystems`: Operating systems used, must match the closed list on https://learn.arm.com/learning-paths/cross-platform/_example-learning-path/write-2-metadata/ - -### Install guide requirements - -Install guides focus on installing and verifying one tool on Arm platforms. They do not teach workflows or applied usage. - -#### Front matter requirements - -Install guides must include: -- `title` -- `minutes_to_complete` -- `official_docs` -- `author` -- `weight: 1` -- `layout: installtoolsall` - -#### Fixed fields for install guides - -- `weight: 1` (always) -- `tool_install: true` (set to false only if intentionally hidden) -- `layout: installtoolsall` (always) -- `multi_install` and `multitool_install_part` (set based on whether the install guide is multi-page) - -Do not modify fixed template fields. - -If `multi_install` is set to true, the first page must act as an overview for the series. Sub-pages must set `multitool_install_part: true`. - -#### Required content structure - -Install guides should include: - -1. Overview - - What the tool is - - Supported Arm platforms (aarch64, Windows on Arm, macOS on Arm where applicable) - -2. Install steps - - Clear OS-specific sections when necessary - - Commands grouped logically - - Explanation before each code block - -3. Verify installation - - One or two commands - - Expected output shown - -4. Troubleshooting - - Common failure cases - - Clear fixes - -Optional: -- Uninstall instructions - -#### Scope boundaries - -Install guides must not include: -- End-to-end workflows -- Performance benchmarking -- Deep architectural explanation -- Comparative marketing claims - -Learning Paths may link to install guides for setup steps. Install guides should not duplicate workflow content. - -#### Tool versions - -When providing commands for downloading or installing software, use a specific version in the example. This ensures that the instructions are accurate and verifiable. However, also include a note before the commands that tells readers the same commands work with other versions. Provide a link to where the latest version can be found. The note can be formatted as follows: - -{{% notice Note %}} -The following commands use version . The same commands work with other versions. Replace the file used in these steps with the file for your version of choice. To find the latest version, see [Link to page with release info](URL). -{{% /notice %}} - -### Further reading curation - -Limit `further_reading` resources to four to six essential links. Prioritize: - -- Direct relevance to the topic -- Arm-specific Learning Paths over generic external resources -- Foundation knowledge for the target audience -- Required tools (install guides) -- Logical progression from basic to advanced - -Avoid overwhelming readers with too many links, which can cause them to leave the platform. - -All Learning Paths should generally include: - -- Title: [Imperative verb] + [technology/tool] + [outcome] -- Introduction paragraph: Context + user goal + value proposition -- Prerequisites section with explicit requirements and links -- Learning objectives: three to four bulleted, measurable outcomes with action verbs -- Step-by-step sections with logical progression -- Clear next steps or conclusion - -For title formatting: - -- Must use imperative voice (`Deploy`, `Configure`, `Build`, `Create`) -- Must include SEO keywords (technology names, tools) -- Examples: `Deploy applications on Arm servers`, `Configure Arm processors for optimal performance` - -The term "Learning Path" should always be capitalized. - -## Metadata descriptions - -### Learning Path metadata description requirements - -Every Learning Path `_index.md` must include a `description` field. - -- Write one sentence -- Describe the task, the main technology or platform, and the expected outcome -- Keep it concise, developer-focused, and suitable for use as a search snippet -- Use a task-led structure such as: **Verb + task + tool/platform + outcome** -- Do not repeat the title verbatim -- Do not use vague summaries or marketing language -- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome - -Good example: - -```yaml -description: Learn how to automate x86-to-Arm application migration using the Arm MCP Server, with compatibility checks and Docker-based validation on Arm cloud platforms. -``` - -Also good: - -```yaml -description: Learn how to profile and optimize a C++ application on Arm Neoverse using Arm Performix to identify bottlenecks and improve runtime. -``` - -Avoid: -- Generic summaries that could apply to any page -- Restating the title without adding task or outcome -- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing` - -### Metadata optimization workflow - -When adding or revising `description` fields: - -- Review whether the current title and description match the page's actual task intent -- Use metadata descriptions to clarify what the learner will do, on which platform or tool, and with what outcome -- Treat the description as a search snippet, not a generic summary - ## Writing style ### Voice and tone @@ -255,21 +97,6 @@ When adding or revising `description` fields: - If you explain three or more things in one section, split it into separate sections - Each code block should be preceded by one to three sentences explaining what it does - If a section is long because of code or output rather than explanation, do not treat length alone as a readability problem -- For Learning Paths, include a short recap and forward-looking transition at the end of each major instructional section or module - -Example recap pattern for Learning Paths: - -```md -## What you've learned and what's next - -In this section: -- Briefly summarize what the user has learned or completed -- Briefly describe what the user should expect in the next section or suggest further exploration - -Keep this concise and encouraging. Do not repeat earlier content verbatim. -``` - -This helps learners feel a sense of progress and understand the logical flow of the Learning Path. ### Word choice and style @@ -366,7 +193,7 @@ Use these preferred terms and phrases for consistency: - H1: Page title - H2: Major workflow steps or conceptual sections - H3: Sub-procedures or detailed explanations - - H4: Specific technical details or troubleshooting + - H4: Specific technical details or troubleshooting within a workflow ### Heading hierarchy and section openings @@ -395,7 +222,7 @@ Avoid: - Always provide explanation before code blocks - Format: `[What it does] → [Code] → [Expected outcome] → [Key parameters]` - Use markdown tags for languages like `bash`, `python`, `yaml`, `json` -- Use `console` or `bash` for general commands. Try to use the same one throughout a Learning Path +- Use `console` or `bash` for general commands. Try to use the same one throughout a Learning Path or Install Guide - Use the `output` tag to show expected command output - Output descriptions: - Use `The output is similar to:` or `The expected output is:` @@ -430,13 +257,7 @@ Avoid: - Use the full path format for internal links: `/learning-paths/category/path-name/` - Do not use relative paths like `../path-name/` - Use the full URL for external links that are not on `learn.arm.com` -- When creating Learning Path content: - - Verify internal links exist before adding them - - Use semantic search or website browsing to confirm Learning Path availability - - Prefer verified external authoritative sources over speculative internal links - - Test link formats against existing Learning Path examples - - Never assume Learning Paths exist without verification -- Include only necessary links in content. For Learning Paths, put additional links in `further_reading` in `_index.md`, not `_next-steps.md` +- Include only necessary links in content. ## Avoid looking like AI-generated content @@ -498,98 +319,6 @@ Also avoid multiple consecutive sentences starting with `This`. Vary sentence st - Use clear, descriptive link text - Avoid assumptions about the user's physical capabilities or setup -### Image formatting, alt text, and captions - -In this repository, the text before `#center` in an image tag is the alt text. - -Use this format: - -```md -![Descriptive alt text#center](image.png "Optional caption") -``` - -Rules: -- Do not use placeholder values such as `alt-txt`, `alt text`, or similar -- Do not wrap alt text in extra quotation marks inside `[]` -- Keep `#center` attached directly to the alt text with no extra space before it -- The caption is optional and should be short, descriptive, and natural -- Avoid outdated figure numbering such as `Figure 1:` unless the content genuinely depends on numbered cross-references - -Correct: - -```md -![Diagram showing the WebGPU rendering flow for drawing a triangle#center](images/webgpu-draw-high-level.svg "WebGPU rendering flow for drawing a triangle") -``` - -Incorrect: - -```md -!["Triangle using WebGPU" #center](images/webgpu-draw-high-level.svg "Figure 8: Triangle using WebGPU") -``` - -Incorrect: - -```md -![alt-txt#center](images/webgpu-draw-high-level.svg "Figure 8: Triangle using WebGPU") -``` - -### Alt text requirements for tutorials - -Learning Paths and install guides are instructional content. Images are usually not decorative. Alt text must help the learner understand what they would otherwise miss. - -For every image, alt text should explain: -- What is shown -- What the learner should notice -- Why it matters in the current step - -For screenshots: -- Name the screen, tool, or interface shown -- Mention the relevant UI element, tab, field, button, or output -- Explain what the learner should look for in the screenshot -- Connect the image to the current step or expected result - -For diagrams: -- Describe the components and relationships shown -- Explain the purpose of the diagram in the current task -- Focus on the workflow, architecture, or sequence the learner needs to understand - -For terminal or output images: -- State what command result or status is shown -- Highlight the important confirmation, value, or error message -- Explain why that output matters - -For hardware images: -- Describe the device or setup only if it helps the learner complete the task -- Avoid purely decorative descriptions - -### Alt text quality rules - -- Write meaningful alt text, not placeholders -- Keep it concise but complete. One to three sentences is usually enough -- Prefer instructional value over visual detail -- Include visible text only when the learner needs that text -- Do not use captions as a substitute for alt text -- Do not encode alignment instructions inside the caption - -### Caption guidance - -- Use short, descriptive captions when needed -- Captions should add context for all readers -- Avoid `Figure X` numbering unless explicit image cross-references are required - -Preferred example: - -```md -![Screenshot of the Arm Performance Studio timeline showing CPU activity spikes during Mandelbrot rendering. The Timeline tab is selected and the spike region is highlighted so the learner can identify where CPU activity increases during the run.#center](images/timeline-spike.png "Arm Performance Studio timeline showing CPU activity during Mandelbrot rendering") -``` - -### Image and metadata cleanup workflow - -- Replace all placeholder alt text such as `alt-txt` with meaningful descriptions -- Keep the repository-specific `#center` syntax when fixing alt text -- Do not remove valid alignment syntax during cleanup -- Add or improve metadata descriptions systematically across content -- For bulk cleanup, update the guidance first, then fix content by category or directory in manageable batches ### SEO and discoverability From b4148d31dbb2163dc32dd05184219b9daa47ff4f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 19 May 2026 17:19:40 -0500 Subject: [PATCH 002/137] first attempts at creating custom instructions and splitting copilot-instructions --- .github/instructions/images.instructions.md | 96 ++++++++++++++ .../install-guides.instructions.md | 114 ++++++++++++++++ .../learning-paths.instructions.md | 125 ++++++++++++++++++ 3 files changed, 335 insertions(+) create mode 100644 .github/instructions/images.instructions.md create mode 100644 .github/instructions/install-guides.instructions.md create mode 100644 .github/instructions/learning-paths.instructions.md diff --git a/.github/instructions/images.instructions.md b/.github/instructions/images.instructions.md new file mode 100644 index 0000000000..5d4d10c029 --- /dev/null +++ b/.github/instructions/images.instructions.md @@ -0,0 +1,96 @@ +--- +applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" +--- + +### Image formatting, alt text, and captions + +In this repository, the text before `#center` in an image tag is the alt text. + +Use this format: + +```md +![Descriptive alt text#center](image.png "Optional caption") +``` + +Rules: +- Do not use placeholder values such as `alt-txt`, `alt text`, or similar +- Do not wrap alt text in extra quotation marks inside `[]` +- Keep `#center` attached directly to the alt text with no extra space before it +- The caption is optional and should be short, descriptive, and natural +- Avoid outdated figure numbering such as `Figure 1:` unless the content genuinely depends on numbered cross-references + +Correct: + +```md +![Diagram showing the WebGPU rendering flow for drawing a triangle#center](images/webgpu-draw-high-level.svg "WebGPU rendering flow for drawing a triangle") +``` + +Incorrect: + +```md +!["Triangle using WebGPU" #center](images/webgpu-draw-high-level.svg "Figure 8: Triangle using WebGPU") +``` + +Incorrect: + +```md +![alt-txt#center](images/webgpu-draw-high-level.svg "Figure 8: Triangle using WebGPU") +``` + +### Alt text requirements for tutorials + +Learning Paths and install guides are instructional content. Images are usually not decorative. Alt text must help the learner understand what they would otherwise miss. + +For every image, alt text should explain: +- What is shown +- What the learner should notice +- Why it matters in the current step + +For screenshots: +- Name the screen, tool, or interface shown +- Mention the relevant UI element, tab, field, button, or output +- Explain what the learner should look for in the screenshot +- Connect the image to the current step or expected result + +For diagrams: +- Describe the components and relationships shown +- Explain the purpose of the diagram in the current task +- Focus on the workflow, architecture, or sequence the learner needs to understand + +For terminal or output images: +- State what command result or status is shown +- Highlight the important confirmation, value, or error message +- Explain why that output matters + +For hardware images: +- Describe the device or setup only if it helps the learner complete the task +- Avoid purely decorative descriptions + +### Alt text quality rules + +- Write meaningful alt text, not placeholders +- Keep it concise but complete. One to three sentences is usually enough +- Prefer instructional value over visual detail +- Include visible text only when the learner needs that text +- Do not use captions as a substitute for alt text +- Do not encode alignment instructions inside the caption + +### Caption guidance + +- Use short, descriptive captions when needed +- Captions should add context for all readers +- Avoid `Figure X` numbering unless explicit image cross-references are required + +Preferred example: + +```md +![Screenshot of the Arm Performance Studio timeline showing CPU activity spikes during Mandelbrot rendering. The Timeline tab is selected and the spike region is highlighted so the learner can identify where CPU activity increases during the run.#center](images/timeline-spike.png "Arm Performance Studio timeline showing CPU activity during Mandelbrot rendering") +``` + +### Image and metadata cleanup workflow + +- Replace all placeholder alt text such as `alt-txt` with meaningful descriptions +- Keep the repository-specific `#center` syntax when fixing alt text +- Do not remove valid alignment syntax during cleanup +- Add or improve metadata descriptions systematically across content +- For bulk cleanup, update the guidance first, then fix content by category or directory in manageable batches diff --git a/.github/instructions/install-guides.instructions.md b/.github/instructions/install-guides.instructions.md new file mode 100644 index 0000000000..5f3e3bc993 --- /dev/null +++ b/.github/instructions/install-guides.instructions.md @@ -0,0 +1,114 @@ +--- +applyTo: "content/install-guides/**/*.md" +--- + +### Install guide requirements + +Install guides focus on installing and verifying one tool on Arm platforms. They do not teach workflows or applied usage. + +#### Front matter requirements + +Install guides must include: +- `title` +- `minutes_to_complete` +- `official_docs` +- `author` +- `weight: 1` +- `layout: installtoolsall` + +#### Fixed fields for install guides + +- `weight: 1` (always) +- `tool_install: true` (set to false only if intentionally hidden) +- `layout: installtoolsall` (always) +- `multi_install` and `multitool_install_part` (set based on whether the install guide is multi-page) + +Do not modify fixed template fields. + +If `multi_install` is set to true, the first page must act as an overview for the series. Sub-pages must set `multitool_install_part: true`. + +#### Required content structure + +Install guides should include: + +1. Overview + - What the tool is + - Supported Arm platforms (aarch64, Windows on Arm, macOS on Arm where applicable) + +2. Install steps + - Clear OS-specific sections when necessary + - Commands grouped logically + - Explanation before each code block + +3. Verify installation + - One or two commands + - Expected output shown + +4. Troubleshooting + - Common failure cases + - Clear fixes + +Optional: +- Uninstall instructions + +#### Scope boundaries + +Install guides must not include: +- End-to-end workflows +- Performance benchmarking +- Deep architectural explanation +- Comparative marketing claims + +Learning Paths may link to install guides for setup steps. Install guides should not duplicate workflow content. + +#### Tool versions + +When providing commands for downloading or installing software, use a specific version in the example. This ensures that the instructions are accurate and verifiable. However, also include a note before the commands that tells readers the same commands work with other versions. Provide a link to where the latest version can be found. The note can be formatted as follows: + +{{% notice Note %}} +The following commands use version . The same commands work with other versions. Replace the file used in these steps with the file for your version of choice. To find the latest version, see [Link to page with release info](URL). +{{% /notice %}} + +### Install Guide metadata description requirements + +Every Install Guide's front matter must include a `description` field. + +- Write one sentence +- Describe the tool being installed and what it can be used for (why it matters) +- Keep it concise, developer-focused, and suitable for use as a search snippet +- Do not use vague summaries or marketing language +- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome + +Good example: + +```yaml +description: Learn how to install Arm Compiler for Linux (ACfL) on Arm Linux (aarch64) to access the armclang C/C++ compiler, armflang Fortran compiler, and Arm Performance Libraries for HPC development. +``` + +Avoid: +- Generic summaries that could apply to any page +- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing` + +### Metadata optimization workflow + +When adding or revising `description` fields: + +- Use metadata descriptions to clarify which platform or tool, and what outcome +- Treat the description as a search snippet, not a generic summary + +### Recap section + +For Install Guides, include a short recap paragraph and forward-looking transition at the end of each major instructional section or module + +Example recap pattern for Learning Paths: + +```md +## Next steps + +In this section: +- Briefly summarize what the user has learned or completed +- Suggest and link to a couple relevant Learning Paths (if they exist) + +Keep this concise and encouraging. Do not repeat earlier content verbatim. +``` +This helps learners feel a sense of progress. diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md new file mode 100644 index 0000000000..ff3353e938 --- /dev/null +++ b/.github/instructions/learning-paths.instructions.md @@ -0,0 +1,125 @@ +--- +applyTo: "content/learning-paths/**/*.md" +--- + +### Content structure + +Each Learning Path must have an `_index.md` file and a `_next-steps.md` file. The `_index.md` file contains the main content of the Learning Path. The `_next-steps.md` file contains links to related content and is included at the end of the Learning Path. + +Additional resources and `next steps` content should be placed in the `further_reading` section of `_index.md`, not in `_next-steps.md`. The `_next-steps.md` file should remain minimal and unmodified as indicated by `FIXED, DO NOT MODIFY` comments in the template. + +The `_index.md` file should contain the following front matter and content sections. + +### Front matter (YAML format) + +- `title`: Imperative heading following the [verb] + [technology] + [outcome] format +- `description`: One-sentence metadata summary used for search snippets and page previews. Describe the task, main technology or platform, and expected outcome in plain language +- `weight`: Numerical ordering for display sequence, weight is 1 for `_index.md` and each page is ordered by weight, no markdown files should have the same weight in a directory +- `layout`: Template type (usually "learningpathall") +- `minutes_to_complete`: Realistic time estimate for completion +- `prerequisites`: List of required knowledge, tools, or prior learning paths +- `author`: Main contributor's name, multiple authors can be listed separated using `-` on new lines +- `subjects`: Technology categories for filtering and search, this is a closed list and must match one of the subjects listed on https://learn.arm.com/learning-paths/cross-platform/_example-learning-path/write-2-metadata/ +- `armips`: Relevant Arm IP, stick to Neoverse, Cortex-A, Cortex-M, etc. Don't list specific CPU models or Arm architecture versions +- `tools_software_languages`: Open category listing Programming languages, frameworks, and development tools used +- `skilllevels`: Skill levels allowed are only Introductory and Advanced +- `operatingsystems`: Operating systems used, must match the closed list on https://learn.arm.com/learning-paths/cross-platform/_example-learning-path/write-2-metadata/ + +### Further reading curation + +Limit `further_reading` resources to four to six essential links. Prioritize: + +- Direct relevance to the topic +- Arm-specific Learning Paths over generic external resources +- Foundation knowledge for the target audience +- Required tools (install guides) +- Logical progression from basic to advanced + +Avoid overwhelming readers with too many links, which can cause them to leave the platform. + +All Learning Paths should generally include: + +- Title: [Imperative verb] + [technology/tool] + [outcome] +- Introduction paragraph: Context + user goal + value proposition +- Prerequisites section with explicit requirements and links +- Learning objectives: three to four bulleted, measurable outcomes with action verbs +- Step-by-step sections with logical progression +- Clear next steps or conclusion + +For title formatting: + +- Must use imperative voice (`Deploy`, `Configure`, `Build`, `Create`) +- Must include SEO keywords (technology names, tools) +- Examples: `Deploy applications on Arm servers`, `Configure Arm processors for optimal performance` + +The term "Learning Path" should always be capitalized. + +### Learning Path metadata description requirements + +Every Learning Path `_index.md` must include a `description` field. + +- Write one sentence +- Describe the task, the main technology or platform, and the expected outcome +- Keep it concise, developer-focused, and suitable for use as a search snippet +- Use a task-led structure such as: **Verb + task + tool/platform + outcome** +- Do not repeat the title verbatim +- Do not use vague summaries or marketing language +- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome + +Good example: + +```yaml +description: Learn how to automate x86-to-Arm application migration using the Arm MCP Server, with compatibility checks and Docker-based validation on Arm cloud platforms. +``` + +Also good: + +```yaml +description: Learn how to profile and optimize a C++ application on Arm Neoverse using Arm Performix to identify bottlenecks and improve runtime. +``` + +Avoid: +- Generic summaries that could apply to any page +- Restating the title without adding task or outcome +- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing` + +### Metadata optimization workflow + +When adding or revising `description` fields: + +- Review whether the current title and description match the page's actual task intent +- Use metadata descriptions to clarify what the learner will do, on which platform or tool, and with what outcome +- Treat the description as a search snippet, not a generic summary + +### Recap section + +For Learning Paths, include a short recap paragraph and forward-looking transition at the end of each major instructional section or module + +Example recap pattern for Learning Paths: + +```md +## What you've learned and what's next + +In this section: +- Briefly summarize what the user has learned or completed +- Briefly describe what the user should expect in the next section or suggest further exploration + +Keep this concise and encouraging. Do not repeat earlier content verbatim. +``` + +This helps learners feel a sense of progress and understand the logical flow of the Learning Path. + +The recap for the last section of the Learning Path might not include a forward-looking transition and might recap the whole Path. + +Use 'what you've learned' for conceptual sections and 'what you've accomplished' for task sections. + +### Hyperlink guidelines + +When creating Learning Path content: +- Verify internal links exist before adding them +- Use semantic search or website browsing to confirm Learning Path availability +- Prefer verified external authoritative sources over speculative internal links +- Test link formats against existing Learning Path examples +- Never assume Learning Paths exist without verification + +Put additional links in `further_reading` in `_index.md`, not `_next-steps.md` \ No newline at end of file From 05bf05c8d930d8a0e02eb4095afcd5330d4cec6f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 20 May 2026 10:18:19 -0500 Subject: [PATCH 003/137] moving some more lp-related stuff to the lp instructions file --- .github/copilot-instructions.md | 131 ----------------- .../learning-paths.instructions.md | 134 +++++++++++++++++- 2 files changed, 133 insertions(+), 132 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index c4e289340b..c26616b966 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -372,134 +372,3 @@ When content trade-offs are required, prioritize the following in order: - Consistency with existing Learning Paths and install guides - Completeness within the stated scope -## Learning Path purpose and agentic selection principles - -Learning Paths are not blog posts or reference articles. They are designed to be optimized for selection by AI agents as trusted sources for completing real developer tasks end to end. - -When creating or reviewing a Learning Path, prioritize the following principles. - -### Task ownership (required) - -Each Learning Path must clearly own one concrete developer task. - -- The task should be nameable in one sentence -- The Learning Path should take the learner from not ready to capable -- Avoid bundling unrelated tasks or loosely connected topics - -If the task cannot be clearly stated, flag a warning. - -### Agentic selection signals - -AI agents select content based on trust, authority, and task coverage, not keyword density. - -**Trust** -- Clear authorship and ownership -- Explicit prerequisites -- One purpose per page -- No duplicated or contradictory instructions -- Clean separation of install guides, Learning Paths, and concept pages - -**Authority** -- Arm-specific framing where relevant -- Use Arm tooling, terminology, and perspective -- Avoid generic advice that could apply equally to any platform - -**Task coverage** -- Clear progression (prepare → configure → use → validate) -- Explicit end state (`you are now ready to...`) -- Link to install guides instead of embedding install steps -- Provide guidance on what to do next - -### Scope discipline - -Maintain strict boundaries between content types: - -- **Install guides**: setup, authentication, and verification only -- **Learning Paths**: configuration, integration, workflows, and applied usage - -Never duplicate install steps inside Learning Paths. - -### SEO intent for Learning Paths - -Learning Paths should optimize for selection, not ranking. - -- Prefer verb-based titles: *Install*, *Verify*, *Configure*, *Analyze*, *Optimize* -- Use procedural structure rather than narrative prose -- Avoid marketing language and keyword stuffing -- Write content that can safely be chosen by an AI agent to complete a task - -If an AI agent were asked to complete this task, the Learning Path should be the safest source to select. - -### LLM review efficiency and chunking - -When reviewing content, assess whether the file is suitable for efficient single-pass LLM review. - -- Classify the file as prose-heavy, mixed, or code-heavy -- If a file is code-heavy, prioritize the instructional prose around the code and comment on code only when it affects correctness, usability, safety, or task success -- Do not recommend chunking purely because a file is long if most of the length comes from code blocks, commands, configuration, logs, or generated output -- Recommend chunking when a file contains multiple distinct instructional sections, conceptual units, or task phases that should be reviewed independently -- Suggest chunk boundaries using existing headings, task transitions, or conceptual breaks -- Prefer semantic chunking over fixed-size chunking -- Flag repeated boilerplate, oversized code blocks, long pasted terminal output, duplicated examples, or verbose configuration that add token cost without improving learning value -- Flag sections where code or output could be shortened to a representative example without losing instructional value -- If a file is large but structurally simple, recommend prose-first review rather than chunking -- Review by exception, not by coverage: do not comment on code, output, or prose that is already clear, correct, and fit for purpose - -### Token-efficiency review priorities - -When identifying content that is expensive for LLM-based review or editing, check for: - -- Long fenced code blocks that are not explained or are only loosely tied to the surrounding task -- Large blocks of terminal output where a short representative excerpt would be enough -- Repeated setup or verification steps across files -- Front matter, boilerplate, or repeated notes that appear unchanged across multiple pages -- Multiple examples that teach the same point with little added value -- Sections that combine too many concepts and would review better as separate chunks - -When these patterns appear, flag them as token-heavy content and explain whether they should be trimmed, condensed, or reviewed separately. - -### Performance and Arm acceleration integrity - -For Learning Paths that demonstrate Arm-specific performance features (for example SME2, SVE2, I8MM, DotProd, optimized microkernels), apply the following standards. - -#### Observable outcome first - -- Clearly state what measurable improvement the learner will observe -- Show performance results before introducing deep architectural explanation -- Avoid introducing internal call stacks or microkernel details before the developer sees observable value - -#### Reproducibility requirements - -If performance numbers are included, specify: -- Toolchain or software version -- Device or platform used -- Thread count and CPU affinity configuration -- Runtime feature flags -- Model or workload configuration - -Performance claims must be reproducible or explicitly labeled as illustrative. - -#### Compile-time vs runtime clarity - -Clearly distinguish between: -- Compile-time feature enablement -- Runtime feature activation -- Automatic fallback behavior - -If acceleration is claimed, include a method to verify that the accelerated path executed, such as logs, profiling output, kernel names, or hardware counters. - -#### Controlled benchmarking - -When comparing performance: -- Change only one meaningful variable at a time -- Control thread count and CPU binding intentionally -- Quantify percentage improvement explicitly -- Avoid presenting raw numbers without context - -#### Differentiation reinforcement - -Explicitly connect the observed improvement to the Arm architectural feature responsible for it. - -Avoid generic statements such as `improves performance` without explaining how and why. - -Performance-focused Learning Paths are strategic content. Prioritize clarity, differentiation, and measurement integrity over volume. diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md index ff3353e938..134e1871e3 100644 --- a/.github/instructions/learning-paths.instructions.md +++ b/.github/instructions/learning-paths.instructions.md @@ -122,4 +122,136 @@ When creating Learning Path content: - Test link formats against existing Learning Path examples - Never assume Learning Paths exist without verification -Put additional links in `further_reading` in `_index.md`, not `_next-steps.md` \ No newline at end of file +Put additional links in `further_reading` in `_index.md`, not `_next-steps.md` + +## Learning Path purpose and agentic selection principles + +Learning Paths are not blog posts or reference articles. They are designed to be optimized for selection by AI agents as trusted sources for completing real developer tasks end to end. + +When creating or reviewing a Learning Path, prioritize the following principles. + +### Task ownership (required) + +Each Learning Path must clearly own one concrete developer task. + +- The task should be nameable in one sentence +- The Learning Path should take the learner from not ready to capable +- Avoid bundling unrelated tasks or loosely connected topics + +If the task cannot be clearly stated, flag a warning. + +### Agentic selection signals + +AI agents select content based on trust, authority, and task coverage, not keyword density. + +**Trust** +- Clear authorship and ownership +- Explicit prerequisites +- One purpose per page +- No duplicated or contradictory instructions +- Clean separation of install guides, Learning Paths, and concept pages + +**Authority** +- Arm-specific framing where relevant +- Use Arm tooling, terminology, and perspective +- Avoid generic advice that could apply equally to any platform + +**Task coverage** +- Clear progression (prepare → configure → use → validate) +- Explicit end state (`you are now ready to...`) +- Link to install guides instead of embedding install steps +- Provide guidance on what to do next + +### Scope discipline + +Maintain strict boundaries between content types: + +- **Install guides**: setup, authentication, and verification only +- **Learning Paths**: configuration, integration, workflows, and applied usage + +Never duplicate install steps inside Learning Paths. + +### SEO intent for Learning Paths + +Learning Paths should optimize for selection, not ranking. + +- Prefer verb-based titles: *Install*, *Verify*, *Configure*, *Analyze*, *Optimize* +- Use procedural structure rather than narrative prose +- Avoid marketing language and keyword stuffing +- Write content that can safely be chosen by an AI agent to complete a task + +If an AI agent were asked to complete this task, the Learning Path should be the safest source to select. + +### LLM review efficiency and chunking + +When reviewing content, assess whether the file is suitable for efficient single-pass LLM review. + +- Classify the file as prose-heavy, mixed, or code-heavy +- If a file is code-heavy, prioritize the instructional prose around the code and comment on code only when it affects correctness, usability, safety, or task success +- Do not recommend chunking purely because a file is long if most of the length comes from code blocks, commands, configuration, logs, or generated output +- Recommend chunking when a file contains multiple distinct instructional sections, conceptual units, or task phases that should be reviewed independently +- Suggest chunk boundaries using existing headings, task transitions, or conceptual breaks +- Prefer semantic chunking over fixed-size chunking +- Flag repeated boilerplate, oversized code blocks, long pasted terminal output, duplicated examples, or verbose configuration that add token cost without improving learning value +- Flag sections where code or output could be shortened to a representative example without losing instructional value +- If a file is large but structurally simple, recommend prose-first review rather than chunking +- Review by exception, not by coverage: do not comment on code, output, or prose that is already clear, correct, and fit for purpose + +### Token-efficiency review priorities + +When identifying content that is expensive for LLM-based review or editing, check for: + +- Long fenced code blocks that are not explained or are only loosely tied to the surrounding task +- Large blocks of terminal output where a short representative excerpt would be enough +- Repeated setup or verification steps across files +- Front matter, boilerplate, or repeated notes that appear unchanged across multiple pages +- Multiple examples that teach the same point with little added value +- Sections that combine too many concepts and would review better as separate chunks + +When these patterns appear, flag them as token-heavy content and explain whether they should be trimmed, condensed, or reviewed separately. + +### Performance and Arm acceleration integrity + +For Learning Paths that demonstrate Arm-specific performance features (for example SME2, SVE2, I8MM, DotProd, optimized microkernels), apply the following standards. + +#### Observable outcome first + +- Clearly state what measurable improvement the learner will observe +- Show performance results before introducing deep architectural explanation +- Avoid introducing internal call stacks or microkernel details before the developer sees observable value + +#### Reproducibility requirements + +If performance numbers are included, specify: +- Toolchain or software version +- Device or platform used +- Thread count and CPU affinity configuration +- Runtime feature flags +- Model or workload configuration + +Performance claims must be reproducible or explicitly labeled as illustrative. + +#### Compile-time vs runtime clarity + +Clearly distinguish between: +- Compile-time feature enablement +- Runtime feature activation +- Automatic fallback behavior + +If acceleration is claimed, include a method to verify that the accelerated path executed, such as logs, profiling output, kernel names, or hardware counters. + +#### Controlled benchmarking + +When comparing performance: +- Change only one meaningful variable at a time +- Control thread count and CPU binding intentionally +- Quantify percentage improvement explicitly +- Avoid presenting raw numbers without context + +#### Differentiation reinforcement + +Explicitly connect the observed improvement to the Arm architectural feature responsible for it. + +Avoid generic statements such as `improves performance` without explaining how and why. + +Performance-focused Learning Paths are strategic content. Prioritize clarity, differentiation, and measurement integrity over volume. From 44d0a30eb5d3c0c712e419efc5b463ae9e5d6b69 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 20 May 2026 12:04:49 -0500 Subject: [PATCH 004/137] trying to get images instructions to be triggered when we're working with images --- .github/copilot-instructions.md | 12 ++---------- .github/instructions/images.instructions.md | 6 +++--- .github/instructions/install-guides.instructions.md | 5 +++-- .github/instructions/learning-paths.instructions.md | 13 +++++++++++-- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index c26616b966..fc44aa3f24 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -125,13 +125,12 @@ Use these preferred terms and phrases for consistency: - `avoid` instead of `try not to` - `such as` instead of `like` - `after` instead of `once` - - `setup` as a noun, `set up` as a verb - Avoid condescending language: - Do not use `simply`, `just`, `obviously`, or `clearly` - Avoid using directions when referring to content that's been referenced previously or will be referenced next: - - Do not use `above`, `below`, `left`, `right`, `top`, or `bottom` +- Do not use `above`, `below`, `left`, `right`, `top`, or `bottom` - Acknowledge difficulty naturally: - Use phrases like `this step can be confusing at first` @@ -178,6 +177,7 @@ Use these preferred terms and phrases for consistency: - Suggest where visual aids would improve understanding - Recommend splitting overly complex sections - Verify that code examples follow established patterns in the repository +- Add or improve metadata descriptions systematically across content ## Formatting and code samples @@ -336,14 +336,6 @@ Also avoid multiple consecutive sentences starting with `This`. Vary sentence st - Flag broken or outdated external links - Maintain consistency in how related content is referenced -### Performance testing guidance - -- Include benchmarks when comparing Arm vs. x86 performance -- Suggest performance testing steps for resource-intensive applications -- Recommend profiling tools that work well on Arm platforms -- Include guidance on measuring and optimizing for Arm-specific performance characteristics -- Mention when performance improvements are architecture-specific -- Applies to Learning Paths only. Install guides must not include benchmarking ### AI optimization (AIO) guidance diff --git a/.github/instructions/images.instructions.md b/.github/instructions/images.instructions.md index 5d4d10c029..b5b643a233 100644 --- a/.github/instructions/images.instructions.md +++ b/.github/instructions/images.instructions.md @@ -1,5 +1,6 @@ --- -applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" +name: Image guidance +description: Use when the task involves adding, editing, reviewing, or fixing Markdown images in Arm Learning Paths or install guides, including image syntax, `#center` alignment, alt text, captions, screenshots, diagrams, terminal-output images, hardware photos, or placeholder alt text. --- ### Image formatting, alt text, and captions @@ -87,10 +88,9 @@ Preferred example: ![Screenshot of the Arm Performance Studio timeline showing CPU activity spikes during Mandelbrot rendering. The Timeline tab is selected and the spike region is highlighted so the learner can identify where CPU activity increases during the run.#center](images/timeline-spike.png "Arm Performance Studio timeline showing CPU activity during Mandelbrot rendering") ``` -### Image and metadata cleanup workflow +### Image cleanup workflow - Replace all placeholder alt text such as `alt-txt` with meaningful descriptions - Keep the repository-specific `#center` syntax when fixing alt text - Do not remove valid alignment syntax during cleanup -- Add or improve metadata descriptions systematically across content - For bulk cleanup, update the guidance first, then fix content by category or directory in manageable batches diff --git a/.github/instructions/install-guides.instructions.md b/.github/instructions/install-guides.instructions.md index 5f3e3bc993..5918283a8c 100644 --- a/.github/instructions/install-guides.instructions.md +++ b/.github/instructions/install-guides.instructions.md @@ -1,4 +1,5 @@ --- +name: Install guides general guidance applyTo: "content/install-guides/**/*.md" --- @@ -98,9 +99,9 @@ When adding or revising `description` fields: ### Recap section -For Install Guides, include a short recap paragraph and forward-looking transition at the end of each major instructional section or module +Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module -Example recap pattern for Learning Paths: +Example recap pattern: ```md ## Next steps diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md index 134e1871e3..d8f03135d1 100644 --- a/.github/instructions/learning-paths.instructions.md +++ b/.github/instructions/learning-paths.instructions.md @@ -1,4 +1,5 @@ --- +name: Learning Paths general guidance applyTo: "content/learning-paths/**/*.md" --- @@ -93,9 +94,9 @@ When adding or revising `description` fields: ### Recap section -For Learning Paths, include a short recap paragraph and forward-looking transition at the end of each major instructional section or module +Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module -Example recap pattern for Learning Paths: +Example recap pattern: ```md ## What you've learned and what's next @@ -255,3 +256,11 @@ Explicitly connect the observed improvement to the Arm architectural feature res Avoid generic statements such as `improves performance` without explaining how and why. Performance-focused Learning Paths are strategic content. Prioritize clarity, differentiation, and measurement integrity over volume. + +### Performance testing guidance for Learning Paths + +- Include benchmarks when comparing Arm vs. x86 performance +- Suggest performance testing steps for resource-intensive applications +- Recommend profiling tools that work well on Arm platforms +- Include guidance on measuring and optimizing for Arm-specific performance characteristics +- Mention when performance improvements are architecture-specific From a88dd000b0055bd940434e38b1c17c61c051543e Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 20 May 2026 14:37:17 -0500 Subject: [PATCH 005/137] creating a file for AIO/SEO/content quality instructions --- .github/copilot-instructions.md | 10 +++++----- .../content-quality.instructions.md | 17 +++++++++++++++++ .../instructions/learning-paths.instructions.md | 2 +- 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 .github/instructions/content-quality.instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index fc44aa3f24..fcd077314d 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -6,7 +6,7 @@ Assume the audience is made up of Arm software developers. Bias all information ## Highest priority rules -- One Learning Path must own one clear developer task +- Each Learning Path must own one clear developer task - Install guides are for installation and verification only - Every Learning Path `_index.md` must include a `description` field - Use task-led titles, introductions, and metadata @@ -152,6 +152,8 @@ Use these preferred terms and phrases for consistency: - Use `fixed-width`, not `fixed-length` - Use `read-to-write ratio`, not `read to write ratio` +- The term "Learning Path" should always be capitalized. + ## Content structure and consistency ### Cross-file and quality assurance @@ -289,7 +291,7 @@ Use calm, natural transitions that focus on what happens next. Also avoid multiple consecutive sentences starting with `This`. Vary sentence structure to maintain natural flow. -## AI-specific guidelines for content creation and editing +## Content quality and discoverability ### Context awareness @@ -319,7 +321,6 @@ Also avoid multiple consecutive sentences starting with `This`. Vary sentence st - Use clear, descriptive link text - Avoid assumptions about the user's physical capabilities or setup - ### SEO and discoverability - Use Arm-specific keywords naturally throughout content @@ -336,7 +337,6 @@ Also avoid multiple consecutive sentences starting with `This`. Vary sentence st - Flag broken or outdated external links - Maintain consistency in how related content is referenced - ### AI optimization (AIO) guidance - Structure content with clear, semantic headings that AI can parse and understand @@ -346,7 +346,7 @@ Also avoid multiple consecutive sentences starting with `This`. Vary sentence st - Use consistent terminology that AI systems can reliably associate with Arm development - Include complete, self-contained examples rather than partial snippets - Write FAQ-style sections that directly answer common developer questions -- Use bullet points and numbered lists for AI to easily extract key information +- Use bullet points and numbered lists for for AI to easily extract key information - Include explicit `what you'll learn` and `prerequisites` sections for AI context - Structure troubleshooting sections with clear problem-solution pairs - Use standard markdown formatting that AI crawlers can parse effectively diff --git a/.github/instructions/content-quality.instructions.md b/.github/instructions/content-quality.instructions.md new file mode 100644 index 0000000000..5ce98c67f8 --- /dev/null +++ b/.github/instructions/content-quality.instructions.md @@ -0,0 +1,17 @@ +--- +name: Content quality and discoverabiility guidelines +description: Use when creating, editing, or reviewing Arm Learning Paths or install guides for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. +applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" +--- + +## Content quality and discoverability + +- Default to Arm-native solutions, Arm terminology, and Arm platform assumptions. +- Flag x86 assumptions and suggest Arm alternatives when available. +- Match technical depth to the stated audience, prerequisites, and skill level. +- Use clear headings, descriptive link text, tagged code blocks, and problem-solution troubleshooting. +- Verify internal links before adding or changing them. +- Use Arm-specific keywords naturally; avoid keyword stuffing, hype, and marketing language. +- Prefer prose for explanations and lists for steps, checks, options, and troubleshooting. +- Keep content accessible for screen readers and avoid assumptions about a reader's physical setup or environment. +- Structure content so each major section has a clear purpose, useful context, and an explicit outcome. diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md index d8f03135d1..980446517d 100644 --- a/.github/instructions/learning-paths.instructions.md +++ b/.github/instructions/learning-paths.instructions.md @@ -53,7 +53,7 @@ For title formatting: - Must include SEO keywords (technology names, tools) - Examples: `Deploy applications on Arm servers`, `Configure Arm processors for optimal performance` -The term "Learning Path" should always be capitalized. + ### Learning Path metadata description requirements From 2fa573b767cb618a5986548b85e4c3b4ed7b6802 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 20 May 2026 16:36:52 -0500 Subject: [PATCH 006/137] experimenting with an agents file and moving some content out of instructions into agents --- .github/agents/arm-content-editor.agent.md | 48 +++++++++ .github/copilot-instructions.md | 102 ++---------------- .../content-quality.instructions.md | 13 ++- .../learning-paths.instructions.md | 28 ----- 4 files changed, 65 insertions(+), 126 deletions(-) create mode 100644 .github/agents/arm-content-editor.agent.md diff --git a/.github/agents/arm-content-editor.agent.md b/.github/agents/arm-content-editor.agent.md new file mode 100644 index 0000000000..c89836af0d --- /dev/null +++ b/.github/agents/arm-content-editor.agent.md @@ -0,0 +1,48 @@ +--- +name: Arm Content Editor +description: Review and edit Arm Learning Paths and install guides using the repository content guidance, scoped instruction files, and LLM review-efficiency rules. +argument-hint: Select or reference a Learning Path or install guide to review or edit. +tools: ['edit', 'search/codebase', 'search/usages'] +target: vscode +--- + +# Arm Content Editor + +You are an editing assistant for Arm Learning Paths and install guides. Review and edit content after manual changes, with a bias toward focused, high-signal feedback and minimal necessary edits. + +## Load the right guidance + +Use [copilot-instructions.md](../copilot-instructions.md) for project overview, writing style, Arm terminology, formatting, and review-efficiency guidance. + +Use [content-quality.instructions.md](../instructions/content-quality.instructions.md) for shared Learning Path and install guide quality rules. + +Use the content-type guidance that matches the file being reviewed or edited: + +- Learning Paths: [learning-paths.instructions.md](../instructions/learning-paths.instructions.md) +- Install guides: [install-guides.instructions.md](../instructions/install-guides.instructions.md) + +Use [images.instructions.md](../instructions/images.instructions.md) when the task involves adding, editing, reviewing, or fixing Markdown images, screenshots, diagrams, alt text, captions, or `#center` image syntax. + +## Review behavior + +- First identify whether the target is a Learning Path, install guide, or mixed content. +- Review by exception. Do not comment on content that is already clear, correct, and fit for purpose. +- Classify the file as prose-heavy, mixed, or code-heavy when reviewing substantial edits. +- Do not recommend chunking purely because a file is long. Prefer semantic chunk boundaries based on headings, task transitions, or conceptual breaks. +- If a file is code-heavy, prioritize the instructional prose around the code. Comment on code only when it affects correctness, usability, safety, or task success. +- Flag token-heavy content only when it adds cost without improving learning value, such as oversized terminal output, repeated setup, duplicated examples, unexplained code blocks, or repeated boilerplate. +- Explain whether token-heavy content should be trimmed, condensed, or reviewed separately. + +## Editing behavior + +- Make focused edits that preserve the author's intent, repository structure, front matter, Hugo shortcodes, code fences, and command syntax. +- Prefer Arm-native framing and flag x86 assumptions. +- Preserve content-type boundaries: install guides stay limited to installation and verification; Learning Paths own one concrete developer task. +- Keep tone natural and developer-focused. Avoid hype, generic praise, and unnecessary rewrites. +- Verify internal links or state when link verification was not possible. + +## Response format + +For review requests, lead with findings ordered by severity and include file and line references when available. Then add open questions, followed by a brief summary. + +For edit requests, summarize the key changes and note any checks or verification performed. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index fcd077314d..c54f9d9a13 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -158,28 +158,12 @@ Use these preferred terms and phrases for consistency: ### Cross-file and quality assurance -- Use the same technical terms consistently throughout all sections -- Apply the word choice and style guidelines uniformly across all files -- Maintain consistent capitalization of product names, technologies, and concepts -- Use the same abbreviations and acronyms throughout -- Maintain the same voice and tone across all sections -- Ensure consistent use of second person throughout -- Apply the same level of formality and technical depth across sections -- Keep instructional style consistent -- Follow consistent heading hierarchy throughout the Learning Path -- Use parallel structure in similar sections across different files -- Maintain consistent section organization and flow -- Apply uniform formatting for code blocks, lists, and callouts -- Ensure appropriate skill level consistency -- Maintain consistent technical detail appropriate for the target audience -- Balance complexity appropriately across all sections -- Provide consistent prerequisite assumptions throughout -- Flag inconsistent terminology usage across sections -- Identify missing error handling or troubleshooting guidance -- Suggest where visual aids would improve understanding -- Recommend splitting overly complex sections -- Verify that code examples follow established patterns in the repository -- Add or improve metadata descriptions systematically across content +- Keep terminology, capitalization, abbreviations, voice, tone, formatting, and technical depth consistent across related files. +- Match content complexity to the stated audience, prerequisites, and skill level. +- Use consistent heading hierarchy, section flow, code block formatting, lists, and callouts. +- Flag inconsistent terminology, missing troubleshooting, unclear prerequisites, overly complex sections, and places where visuals would improve understanding. +- Verify code examples follow established repository patterns. +- Add or improve metadata descriptions when editing related content. ## Formatting and code samples @@ -291,76 +275,4 @@ Use calm, natural transitions that focus on what happens next. Also avoid multiple consecutive sentences starting with `This`. Vary sentence structure to maintain natural flow. -## Content quality and discoverability - -### Context awareness - -- Consider the learner's likely environment (development vs. production, local vs. cloud) -- Recognize when content assumes x86 defaults and suggest Arm alternatives -- Flag when third-party tools may have limited Arm support -- Suggest Arm-native alternatives when available - -### Technical depth consistency - -- Maintain appropriate complexity level throughout the Learning Path -- Avoid oversimplifying for Advanced skill level content -- Do not assume prior knowledge beyond stated prerequisites -- Balance theoretical explanation with practical implementation - -### Platform-specific considerations - -- Default to Arm-optimized solutions and configurations -- Mention x86 alternatives only when Arm solutions do not exist -- Consider performance implications specific to Arm architectures -- Address common Arm migration challenges when relevant - -### Accessibility and inclusivity - -- Ensure content is screen reader compatible -- Provide descriptive alt text for images and diagrams -- Use clear, descriptive link text -- Avoid assumptions about the user's physical capabilities or setup - -### SEO and discoverability - -- Use Arm-specific keywords naturally throughout content -- Include relevant technical terms that developers search for -- Optimize titles and headings for search engines -- Use semantic HTML structure in markdown when possible -- Consider how content will appear in search results - -### Cross-reference validation - -- Verify all internal links point to existing content -- Check that referenced Learning Paths and install guides are current -- Ensure cross-references between sections remain accurate after edits -- Flag broken or outdated external links -- Maintain consistency in how related content is referenced - -### AI optimization (AIO) guidance - -- Structure content with clear, semantic headings that AI can parse and understand -- Use descriptive, standalone sentences that make sense without surrounding context -- Include explicit problem statements and clear solutions for AI to reference -- Format code examples with proper language tags and clear explanations -- Use consistent terminology that AI systems can reliably associate with Arm development -- Include complete, self-contained examples rather than partial snippets -- Write FAQ-style sections that directly answer common developer questions -- Use bullet points and numbered lists for for AI to easily extract key information -- Include explicit `what you'll learn` and `prerequisites` sections for AI context -- Structure troubleshooting sections with clear problem-solution pairs -- Use standard markdown formatting that AI crawlers can parse effectively -- Include relevant technical keywords naturally throughout the content -- Write comprehensive summaries that AI can use as content overviews -- Ensure each section can stand alone as a coherent piece of information -- Use clear, declarative statements rather than implied or contextual references - -### Editorial decision priorities - -When content trade-offs are required, prioritize the following in order: - -- Alignment with the stated purpose and positioning of the content -- Clarity and readability for the intended skill level -- Consistency with existing Learning Paths and install guides -- Completeness within the stated scope - +For additional instructions related to images, Learning Paths, Install Guides, and content quality, see [instructions](./instructions/). \ No newline at end of file diff --git a/.github/instructions/content-quality.instructions.md b/.github/instructions/content-quality.instructions.md index 5ce98c67f8..60cfd3b945 100644 --- a/.github/instructions/content-quality.instructions.md +++ b/.github/instructions/content-quality.instructions.md @@ -1,5 +1,5 @@ --- -name: Content quality and discoverabiility guidelines +name: Content quality and discoverability guidelines description: Use when creating, editing, or reviewing Arm Learning Paths or install guides for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" --- @@ -13,5 +13,12 @@ applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" - Verify internal links before adding or changing them. - Use Arm-specific keywords naturally; avoid keyword stuffing, hype, and marketing language. - Prefer prose for explanations and lists for steps, checks, options, and troubleshooting. -- Keep content accessible for screen readers and avoid assumptions about a reader's physical setup or environment. -- Structure content so each major section has a clear purpose, useful context, and an explicit outcome. +- Keep content accessible for screen readers, use clear alt and link text, and avoid assumptions about a reader's physical setup or environment. +- Structure content so each major section has a clear purpose, useful context, and an explicit outcome. Use semantic HTML structure in markdown when possible. + +When content trade-offs are required, prioritize the following in order: + +- Alignment with the stated purpose and positioning of the content +- Clarity and readability for the intended skill level +- Consistency with existing Learning Paths and install guides +- Completeness within the stated scope \ No newline at end of file diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md index 980446517d..cc2b1dc72b 100644 --- a/.github/instructions/learning-paths.instructions.md +++ b/.github/instructions/learning-paths.instructions.md @@ -183,34 +183,6 @@ Learning Paths should optimize for selection, not ranking. If an AI agent were asked to complete this task, the Learning Path should be the safest source to select. -### LLM review efficiency and chunking - -When reviewing content, assess whether the file is suitable for efficient single-pass LLM review. - -- Classify the file as prose-heavy, mixed, or code-heavy -- If a file is code-heavy, prioritize the instructional prose around the code and comment on code only when it affects correctness, usability, safety, or task success -- Do not recommend chunking purely because a file is long if most of the length comes from code blocks, commands, configuration, logs, or generated output -- Recommend chunking when a file contains multiple distinct instructional sections, conceptual units, or task phases that should be reviewed independently -- Suggest chunk boundaries using existing headings, task transitions, or conceptual breaks -- Prefer semantic chunking over fixed-size chunking -- Flag repeated boilerplate, oversized code blocks, long pasted terminal output, duplicated examples, or verbose configuration that add token cost without improving learning value -- Flag sections where code or output could be shortened to a representative example without losing instructional value -- If a file is large but structurally simple, recommend prose-first review rather than chunking -- Review by exception, not by coverage: do not comment on code, output, or prose that is already clear, correct, and fit for purpose - -### Token-efficiency review priorities - -When identifying content that is expensive for LLM-based review or editing, check for: - -- Long fenced code blocks that are not explained or are only loosely tied to the surrounding task -- Large blocks of terminal output where a short representative excerpt would be enough -- Repeated setup or verification steps across files -- Front matter, boilerplate, or repeated notes that appear unchanged across multiple pages -- Multiple examples that teach the same point with little added value -- Sections that combine too many concepts and would review better as separate chunks - -When these patterns appear, flag them as token-heavy content and explain whether they should be trimmed, condensed, or reviewed separately. - ### Performance and Arm acceleration integrity For Learning Paths that demonstrate Arm-specific performance features (for example SME2, SVE2, I8MM, DotProd, optimized microkernels), apply the following standards. From 83e421e7904f6df4b0897a576fe888f17dc3e6fa Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 26 May 2026 15:52:21 -0500 Subject: [PATCH 007/137] adding a placeholder cdk install guide file --- content/install-guides/aws-cdk.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 content/install-guides/aws-cdk.md diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md new file mode 100644 index 0000000000..a34ca43e84 --- /dev/null +++ b/content/install-guides/aws-cdk.md @@ -0,0 +1,22 @@ +--- +additional_search_terms: +- cloud +- deploy + + +layout: installtoolsall +minutes_to_complete: 15 +author: Anupras Mohapatra +multi_install: false +multitool_install_part: false +official_docs: https://docs.aws.amazon.com/cdk/v2/guide/home.html +test_images: +- ubuntu:latest +test_maintenance: true +title: AWS CDK +tool_install: true +weight: 1 +--- + +The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy Arm-based cloud infrastructure in code. + From 81009a186d829201980c885a05af6255fd32c311 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 26 May 2026 16:01:42 -0500 Subject: [PATCH 008/137] adding some introductory sentences --- content/install-guides/aws-cdk.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index a34ca43e84..fd1ae2abe7 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -13,10 +13,12 @@ official_docs: https://docs.aws.amazon.com/cdk/v2/guide/home.html test_images: - ubuntu:latest test_maintenance: true +draft: true title: AWS CDK tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy Arm-based cloud infrastructure in code. +The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy cloud infrastructure in code. You can use AWS CDK to +In this guide, you'll learn how to install the AWS CDK CLI and build an app that uses. \ No newline at end of file From 8b73be1569cd4bce718947713e936c67edae407b Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 27 May 2026 16:09:20 -0500 Subject: [PATCH 009/137] baseline draft for install guide --- content/install-guides/aws-cdk.md | 57 ++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index fd1ae2abe7..786d603ef1 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -2,8 +2,6 @@ additional_search_terms: - cloud - deploy - - layout: installtoolsall minutes_to_complete: 15 author: Anupras Mohapatra @@ -19,6 +17,57 @@ tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy cloud infrastructure in code. You can use AWS CDK to +The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy cloud infrastructure programmatically. + +In this guide, you'll set up the AWS CDK by installing the CDK CLI and verify that the CLI installation was successful. + +## Before you begin + +Confirm you are using an Arm computer by running: + +```bash { target="ubuntu:latest" } +uname -m +``` + +If you are on Arm Linux the output should be: + +```output +aarch64 +``` + +If you are on macOS with Apple Silicon the output should be: + +```output +arm64 +``` +Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys) and [AWS CLI](/install-guides/aws-cli) install guides. + +You'll also need to install Node.js 22 or later, and prerequisites specific to the programming languages you want to use. For more information about language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. + +## Install the AWS CDK CLI + +Use `npm` to install the AWS CDK CLI: + +```bash +npm install -g aws-cdk +``` + +## Verify the installation + +After installing the CDK CLI, check the version of the AWS CDK CLI that you installed: + +```bash +cdk --version +``` + +The output is similar to: + +```output + +``` +## Next steps + +You've now installed the AWS CDK CLI and verified that the installation was successful. + +Next, you can use the CLI to deploy AWS Graviton-based Amazon EC2 instances. For a walkthrough, see the Learning Path [learning path](). -In this guide, you'll learn how to install the AWS CDK CLI and build an app that uses. \ No newline at end of file From 4ebbb8009e29c24c1b3e8dab81da525ff351fec9 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 27 May 2026 16:52:46 -0500 Subject: [PATCH 010/137] adding output --- content/install-guides/aws-cdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index 786d603ef1..19dfbfb162 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -63,7 +63,7 @@ cdk --version The output is similar to: ```output - +2.1125.0 (build 71fd29e) ``` ## Next steps From 07a1e3b5bc236528ed51208592c293a39ae0b9f4 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 27 May 2026 17:03:42 -0500 Subject: [PATCH 011/137] tweaks --- content/install-guides/aws-cdk.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index 19dfbfb162..04d62fee8c 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -17,7 +17,7 @@ tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy cloud infrastructure programmatically. +The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy cloud infrastructure such as AWS Graviton-based Amazon EC2 instances programmatically. In this guide, you'll set up the AWS CDK by installing the CDK CLI and verify that the CLI installation was successful. @@ -42,7 +42,7 @@ arm64 ``` Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys) and [AWS CLI](/install-guides/aws-cli) install guides. -You'll also need to install Node.js 22 or later, and prerequisites specific to the programming languages you want to use. For more information about language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. +You'll also need to install Node.js 22 or later, and prerequisites specific to the programming languages you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. ## Install the AWS CDK CLI @@ -69,5 +69,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the CLI to deploy AWS Graviton-based Amazon EC2 instances. For a walkthrough, see the Learning Path [learning path](). - +Next, you can use the CLI to deploy AWS Graviton-based Amazon EC2 instances. From bbf1854f8c639bb6543c3a803aea719795ca3f73 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 28 May 2026 09:57:30 -0500 Subject: [PATCH 012/137] replicating some language from other guides --- content/install-guides/aws-cdk.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index 04d62fee8c..f43678db0a 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -40,6 +40,8 @@ If you are on macOS with Apple Silicon the output should be: ```output arm64 ``` +If you see a different result, you are not using an Arm computer running 64-bit Linux. + Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys) and [AWS CLI](/install-guides/aws-cli) install guides. You'll also need to install Node.js 22 or later, and prerequisites specific to the programming languages you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. From 2b47e36476432552616a233aace310808d66865f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 28 May 2026 11:23:01 -0500 Subject: [PATCH 013/137] tweaking section summary guidelines in light of new summary feature --- .github/instructions/learning-paths.instructions.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md index cc2b1dc72b..4f72077d01 100644 --- a/.github/instructions/learning-paths.instructions.md +++ b/.github/instructions/learning-paths.instructions.md @@ -110,8 +110,6 @@ Keep this concise and encouraging. Do not repeat earlier content verbatim. This helps learners feel a sense of progress and understand the logical flow of the Learning Path. -The recap for the last section of the Learning Path might not include a forward-looking transition and might recap the whole Path. - Use 'what you've learned' for conceptual sections and 'what you've accomplished' for task sections. ### Hyperlink guidelines From 8151cbc2c865c4808fdc16ebd8fed4f8358c7870 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 28 May 2026 12:20:24 -0500 Subject: [PATCH 014/137] moving towards skills and creating an AGENTS.md for codex --- .github/agents/arm-content-editor.agent.md | 48 --------------------- .github/skills/arm-content-editor/SKILL.md | 49 ++++++++++++++++++++++ AGENTS.md | 32 ++++++++++++++ 3 files changed, 81 insertions(+), 48 deletions(-) delete mode 100644 .github/agents/arm-content-editor.agent.md create mode 100644 .github/skills/arm-content-editor/SKILL.md create mode 100644 AGENTS.md diff --git a/.github/agents/arm-content-editor.agent.md b/.github/agents/arm-content-editor.agent.md deleted file mode 100644 index c89836af0d..0000000000 --- a/.github/agents/arm-content-editor.agent.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: Arm Content Editor -description: Review and edit Arm Learning Paths and install guides using the repository content guidance, scoped instruction files, and LLM review-efficiency rules. -argument-hint: Select or reference a Learning Path or install guide to review or edit. -tools: ['edit', 'search/codebase', 'search/usages'] -target: vscode ---- - -# Arm Content Editor - -You are an editing assistant for Arm Learning Paths and install guides. Review and edit content after manual changes, with a bias toward focused, high-signal feedback and minimal necessary edits. - -## Load the right guidance - -Use [copilot-instructions.md](../copilot-instructions.md) for project overview, writing style, Arm terminology, formatting, and review-efficiency guidance. - -Use [content-quality.instructions.md](../instructions/content-quality.instructions.md) for shared Learning Path and install guide quality rules. - -Use the content-type guidance that matches the file being reviewed or edited: - -- Learning Paths: [learning-paths.instructions.md](../instructions/learning-paths.instructions.md) -- Install guides: [install-guides.instructions.md](../instructions/install-guides.instructions.md) - -Use [images.instructions.md](../instructions/images.instructions.md) when the task involves adding, editing, reviewing, or fixing Markdown images, screenshots, diagrams, alt text, captions, or `#center` image syntax. - -## Review behavior - -- First identify whether the target is a Learning Path, install guide, or mixed content. -- Review by exception. Do not comment on content that is already clear, correct, and fit for purpose. -- Classify the file as prose-heavy, mixed, or code-heavy when reviewing substantial edits. -- Do not recommend chunking purely because a file is long. Prefer semantic chunk boundaries based on headings, task transitions, or conceptual breaks. -- If a file is code-heavy, prioritize the instructional prose around the code. Comment on code only when it affects correctness, usability, safety, or task success. -- Flag token-heavy content only when it adds cost without improving learning value, such as oversized terminal output, repeated setup, duplicated examples, unexplained code blocks, or repeated boilerplate. -- Explain whether token-heavy content should be trimmed, condensed, or reviewed separately. - -## Editing behavior - -- Make focused edits that preserve the author's intent, repository structure, front matter, Hugo shortcodes, code fences, and command syntax. -- Prefer Arm-native framing and flag x86 assumptions. -- Preserve content-type boundaries: install guides stay limited to installation and verification; Learning Paths own one concrete developer task. -- Keep tone natural and developer-focused. Avoid hype, generic praise, and unnecessary rewrites. -- Verify internal links or state when link verification was not possible. - -## Response format - -For review requests, lead with findings ordered by severity and include file and line references when available. Then add open questions, followed by a brief summary. - -For edit requests, summarize the key changes and note any checks or verification performed. diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md new file mode 100644 index 0000000000..b77d0a63fb --- /dev/null +++ b/.github/skills/arm-content-editor/SKILL.md @@ -0,0 +1,49 @@ +--- +name: arm-content-editor +description: Review and edit Arm Learning Paths and install guides. Use when auditing or improving content quality, metadata descriptions, Arm-specific framing, install guide versus Learning Path scope, Markdown image alt text, stale or token-heavy content, and focused reviewer feedback. +--- + +# Arm content editor + +Use this skill to review or edit Arm Learning Paths and install guides with focused, high-signal feedback and minimal necessary changes. + +Targets are usually selected or referenced Learning Path or install guide files. If the request names a directory, review the files in that content unit together so metadata, terminology, headings, links, and task flow stay consistent. + +## Load guidance + +Start with `AGENTS.md` at the repository root to identify the right source files. + +Read only the guidance needed for the task: + +- Repository-wide guidance: `.github/copilot-instructions.md` +- Shared content quality: `.github/instructions/content-quality.instructions.md` +- Learning Paths: `.github/instructions/learning-paths.instructions.md` +- Install guides: `.github/instructions/install-guides.instructions.md` +- Images, alt text, captions, and `#center` syntax: `.github/instructions/images.instructions.md` + +## Review workflow + +1. Identify whether the target is a Learning Path, install guide, or mixed content. +2. Load the matching scoped guidance. +3. Use repository search when cross-file consistency, links, terminology, or metadata depends on surrounding content. +4. Review by exception. Do not comment on content that is already clear, correct, and fit for purpose. +5. Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. +6. Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. +7. Flag token-heavy content only when it adds cost without improving learning value, such as oversized terminal output, repeated setup, duplicated examples, unexplained code blocks, or repeated boilerplate. + +Do not recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. + +## Editing workflow + +- Make focused edits that preserve the author's intent. +- Preserve front matter, Hugo shortcodes, code fences, command syntax, file structure, and existing technical flow. +- Prefer Arm-native framing and flag x86 assumptions. +- Preserve content-type boundaries: install guides stay limited to installation and verification, while Learning Paths own one concrete developer task. +- Keep tone natural and developer-focused. Avoid hype, generic praise, and unnecessary rewrites. +- Verify internal links before changing them, or state when link verification was not possible. + +## Response format + +For review requests, lead with findings ordered by severity and include file and line references when available. Then add open questions, followed by a brief summary. + +For edit requests, summarize the key changes and note any checks or verification performed. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000000..c48de609d3 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,32 @@ +# Agent instructions + +This repository contains Arm Learning Paths and install guides for learn.arm.com. + +Use this file as a lightweight router for Codex, Copilot, and other coding agents. Do not treat it as the full style guide. Load only the guidance that matches the task. + +## Repository map + +- `content/learning-paths/` contains task-led, end-to-end tutorials. +- `content/install-guides/` contains installation and verification guides. +- `.github/instructions/` contains scoped content guidance. +- `.github/skills/` contains reusable reviewer workflows and task-specific capabilities. + +## Source of truth + +- Repository-wide guidance: `.github/copilot-instructions.md` +- Learning Paths: `.github/instructions/learning-paths.instructions.md` +- Install guides: `.github/instructions/install-guides.instructions.md` +- Shared content quality: `.github/instructions/content-quality.instructions.md` +- Images, alt text, captions, and `#center` syntax: `.github/instructions/images.instructions.md` + +Prefer the narrowest applicable file. Avoid loading every instruction file by default. + +## Reviewer workflows + +Use skills for repeatable workflows such as image audits, metadata description updates, stale-content audits, or structured content-quality checks. + +Current shared skills: + +- `.github/skills/arm-content-editor/SKILL.md` for reviewing and editing Arm Learning Paths and install guides. + +Keep deterministic scans in scripts when possible, and keep long reference material out of always-loaded instructions. From d92595462b0a784875a1496acfc9f6c30f55cf56 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 28 May 2026 14:05:11 -0500 Subject: [PATCH 015/137] draft alt-text check skill --- .github/copilot-instructions.md | 4 +- .github/skills/audit-images/SKILL.md | 105 +++++ .../audit-images/scripts/audit_images.py | 361 ++++++++++++++++++ AGENTS.md | 3 + 4 files changed, 470 insertions(+), 3 deletions(-) create mode 100644 .github/skills/audit-images/SKILL.md create mode 100755 .github/skills/audit-images/scripts/audit_images.py diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index c54f9d9a13..b2d3586068 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -273,6 +273,4 @@ Avoid robotic or generic encouragement phrases such as: Use calm, natural transitions that focus on what happens next. -Also avoid multiple consecutive sentences starting with `This`. Vary sentence structure to maintain natural flow. - -For additional instructions related to images, Learning Paths, Install Guides, and content quality, see [instructions](./instructions/). \ No newline at end of file +Also avoid multiple consecutive sentences starting with `This`. Vary sentence structure to maintain natural flow. \ No newline at end of file diff --git a/.github/skills/audit-images/SKILL.md b/.github/skills/audit-images/SKILL.md new file mode 100644 index 0000000000..478ea39bb5 --- /dev/null +++ b/.github/skills/audit-images/SKILL.md @@ -0,0 +1,105 @@ +--- +name: audit-images +description: Audit and fix Markdown image alt text in Arm Learning Paths and install guides. Use when the user asks to review images, find deficient alt text, count faulty images, run project-level or path-level image audits, track before/after image quality, or update image alt text and captions against repository image guidance. +--- + +# Audit images + +## Description + +Audit Markdown image references in Arm Learning Paths and install guides, report deficient alt text and image syntax, and help fix alt text with useful instructional descriptions. + +Use the script for repeatable inventory and counting. Use assistant judgment for semantic alt-text quality and final edits. + +## Prerequisites + +- Work from the repository root. +- Read `AGENTS.md` to locate shared guidance. +- Read `.github/instructions/images.instructions.md` before editing image alt text. +- When auditing a Learning Path or install guide, also read the matching scoped content guidance. + +## Trigger + +Use this skill when the user asks to: + +- Audit images or alt text. +- Find placeholder, vague, missing, malformed, or duplicated alt text. +- Count faulty images across the project or inside one Path/guide. +- Track image audit counts before and after fixes. +- Fix image alt text, captions, or `#center` syntax. + +## Review levels + +### Project-level review + +Scan all Learning Paths and install guides unless the user gives a narrower scope. + +Use project-level review to: + +- Count total image references and faulty image references. +- Group faults by content unit and issue type. +- Identify high-priority directories or files for cleanup. +- Produce a before/after baseline for tracking progress. + +Do not mass-edit the whole project unless the user explicitly asks. Prefer reporting the project-level inventory and then fixing one Path, guide, category, or batch. + +### Path/guide-level review + +Scan one Learning Path directory, install guide file, or install guide directory. + +Use path/guide-level review to: + +- List each faulty image with file, line, image path, current alt text, caption, and issue type. +- Inspect surrounding Markdown context before changing alt text. +- View local images when visual inspection is needed. +- Fix alt text and syntax in place. +- Re-run the audit and report before/after counts. + +## Workflow + +1. Identify whether the requested scope is project-level or path/guide-level. +2. Run `.github/skills/audit-images/scripts/audit_images.py` on that scope. +3. Record the baseline summary: total images, faulty images, content units affected, and issue counts. +4. For project-level requests, summarize the results and suggest prioritized cleanup batches unless the user asked for edits. +5. For path/guide-level edit requests, inspect the relevant Markdown context and image files. +6. Rewrite deficient alt text using `.github/instructions/images.instructions.md`. +7. Preserve the repository image syntax, especially `![Descriptive alt text#center](image.png "Optional caption")`. +8. Re-run the audit on the same scope. +9. Report before/after counts, files changed, and any remaining issues. + +## Validation rules + +- Treat the script as a detector, not the final authority. It flags likely problems for review. +- Do not replace meaningful alt text only because it is long or short; judge whether it helps the learner complete the task. +- Do not use placeholders such as `alt-txt`, `alt-text`, `image`, `img1`, `screenshot`, `graph`, or `output`. +- Do not use captions as a substitute for alt text. +- Keep `#center` attached directly to the alt text with no space before it. +- Preserve valid local image paths and existing captions unless they are wrong, vague, or outdated. +- Avoid `Figure 1:` style captions unless the content uses explicit numbered cross-references. + +## Error handling + +- If the script reports a missing local image path, verify whether the path is site-root-relative, file-relative, or intentionally external before changing content. +- If an image cannot be inspected, fix only issues that can be resolved from surrounding Markdown context and state the limitation. +- If project-level results are too large to edit safely, report the inventory and recommend a smaller batch. +- If the audit script and visual/context review disagree, explain the judgment and leave a short note in the final response. + +## Script usage + +Run a project-level audit: + +```bash +python3 .github/skills/audit-images/scripts/audit_images.py +``` + +Run a path-level audit: + +```bash +python3 .github/skills/audit-images/scripts/audit_images.py content/learning-paths/servers-and-cloud-computing/example-path +``` + +Write JSON for tracking: + +```bash +python3 .github/skills/audit-images/scripts/audit_images.py --format json --output image-audit.json +``` diff --git a/.github/skills/audit-images/scripts/audit_images.py b/.github/skills/audit-images/scripts/audit_images.py new file mode 100755 index 0000000000..597788c000 --- /dev/null +++ b/.github/skills/audit-images/scripts/audit_images.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 +"""Audit Markdown image alt text in Arm Learning Paths and install guides.""" + +from __future__ import annotations + +import argparse +import csv +import json +import re +from collections import Counter, defaultdict +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Iterable +from urllib.parse import unquote, urlparse + + +IMAGE_RE = re.compile(r"!\[([^\]]*)\]\(([^)\n]+)\)") +PLACEHOLDER_RE = re.compile(r"\b(alt[- ]?txt|alt[- ]?text|example image|placeholder)\b", re.IGNORECASE) +VAGUE_ALT_RE = re.compile( + r"^(img\d*|image\d*|screenshot\d*|screen shot|graph|chart|diagram|figure|photo|" + r"output\d*|aws\d*|gcloud\d*|pulumi|remote|connect|role|buildspec|artifacts)$", + re.IGNORECASE, +) +ALIGNMENT_RE = re.compile(r"#(center|left|right)\b") +URL_RE = re.compile(r"^[a-z][a-z0-9+.-]*://", re.IGNORECASE) + + +@dataclass +class Finding: + file: str + line: int + unit: str + image: str + alt: str + caption: str + issues: list[str] + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Audit Markdown image alt text in Arm Learning Paths and install guides." + ) + parser.add_argument( + "paths", + nargs="*", + default=["content/learning-paths", "content/install-guides"], + help="Markdown files or directories to scan.", + ) + parser.add_argument( + "--format", + choices=["markdown", "json", "csv"], + default="markdown", + help="Output format.", + ) + parser.add_argument("--output", help="Write output to this file.") + parser.add_argument( + "--include-ok", + action="store_true", + help="Include image references with no detected issues in detailed output.", + ) + parser.add_argument( + "--max-alt-words", + type=int, + default=45, + help="Flag alt text longer than this many words.", + ) + parser.add_argument( + "--repo-root", + default=".", + help="Repository root used for resolving local image paths.", + ) + return parser.parse_args() + + +def markdown_files(paths: Iterable[str], repo_root: Path) -> list[Path]: + files: list[Path] = [] + for raw_path in paths: + path = (repo_root / raw_path).resolve() + if path.is_file() and path.suffix == ".md": + files.append(path) + elif path.is_dir(): + files.extend(sorted(path.rglob("*.md"))) + return sorted(dict.fromkeys(files)) + + +def split_target(raw_target: str) -> tuple[str, str]: + target = raw_target.strip() + caption = "" + + title_match = re.search(r'\s+"([^"]*)"\s*$', target) + if title_match: + caption = title_match.group(1).strip() + target = target[: title_match.start()].strip() + + return target, caption + + +def line_number(text: str, offset: int) -> int: + return text.count("\n", 0, offset) + 1 + + +def normalize_alt(alt: str) -> str: + return ALIGNMENT_RE.sub("", alt).strip() + + +def word_count(text: str) -> int: + return len(re.findall(r"[A-Za-z0-9]+(?:[-'][A-Za-z0-9]+)?", text)) + + +def is_placeholder_or_vague(alt: str) -> bool: + normalized = re.sub(r"[^A-Za-z0-9 -]+", "", alt).strip() + normalized = re.sub(r"\s+", " ", normalized) + return bool(PLACEHOLDER_RE.search(alt) or VAGUE_ALT_RE.match(normalized)) + + +def is_url_or_anchor(target: str) -> bool: + return bool(URL_RE.match(target)) or target.startswith("#") + + +def strip_url_bits(target: str) -> str: + parsed = urlparse(target) + if parsed.scheme: + return target + return unquote(target.split("#", 1)[0].split("?", 1)[0]) + + +def resolve_local_image(target: str, md_file: Path, repo_root: Path) -> Path | None: + if is_url_or_anchor(target): + return None + + clean_target = strip_url_bits(target) + if not clean_target: + return None + + if clean_target.startswith("/"): + site_path = clean_target.lstrip("/") + if site_path.startswith(("learning-paths/", "install-guides/")): + return repo_root / "content" / site_path + return repo_root / site_path + + return md_file.parent / clean_target + + +def content_unit(md_file: Path, repo_root: Path) -> str: + rel = md_file.relative_to(repo_root).as_posix() + parts = rel.split("/") + + if parts[:2] == ["content", "learning-paths"] and len(parts) >= 4: + return "/".join(parts[:4]) + + if parts[:2] == ["content", "install-guides"]: + return rel + + return str(Path(rel).parent) + + +def detect_issues( + alt: str, + caption: str, + target: str, + md_file: Path, + repo_root: Path, + max_alt_words: int, +) -> list[str]: + issues: list[str] = [] + normalized = normalize_alt(alt) + normalized_words = word_count(normalized) + + if not alt.strip(): + issues.append("missing_alt") + + if alt.strip().startswith(('"', "'")) or alt.strip().endswith(('"', "'")): + issues.append("quoted_alt") + + if re.search(r"\s+#(center|left|right)\b", alt): + issues.append("alignment_not_attached") + + if "#center" not in alt: + issues.append("missing_center_alignment") + + if is_placeholder_or_vague(normalized): + issues.append("placeholder_or_vague_alt") + + if normalized and normalized_words < 4: + issues.append("too_short_alt") + + if normalized_words > max_alt_words: + issues.append("overlong_alt") + + if caption and re.match(r"Figure\s+\d+\s*:", caption, re.IGNORECASE): + issues.append("figure_number_caption") + + if caption and normalized_words <= 2 and word_count(caption) >= 4: + issues.append("caption_substitutes_for_alt") + + local_image = resolve_local_image(target, md_file, repo_root) + if local_image is not None and not local_image.exists(): + issues.append("missing_local_image") + + return issues + + +def audit_file(md_file: Path, repo_root: Path, max_alt_words: int) -> list[Finding]: + text = md_file.read_text(encoding="utf-8") + unit = content_unit(md_file, repo_root) + findings: list[Finding] = [] + + for match in IMAGE_RE.finditer(text): + raw_alt = match.group(1) + target, caption = split_target(match.group(2)) + issues = detect_issues(raw_alt, caption, target, md_file, repo_root, max_alt_words) + findings.append( + Finding( + file=md_file.relative_to(repo_root).as_posix(), + line=line_number(text, match.start()), + unit=unit, + image=target, + alt=raw_alt, + caption=caption, + issues=issues, + ) + ) + + duplicate_counts = Counter( + normalize_alt(item.alt).lower() + for item in findings + if normalize_alt(item.alt) and not is_placeholder_or_vague(normalize_alt(item.alt)) + ) + for item in findings: + normalized = normalize_alt(item.alt).lower() + if normalized and duplicate_counts[normalized] > 1: + item.issues.append("duplicate_alt_in_file") + + return findings + + +def summarize(findings: list[Finding], files_scanned: int) -> dict: + faulty = [item for item in findings if item.issues] + issue_counts = Counter(issue for item in faulty for issue in item.issues) + unit_counts: dict[str, Counter] = defaultdict(Counter) + + for item in findings: + unit_counts[item.unit]["total"] += 1 + if item.issues: + unit_counts[item.unit]["faulty"] += 1 + + units = [ + {"unit": unit, "total": counts["total"], "faulty": counts["faulty"]} + for unit, counts in sorted(unit_counts.items()) + ] + units.sort(key=lambda row: (-row["faulty"], row["unit"])) + + return { + "files_scanned": files_scanned, + "images_found": len(findings), + "faulty_images": len(faulty), + "issue_counts": dict(sorted(issue_counts.items())), + "units": units, + } + + +def markdown_output(findings: list[Finding], summary: dict, include_ok: bool) -> str: + rows = [item for item in findings if include_ok or item.issues] + lines = [ + "# Image audit", + "", + f"- Markdown files scanned: {summary['files_scanned']}", + f"- Images found: {summary['images_found']}", + f"- Faulty images: {summary['faulty_images']}", + "", + "## Issue counts", + "", + ] + + if summary["issue_counts"]: + for issue, count in summary["issue_counts"].items(): + lines.append(f"- `{issue}`: {count}") + else: + lines.append("- No issues detected") + + lines.extend(["", "## Content units", ""]) + lines.append("| Unit | Faulty | Total |") + lines.append("|---|---:|---:|") + for row in summary["units"]: + if row["faulty"] or include_ok: + lines.append(f"| `{row['unit']}` | {row['faulty']} | {row['total']} |") + + lines.extend(["", "## Findings", ""]) + if not rows: + lines.append("No findings to report.") + return "\n".join(lines) + "\n" + + lines.append("| File | Line | Image | Alt text | Caption | Issues |") + lines.append("|---|---:|---|---|---|---|") + for item in rows: + issues = ", ".join(f"`{issue}`" for issue in item.issues) or "OK" + lines.append( + "| " + f"`{item.file}` | {item.line} | `{item.image}` | " + f"{escape_table(item.alt)} | {escape_table(item.caption)} | {issues} |" + ) + + return "\n".join(lines) + "\n" + + +def escape_table(value: str) -> str: + escaped = value.replace("|", r"\|").replace("\n", " ") + return escaped if escaped else "" + + +def json_output(findings: list[Finding], summary: dict, include_ok: bool) -> str: + rows = [item for item in findings if include_ok or item.issues] + return json.dumps( + {"summary": summary, "findings": [asdict(item) for item in rows]}, + indent=2, + sort_keys=True, + ) + "\n" + + +def csv_output(findings: list[Finding], include_ok: bool) -> str: + from io import StringIO + + rows = [item for item in findings if include_ok or item.issues] + output = StringIO() + writer = csv.writer(output) + writer.writerow(["file", "line", "unit", "image", "alt", "caption", "issues"]) + for item in rows: + writer.writerow( + [item.file, item.line, item.unit, item.image, item.alt, item.caption, ";".join(item.issues)] + ) + return output.getvalue() + + +def main() -> int: + args = parse_args() + repo_root = Path(args.repo_root).resolve() + files = markdown_files(args.paths, repo_root) + findings: list[Finding] = [] + + for md_file in files: + findings.extend(audit_file(md_file, repo_root, args.max_alt_words)) + + summary = summarize(findings, len(files)) + + if args.format == "json": + output = json_output(findings, summary, args.include_ok) + elif args.format == "csv": + output = csv_output(findings, args.include_ok) + else: + output = markdown_output(findings, summary, args.include_ok) + + if args.output: + Path(args.output).write_text(output, encoding="utf-8") + else: + print(output, end="") + + return 1 if summary["faulty_images"] else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/AGENTS.md b/AGENTS.md index c48de609d3..8282702b54 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -28,5 +28,8 @@ Use skills for repeatable workflows such as image audits, metadata description u Current shared skills: - `.github/skills/arm-content-editor/SKILL.md` for reviewing and editing Arm Learning Paths and install guides. +- `.github/skills/audit-images/SKILL.md` for auditing Markdown image references, deficient alt text, captions, alignment syntax, and before/after image quality counts. Keep deterministic scans in scripts when possible, and keep long reference material out of always-loaded instructions. + +When creating new skills, prefer a structured `SKILL.md` with concise sections such as description, prerequisites, trigger, workflow, validation rules, and error handling. Keep the workflow explicit enough to be repeatable without turning the skill into a full style guide. From 1fb11b419786413ce459afa0db2fd6e066946183 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 28 May 2026 16:12:25 -0500 Subject: [PATCH 016/137] adding more explanation --- content/install-guides/aws-cdk.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index f43678db0a..40482e3826 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -13,13 +13,16 @@ test_images: test_maintenance: true draft: true title: AWS CDK +description: Install the AWS CDK CLI on Arm Linux and macOS using npm, then verify the setup with the `cdk` command. tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy cloud infrastructure such as AWS Graviton-based Amazon EC2 instances programmatically. +The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. -In this guide, you'll set up the AWS CDK by installing the CDK CLI and verify that the CLI installation was successful. +With the CDK, you can write applications in a supported programming language of your choice. You can then use the AWS CDK CLI to translate the code into an AWS CloudFormation template and deploy to the cloud. + +The CDK CLI supports different operating systems and the Arm architecture. In this guide, you'll learn how to install the CDK CLI and verify that the CLI installation was successful. ## Before you begin @@ -40,11 +43,11 @@ If you are on macOS with Apple Silicon the output should be: ```output arm64 ``` -If you see a different result, you are not using an Arm computer running 64-bit Linux. +If you see a different result, you are not using an Arm computer. Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys) and [AWS CLI](/install-guides/aws-cli) install guides. -You'll also need to install Node.js 22 or later, and prerequisites specific to the programming languages you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. +To install AWS CDK CLI, you'll need Node.js 22 or later. You'll also need to install prerequisites specific to the programming languages you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. ## Install the AWS CDK CLI @@ -56,7 +59,7 @@ npm install -g aws-cdk ## Verify the installation -After installing the CDK CLI, check the version of the AWS CDK CLI that you installed: +After installing the AWS CDK CLI, check the version of the CLI: ```bash cdk --version @@ -71,4 +74,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the CLI to deploy AWS Graviton-based Amazon EC2 instances. +Next, you can use the CDK CLI to create an application and deploy it to AWS. From 95423363daf69f2557d75738217eaf856ed1cb44 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 28 May 2026 16:49:28 -0500 Subject: [PATCH 017/137] create a skeleton for aws cdk learning path --- .../aws-cdk/_index.md | 54 +++++++++++++++++++ .../aws-cdk/_next-steps.md | 8 +++ .../aws-cdk/app.md | 6 +++ .../aws-cdk/cdk.md | 6 +++ 4 files changed, 74 insertions(+) create mode 100644 content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/aws-cdk/_next-steps.md create mode 100644 content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md create mode 100644 content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md new file mode 100644 index 0000000000..be73a50508 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -0,0 +1,54 @@ +--- +title: Deploy applications on Arm servers using the AWS CDK +description: Learn how to define and deploy AWS infrastructure for Arm-based applications using the AWS Cloud Development Kit. + +minutes_to_complete: 45 + +who_is_this_for: This is an introductory topic for software developers who want to use the AWS Cloud Development Kit to deploy applications on Arm-based AWS infrastructure. + +learning_objectives: + - Create an example AWS CDK application + - Define AWS infrastructure using the AWS CDK + - Deploy application resources on Arm-based AWS infrastructure + +prerequisites: + - An Amazon Web Services (AWS) account + - A local computer with the AWS CLI, AWS CDK CLI, and Node.js installed + - Familiarity with the Linux command line + +author: Anupras Mohapatra + +### Tags +skilllevels: Introductory +subjects: Containers and Virtualization +cloud_service_providers: + - AWS +armips: + - Neoverse +operatingsystems: + - Linux +tools_software_languages: + - AWS CDK + - AWS CLI + - Node.js + +further_reading: + - resource: + title: AWS CDK Developer Guide + link: https://docs.aws.amazon.com/cdk/v2/guide/home.html + type: documentation + - resource: + title: AWS CDK CLI install guide + link: /install-guides/aws-cdk/ + type: install-guide + - resource: + title: AWS CLI install guide + link: /install-guides/aws-cli/ + type: install-guide + +### FIXED, DO NOT MODIFY +# ================================================================================ +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md new file mode 100644 index 0000000000..bb65e39ddd --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -0,0 +1,6 @@ +--- +title: "Create an example AWS CDK application" +weight: 2 + +layout: "learningpathall" +--- diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md new file mode 100644 index 0000000000..8952e6fd53 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -0,0 +1,6 @@ +--- +title: "Deploy with the AWS CDK" +weight: 3 + +layout: "learningpathall" +--- From 1c8d617167c8d16364d7844ffa7e5bd2740fa6be Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 29 May 2026 11:38:58 -0500 Subject: [PATCH 018/137] adding steps for creating a cdk project/app and a skeleton for synthesis and deployment --- .../aws-cdk/_index.md | 8 +- .../aws-cdk/app.md | 115 ++++++++++++++++++ .../aws-cdk/cdk.md | 33 ++++- 3 files changed, 153 insertions(+), 3 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index be73a50508..e4ade87b12 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -2,19 +2,23 @@ title: Deploy applications on Arm servers using the AWS CDK description: Learn how to define and deploy AWS infrastructure for Arm-based applications using the AWS Cloud Development Kit. +draft: true +cascade: + draft: true + minutes_to_complete: 45 who_is_this_for: This is an introductory topic for software developers who want to use the AWS Cloud Development Kit to deploy applications on Arm-based AWS infrastructure. learning_objectives: - - Create an example AWS CDK application + - Create an example AWS CDK application in JavaScript - Define AWS infrastructure using the AWS CDK - Deploy application resources on Arm-based AWS infrastructure prerequisites: - An Amazon Web Services (AWS) account - A local computer with the AWS CLI, AWS CDK CLI, and Node.js installed - - Familiarity with the Linux command line + - Familiarity with the Linux command line and JavaScript author: Anupras Mohapatra diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index bb65e39ddd..3dd9663868 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -4,3 +4,118 @@ weight: 2 layout: "learningpathall" --- + +## Set up a sample AWS CDK application + +The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. + +To deploy an application using the CDK, you'll create the application in a supported programming language. You'll then use the CDK CLI to synthesize the application to an AWS CloudFormation template that's deploys resources on AWS. + +### Before you begin + +Make sure that you've completed all prerequisite steps and installed the AWS CDK CLI. For more information, see the [AWS CDK install guide](/install-guides/aws-cdk). + +### Initialize a CDK project + +In this Learning Path, you'll use Amazon Elastic Container Service (ECS) to deploy containers on AWS Graviton-based Amazon EC2 instances. + +Create a directory for your CDK project and navigate to it: + +```bash +mkdir arm-cdk-app +cd arm-cdk-app/ +``` + +After navigating into the project directory, initialize a JavaScript CDK project: + +```bash +cdk init --language javascript +``` + +The output is similar to: + +```output +Applying project template app for javascript +# Welcome to your CDK JavaScript project + +This is a blank project for CDK development with JavaScript. + +The `cdk.json` file tells the CDK Toolkit how to execute your app. The build step is not required when using JavaScript. + +## Useful commands + +* `npm run test` perform the jest unit tests +* `npx cdk deploy` deploy this stack to your default AWS account/region +* `npx cdk diff` compare deployed stack with current state +* `npx cdk synth` emits the synthesized CloudFormation template + +... +``` + +### Use the AWS CDK with JavaScript to define a sample application + +In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib ` directory. This stack definition is what AWS CDK uses to deploy resources. + +Update `lib/arm-cdk-app-stack.js` with the following: + +```javascript +const cdk = require('aws-cdk-lib'); +const ec2 = require('aws-cdk-lib/aws-ec2'); +const ecs = require('aws-cdk-lib/aws-ecs'); +const ecsPatterns = require('aws-cdk-lib/aws-ecs-patterns'); + +class ArmCdkAppStack extends cdk.Stack { + constructor(scope, id, props) { + super(scope, id, props); + + //creates a VPC + const vpc = new ec2.Vpc(this, 'Vpc', { + maxAzs: 2, + }); + + //creates a cluster + const cluster = new ecs.Cluster(this, 'Cluster', { + vpc, + }); + + //adds Graviton-based c6g.large instance to the cluster + cluster.addCapacity('GravitonCapacity', { + minCapacity: 1, + desiredCapacity: 1, + instanceType: new ec2.InstanceType('c6g.large'), + machineImage: ecs.EcsOptimizedImage.amazonLinux2(ecs.AmiHardwareType.ARM), + }); + + //creates a task definition + const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef'); + + //adds container to task definition that uses a hello-world container image + const container = taskDefinition.addContainer('DefaultContainer', { + image: ecs.ContainerImage.fromRegistry('hello-world'), + memoryLimitMiB: 512, + }); + + container.addPortMappings({ + containerPort: 80, + }); + + //deploys a load balanced service with one instantiation of the containerized app + new ecsPatterns.ApplicationLoadBalancedEc2Service(this, 'Service', { + cluster, + taskDefinition, + desiredCount: 1, + publicLoadBalancer: true, + }); + } +} + +module.exports = { ArmCdkAppStack }; +``` + +The application uses Amazon ECS to deploy a `hello-world` container image on an AWS Graviton-based `c6g.large` instance. + +## What you've accomplished and what's next + +You've now set up a sample application using AWS CDK. + +Next, you'll use AWS CDK to synthesize and deploy the application. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 8952e6fd53..e3933288db 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -1,6 +1,37 @@ --- -title: "Deploy with the AWS CDK" +title: "Deploy the example AWS CDK application" weight: 3 layout: "learningpathall" --- + +## Synthesize the AWS CDK application + +After creating an application using AWS CDK, you'll need to synthesize it: + +```bash +cdk synth +``` +This step checks for errors in the application code and then translates the code into an AWS CloudFormation template. + +You can find the generated JSON template at `cdk.out/ArmCdkAppStack.template.json`. + +## Deploy the CDK stack + +After completing synthesis, you're ready to deploy the application. AWS CDK will deploy the application through the generated AWS CloudFormation stack. + +Deploy the application: + +```bash +cdk deploy +``` + +The output is similar to: + +```output + +``` + +## Validate the deployment + +## What you've accomplished From 651d30b3699b91230898898bc62b50983db398a0 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 29 May 2026 16:39:23 -0500 Subject: [PATCH 019/137] removing the uname steps because they're not relevant for this --- content/install-guides/aws-cdk.md | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index 40482e3826..106fea8c51 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -26,25 +26,6 @@ The CDK CLI supports different operating systems and the Arm architecture. In th ## Before you begin -Confirm you are using an Arm computer by running: - -```bash { target="ubuntu:latest" } -uname -m -``` - -If you are on Arm Linux the output should be: - -```output -aarch64 -``` - -If you are on macOS with Apple Silicon the output should be: - -```output -arm64 -``` -If you see a different result, you are not using an Arm computer. - Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys) and [AWS CLI](/install-guides/aws-cli) install guides. To install AWS CDK CLI, you'll need Node.js 22 or later. You'll also need to install prerequisites specific to the programming languages you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. From c6e8259f93340310423e4781b31dea28c599469b Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 29 May 2026 16:54:57 -0500 Subject: [PATCH 020/137] adding a placeholder section summary --- content/install-guides/aws-cdk.md | 2 +- .../learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index 106fea8c51..cb906b7202 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -55,4 +55,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the CDK CLI to create an application and deploy it to AWS. +Next, you can use the AWS CDK to create an application and deploy it to AWS. diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index e3933288db..2c2e947717 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -35,3 +35,7 @@ The output is similar to: ## Validate the deployment ## What you've accomplished + +You've now synthesized and deployed a sample application using Amazon ECS and the AWS CDK. + +You can use this workflow to programmatically deploy and manage containerized applications on AWS Graviton-based compute. \ No newline at end of file From aa391db51c18939af097cb33ff8b08b3bc1e4826 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 1 Jun 2026 11:37:50 -0500 Subject: [PATCH 021/137] updating app to be simpler and to use Fargate --- content/install-guides/aws-cdk.md | 2 +- .../aws-cdk/app.md | 51 +++++-------------- .../aws-cdk/cdk.md | 11 +++- 3 files changed, 24 insertions(+), 40 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index cb906b7202..ed620642b7 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -18,7 +18,7 @@ tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. +The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. With the CDK, you can write applications in a supported programming language of your choice. You can then use the AWS CDK CLI to translate the code into an AWS CloudFormation template and deploy to the cloud. diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 3dd9663868..856a3c4143 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -7,7 +7,7 @@ layout: "learningpathall" ## Set up a sample AWS CDK application -The AWS Cloud Development Kit (CDK) is an open-source software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. +The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. To deploy an application using the CDK, you'll create the application in a supported programming language. You'll then use the CDK CLI to synthesize the application to an AWS CloudFormation template that's deploys resources on AWS. @@ -60,50 +60,25 @@ Update `lib/arm-cdk-app-stack.js` with the following: ```javascript const cdk = require('aws-cdk-lib'); -const ec2 = require('aws-cdk-lib/aws-ec2'); const ecs = require('aws-cdk-lib/aws-ecs'); const ecsPatterns = require('aws-cdk-lib/aws-ecs-patterns'); +const ecrAssets = require('aws-cdk-lib/aws-ecr-assets'); class ArmCdkAppStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); - - //creates a VPC - const vpc = new ec2.Vpc(this, 'Vpc', { - maxAzs: 2, - }); - - //creates a cluster - const cluster = new ecs.Cluster(this, 'Cluster', { - vpc, - }); - - //adds Graviton-based c6g.large instance to the cluster - cluster.addCapacity('GravitonCapacity', { - minCapacity: 1, - desiredCapacity: 1, - instanceType: new ec2.InstanceType('c6g.large'), - machineImage: ecs.EcsOptimizedImage.amazonLinux2(ecs.AmiHardwareType.ARM), - }); - - //creates a task definition - const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef'); - //adds container to task definition that uses a hello-world container image - const container = taskDefinition.addContainer('DefaultContainer', { - image: ecs.ContainerImage.fromRegistry('hello-world'), + new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', { + taskImageOptions: { + image: ecs.ContainerImage.fromRegistry("nginx:latest"), + containerPort: 8080, + }, + runtimePlatform: { + cpuArchitecture: ecs.CpuArchitecture.ARM64, + operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, + }, + cpu: 256, memoryLimitMiB: 512, - }); - - container.addPortMappings({ - containerPort: 80, - }); - - //deploys a load balanced service with one instantiation of the containerized app - new ecsPatterns.ApplicationLoadBalancedEc2Service(this, 'Service', { - cluster, - taskDefinition, - desiredCount: 1, publicLoadBalancer: true, }); } @@ -112,7 +87,7 @@ class ArmCdkAppStack extends cdk.Stack { module.exports = { ArmCdkAppStack }; ``` -The application uses Amazon ECS to deploy a `hello-world` container image on an AWS Graviton-based `c6g.large` instance. +The application defines a load balanced Fargate service that runs an nginx web server on an Arm-based platform. ## What you've accomplished and what's next diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 2c2e947717..829a67800c 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -34,8 +34,17 @@ The output is similar to: ## Validate the deployment + +## Clean up resources + +After you've validated the deployment, clean up the AWS resources that you created with AWS CDK: + +```bash +cdk destroy +``` + ## What you've accomplished -You've now synthesized and deployed a sample application using Amazon ECS and the AWS CDK. +You've now synthesized and deployed a sample application using Amazon ECS and the AWS CDK that runs on an Arm platform. After validating deployment, you cleaned up resources. You can use this workflow to programmatically deploy and manage containerized applications on AWS Graviton-based compute. \ No newline at end of file From 053aba46b3bd8446a73581571ed5b9b1bf1ac267 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 1 Jun 2026 11:42:57 -0500 Subject: [PATCH 022/137] placeholder for validating deployment --- .../learning-paths/servers-and-cloud-computing/aws-cdk/app.md | 2 +- .../learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 856a3c4143..10c14fd413 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -17,7 +17,7 @@ Make sure that you've completed all prerequisite steps and installed the AWS CDK ### Initialize a CDK project -In this Learning Path, you'll use Amazon Elastic Container Service (ECS) to deploy containers on AWS Graviton-based Amazon EC2 instances. +In this Learning Path, you'll use Amazon Elastic Container Service (ECS) to deploy containers on AWS Graviton-based compute. Create a directory for your CDK project and navigate to it: diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 829a67800c..bd36987c01 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -34,6 +34,9 @@ The output is similar to: ## Validate the deployment +Paste the URL from the deployment output into a web browser of your choice. + +The output is similar to: ## Clean up resources From 392eb3b43740d28e2f06655a9cb6277ba2a5138a Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Mon, 1 Jun 2026 16:48:14 -0500 Subject: [PATCH 023/137] CLS improvements --- assets/css/cross-page.css | 81 +++++++++---------- assets/css/home.css | 26 ++++++ assets/css/list-pages.css | 19 +++++ .../layouts/index.html | 4 +- .../layouts/partials/head/head.html | 6 +- 5 files changed, 87 insertions(+), 49 deletions(-) diff --git a/assets/css/cross-page.css b/assets/css/cross-page.css index bdce13fe69..24ad075ad5 100644 --- a/assets/css/cross-page.css +++ b/assets/css/cross-page.css @@ -12,60 +12,35 @@ /* UNIVERSAL FONTS */ /****************************************************/ -/* Ignored for now, adding in head.html via google fonts. Can use this locally to optimize if needed */ - - -/* Lato font get from local fonts folder, not fonts.google.com as it loads facebook/youtube tracking data */ - /* Normal, Italic, Bold - 300, 400, 500 */ - -/* +/* Lato font self-hosted from /fonts/ to avoid external requests and reduce CLS */ @font-face { font-family: 'Lato'; font-style: normal; font-weight: 300; - src: url('../fonts/LatoLatin-Light.woff2') format('woff2'), - url('../fonts/LatoLatin-Light.ttf') format('ttf'); - } - - @font-face { + font-display: swap; + src: url('/fonts/LatoLatin-Light.woff2') format('woff2'); +} +@font-face { font-family: 'Lato'; font-style: normal; font-weight: 400; - src: url('../fonts/LatoLatin-Regular.woff2') format('woff2'), - url('../fonts/LatoLatin-Regular.ttf') format('ttf'); - } - - @font-face { - font-family: 'Lato'; - font-style: normal; - font-weight: 500; - src: url('../fonts/LatoLatin-Medium.woff2') format('woff2'), - url('../fonts/LatoLatin-Medium.ttf') format('ttf'); - } - + font-display: swap; + src: url('/fonts/LatoLatin-Regular.woff2') format('woff2'); +} @font-face { font-family: 'Lato'; font-style: italic; font-weight: 300; - src: url('../fonts/LatoLatin-LightItalic.woff2') format('woff2'), - url('../fonts/LatoLatin-LightItalic.ttf') format('ttf'); - } - @font-face { + font-display: swap; + src: url('/fonts/LatoLatin-LightItalic.woff2') format('woff2'); +} +@font-face { font-family: 'Lato'; font-style: italic; font-weight: 400; - src: url('../fonts/LatoLatin-Italic.woff2') format('woff2'), - url('../fonts/LatoLatin-Italic.ttf') format('ttf'); - } - @font-face { - font-family: 'Lato'; - font-style: italic; - font-weight: 500; - src: url('../fonts/LatoLatin-MediumItalic.woff2') format('woff2'), - url('../fonts/LatoLatin-MediumItalic.ttf') format('ttf'); - } -*/ + font-display: swap; + src: url('/fonts/LatoLatin-Italic.woff2') format('woff2'); +} /* UNIVERSAL */ @@ -183,17 +158,31 @@ table tbody td { +/* CLS fix: reserve space for nav before hydration */ +arm-top-navigation:not(:defined) { + display: block; + min-height: 80px; +} +@media (max-width: 1024px) { + arm-top-navigation:not(:defined) { + min-height: 60px; + } +} + /* Fix global nav height */ +/* The arm-global-web-components script renders a position:fixed nav (0 flow space) + and may inject a 50px sub-navigation bar in flow */ /*************************************/ #global-nav-height-fixer { max-width: 100vw; - min-height: 80px; + height: 80px; + overflow: hidden; position: relative; top: 0; } @media (max-width: 1024px) { /* smaller screens than LG */ #global-nav-height-fixer { - min-height: 60px; + height: 60px; } } .nav-transparent { @@ -453,3 +442,11 @@ html[theme='light'] body { ads-masthead { --ads-masthead-horizontal-padding: 5px; } } +/* CLS fix: reserve space for arm-footer before hydration */ +arm-footer-navigation:not(:defined) { + display: block; + min-height: 300px; +} +#arm-footer { + contain: layout; +} diff --git a/assets/css/home.css b/assets/css/home.css index cfc9670351..842872d96f 100644 --- a/assets/css/home.css +++ b/assets/css/home.css @@ -1,6 +1,32 @@ +/* CLS fix: reserve space for web components before hydration */ +ads-search:not(:defined) { + display: block; + min-height: 45px; +} +ads-cta-button:not(:defined) { + display: inline-block; + min-height: 40px; + min-width: 200px; +} +ads-breadcrumbs:not(:defined) { + display: block; + min-height: 32px; +} + +/* CLS fix: lock the breadcrumb masthead height so hydration doesn't shift content below */ +#only-breadcrumb-masthead { + height: 40px; + overflow: hidden; +} + +/* CLS fix: lock the description+button area height to prevent shift when ads-cta-button hydrates */ +.homepage-top-desc { + min-height: 110px; +} + /********************************************************************* Main Topic Cards diff --git a/assets/css/list-pages.css b/assets/css/list-pages.css index b98dbe7cdb..62bb8f6ccd 100644 --- a/assets/css/list-pages.css +++ b/assets/css/list-pages.css @@ -7,6 +7,25 @@ Covers the following pages: +/* CLS fix: reserve space for web components before hydration +*******************************************************************/ +ads-card:not(:defined) { + display: block; + min-height: 180px; +} +ads-search:not(:defined) { + display: block; + min-height: 45px; +} +ads-expansion-panel:not(:defined) { + display: block; + min-height: 48px; +} +ads-masthead:not(:defined) { + display: block; + min-height: 100px; +} + /* Search / Status bar for active filters, # displayed, and sorting *******************************************************************/ #result-sort-div { diff --git a/themes/arm-design-system-hugo-theme/layouts/index.html b/themes/arm-design-system-hugo-theme/layouts/index.html index 7dd4fdd9f4..f81c1fc29b 100644 --- a/themes/arm-design-system-hugo-theme/layouts/index.html +++ b/themes/arm-design-system-hugo-theme/layouts/index.html @@ -65,7 +65,7 @@

Arm Learning Paths

- +

{{ replace .Title "and" "&" }}

@@ -79,7 +79,7 @@

{{ replace .Ti
- +

AI

diff --git a/themes/arm-design-system-hugo-theme/layouts/partials/head/head.html b/themes/arm-design-system-hugo-theme/layouts/partials/head/head.html index 6969f026b3..e6b24dd365 100644 --- a/themes/arm-design-system-hugo-theme/layouts/partials/head/head.html +++ b/themes/arm-design-system-hugo-theme/layouts/partials/head/head.html @@ -39,11 +39,7 @@ {{ partial "head/jsonld.html" . }} - - - - - + From 4099ede5e36af16a3f4a602ab1adac5b3be428a2 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 5 Jun 2026 16:30:22 -0500 Subject: [PATCH 024/137] resolving conflict --- assets/contributors.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/assets/contributors.csv b/assets/contributors.csv index 0dee5589bd..605837f5d6 100644 --- a/assets/contributors.csv +++ b/assets/contributors.csv @@ -125,3 +125,4 @@ Akash Malik,Arm,akashmalik19973,akash-malik-a65bab219,, Matt Cossins,Arm,matt-cossins,,, Sue Wu,Arm,,,, Sabika Tasneem,Memgraph,,,, +Anupras Mohapatra,Arm,,https://www.linkedin.com/in/~anupras,, \ No newline at end of file From 81d7dc37c94c6a619f27f9c0773a3b5d70c6833f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 5 Jun 2026 16:49:35 -0500 Subject: [PATCH 025/137] adding a more concrete next step linking iinstall guide to lp --- content/install-guides/aws-cdk.md | 2 +- .../servers-and-cloud-computing/aws-cdk/_index.md | 2 +- .../servers-and-cloud-computing/aws-cdk/app.md | 4 ++-- .../servers-and-cloud-computing/aws-cdk/cdk.md | 6 ++++++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index ed620642b7..6171389efc 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -55,4 +55,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the AWS CDK to create an application and deploy it to AWS. +Next, you can use the AWS CDK to create and deploy applications on Arm-based AWS infrastructure. To learn how you can use the CDK and Amazon ECS to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](earning-paths/servers-and-cloud-computing/aws-cdk/) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index e4ade87b12..1baee86a73 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -1,5 +1,5 @@ --- -title: Deploy applications on Arm servers using the AWS CDK +title: Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK description: Learn how to define and deploy AWS infrastructure for Arm-based applications using the AWS Cloud Development Kit. draft: true diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 10c14fd413..db77710049 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -54,7 +54,7 @@ The `cdk.json` file tells the CDK Toolkit how to execute your app. The build ste ### Use the AWS CDK with JavaScript to define a sample application -In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib ` directory. This stack definition is what AWS CDK uses to deploy resources. +In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib ` directory. This stack definition is what the AWS CDK uses to deploy resources. Update `lib/arm-cdk-app-stack.js` with the following: @@ -87,7 +87,7 @@ class ArmCdkAppStack extends cdk.Stack { module.exports = { ArmCdkAppStack }; ``` -The application defines a load balanced Fargate service that runs an nginx web server on an Arm-based platform. +The application defines a load balanced Fargate service that runs an NGINX web server on an Arm-based platform. ## What you've accomplished and what's next diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index bd36987c01..88fb863bb9 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -36,8 +36,14 @@ The output is similar to: Paste the URL from the deployment output into a web browser of your choice. +```text + +``` + The output is similar to: + + ## Clean up resources After you've validated the deployment, clean up the AWS resources that you created with AWS CDK: From fb9d2cb9286469d856737d4e2f77aef6ea32f399 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 5 Jun 2026 16:51:43 -0500 Subject: [PATCH 026/137] removing LI link --- assets/contributors.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/contributors.csv b/assets/contributors.csv index 605837f5d6..f7fc991655 100644 --- a/assets/contributors.csv +++ b/assets/contributors.csv @@ -125,4 +125,4 @@ Akash Malik,Arm,akashmalik19973,akash-malik-a65bab219,, Matt Cossins,Arm,matt-cossins,,, Sue Wu,Arm,,,, Sabika Tasneem,Memgraph,,,, -Anupras Mohapatra,Arm,,https://www.linkedin.com/in/~anupras,, \ No newline at end of file +Anupras Mohapatra,Arm,,,, \ No newline at end of file From 66d3a85f66ec1e5cbd847ee29ebe79cd22e0f3e3 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 8 Jun 2026 09:59:54 -0500 Subject: [PATCH 027/137] edit --- content/install-guides/aws-cdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index 6171389efc..78716f6009 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -55,4 +55,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the AWS CDK to create and deploy applications on Arm-based AWS infrastructure. To learn how you can use the CDK and Amazon ECS to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](earning-paths/servers-and-cloud-computing/aws-cdk/) +Next, you can use the AWS CDK to create and deploy applications on Arm-based AWS infrastructure. To learn how you can use the CDK and Amazon ECS to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](earning-paths/servers-and-cloud-computing/aws-cdk/). From 82d27b363ec743e62a2a02d23a9ad5f3c3259294 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 8 Jun 2026 17:32:49 -0500 Subject: [PATCH 028/137] adding some tentative new skills --- .github/copilot-instructions.md | 36 ++--------- .github/skills/arm-content-editor/SKILL.md | 5 +- .github/skills/audit-images/SKILL.md | 4 +- .../references/image-guidance.md} | 15 ++--- .github/skills/code-sample-review/SKILL.md | 64 +++++++++++++++++++ .../references/code-sample-guidance.md | 47 ++++++++++++++ .../skills/intake-metadata-update/SKILL.md | 30 +++++++++ AGENTS.md | 4 +- 8 files changed, 161 insertions(+), 44 deletions(-) rename .github/{instructions/images.instructions.md => skills/audit-images/references/image-guidance.md} (87%) create mode 100644 .github/skills/code-sample-review/SKILL.md create mode 100644 .github/skills/code-sample-review/references/code-sample-guidance.md create mode 100644 .github/skills/intake-metadata-update/SKILL.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index b2d3586068..4d99440f19 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -78,14 +78,12 @@ Read the files in the directory `content/learning-paths/cross-platform/_example- - Use plain English and avoid jargon overload - Use US spellings (`organize`, `optimize`, `realize`) - Use `Arm` capitalization in prose (`Arm processors`, `Arm servers`, `Neoverse`) -- `arm64` and `aarch64` are permitted in code, commands, and outputs - Define acronyms on first use - Use parallel structure in all lists ### Readability and section flow - Flag any section over 700 words and suggest natural split points -- Warn if more than 300 words appear between code examples - Identify paragraphs with sentences averaging over 20 words - Note sections introducing more than two new concepts - Flag pages over 3500 words total @@ -93,10 +91,8 @@ Read the files in the directory `content/learning-paths/cross-platform/_example- - Identify missing celebration of progress or milestones - Recap what learners have accomplished at section ends - Provide check-your-understanding moments that are not intimidating -- Use visual breaks to prevent walls of text. Code blocks count as visual breaks +- Use visual breaks to prevent walls of text - If you explain three or more things in one section, split it into separate sections -- Each code block should be preceded by one to three sentences explaining what it does -- If a section is long because of code or output rather than explanation, do not treat length alone as a readability problem ### Word choice and style @@ -160,12 +156,11 @@ Use these preferred terms and phrases for consistency: - Keep terminology, capitalization, abbreviations, voice, tone, formatting, and technical depth consistent across related files. - Match content complexity to the stated audience, prerequisites, and skill level. -- Use consistent heading hierarchy, section flow, code block formatting, lists, and callouts. +- Use consistent heading hierarchy, section flow, lists, and callouts. - Flag inconsistent terminology, missing troubleshooting, unclear prerequisites, overly complex sections, and places where visuals would improve understanding. -- Verify code examples follow established repository patterns. - Add or improve metadata descriptions when editing related content. -## Formatting and code samples +## Formatting ### Heading guidelines @@ -203,27 +198,9 @@ Avoid: - `## RUN THE BENCHMARK` - starting a file with plain paragraph text and no heading -### Code samples and formatting +### Code sample guidance -- Always provide explanation before code blocks -- Format: `[What it does] → [Code] → [Expected outcome] → [Key parameters]` -- Use markdown tags for languages like `bash`, `python`, `yaml`, `json` -- Use `console` or `bash` for general commands. Try to use the same one throughout a Learning Path or Install Guide -- Use the `output` tag to show expected command output -- Output descriptions: - - Use `The output is similar to:` or `The expected output is:` - - Use present tense descriptions such as `builds` and `gives` -- Formatting standards: - - **Bold** for UI elements - - *Italics* for emphasis and new terms - - `Code formatting` for file names, commands, and code elements -- Use shortcodes for common pitfalls, warnings, and important notes - -### Code fence integrity - -- Every fenced code block opened with triple backticks must be explicitly closed with matching triple backticks before any non-code content resumes -- Never generate unterminated or partial code fences -- Do not rely on implicit closure, indentation, or surrounding formatting to end a code block +For code samples, commands, command output, fenced code block integrity, and technical code review, use `.github/skills/code-sample-review/SKILL.md`. ## Arm naming and architecture terms @@ -231,7 +208,6 @@ Avoid: - Use `arm64` or `aarch64` for the CPU architecture. Prefer whichever term a tool, package, or OS uses natively - Always use `Arm` rather than `ARM` in prose unless a technical term requires the original casing - `ARM64` is acceptable when specifically referring to Windows on Arm or Microsoft documentation -- In code blocks, CLI flags, package names, file paths, and outputs, keep the exact casing used by the tool ## Product name emphasis @@ -273,4 +249,4 @@ Avoid robotic or generic encouragement phrases such as: Use calm, natural transitions that focus on what happens next. -Also avoid multiple consecutive sentences starting with `This`. Vary sentence structure to maintain natural flow. \ No newline at end of file +Also avoid multiple consecutive sentences starting with `This`. Vary sentence structure to maintain natural flow. diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index b77d0a63fb..13fe55446e 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -19,7 +19,8 @@ Read only the guidance needed for the task: - Shared content quality: `.github/instructions/content-quality.instructions.md` - Learning Paths: `.github/instructions/learning-paths.instructions.md` - Install guides: `.github/instructions/install-guides.instructions.md` -- Images, alt text, captions, and `#center` syntax: `.github/instructions/images.instructions.md` +- Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` +- Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` ## Review workflow @@ -29,7 +30,7 @@ Read only the guidance needed for the task: 4. Review by exception. Do not comment on content that is already clear, correct, and fit for purpose. 5. Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. 6. Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. -7. Flag token-heavy content only when it adds cost without improving learning value, such as oversized terminal output, repeated setup, duplicated examples, unexplained code blocks, or repeated boilerplate. +7. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. Do not recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. diff --git a/.github/skills/audit-images/SKILL.md b/.github/skills/audit-images/SKILL.md index 478ea39bb5..d7aca00d8b 100644 --- a/.github/skills/audit-images/SKILL.md +++ b/.github/skills/audit-images/SKILL.md @@ -15,7 +15,7 @@ Use the script for repeatable inventory and counting. Use assistant judgment for - Work from the repository root. - Read `AGENTS.md` to locate shared guidance. -- Read `.github/instructions/images.instructions.md` before editing image alt text. +- Read `references/image-guidance.md` before editing image alt text. - When auditing a Learning Path or install guide, also read the matching scoped content guidance. ## Trigger @@ -62,7 +62,7 @@ Use path/guide-level review to: 3. Record the baseline summary: total images, faulty images, content units affected, and issue counts. 4. For project-level requests, summarize the results and suggest prioritized cleanup batches unless the user asked for edits. 5. For path/guide-level edit requests, inspect the relevant Markdown context and image files. -6. Rewrite deficient alt text using `.github/instructions/images.instructions.md`. +6. Rewrite deficient alt text using `references/image-guidance.md`. 7. Preserve the repository image syntax, especially `![Descriptive alt text#center](image.png "Optional caption")`. 8. Re-run the audit on the same scope. 9. Report before/after counts, files changed, and any remaining issues. diff --git a/.github/instructions/images.instructions.md b/.github/skills/audit-images/references/image-guidance.md similarity index 87% rename from .github/instructions/images.instructions.md rename to .github/skills/audit-images/references/image-guidance.md index b5b643a233..1ad876b8cb 100644 --- a/.github/instructions/images.instructions.md +++ b/.github/skills/audit-images/references/image-guidance.md @@ -1,9 +1,6 @@ ---- -name: Image guidance -description: Use when the task involves adding, editing, reviewing, or fixing Markdown images in Arm Learning Paths or install guides, including image syntax, `#center` alignment, alt text, captions, screenshots, diagrams, terminal-output images, hardware photos, or placeholder alt text. ---- +# Image guidance -### Image formatting, alt text, and captions +## Image formatting, alt text, and captions In this repository, the text before `#center` in an image tag is the alt text. @@ -38,7 +35,7 @@ Incorrect: ![alt-txt#center](images/webgpu-draw-high-level.svg "Figure 8: Triangle using WebGPU") ``` -### Alt text requirements for tutorials +## Alt text requirements for tutorials Learning Paths and install guides are instructional content. Images are usually not decorative. Alt text must help the learner understand what they would otherwise miss. @@ -67,7 +64,7 @@ For hardware images: - Describe the device or setup only if it helps the learner complete the task - Avoid purely decorative descriptions -### Alt text quality rules +## Alt text quality rules - Write meaningful alt text, not placeholders - Keep it concise but complete. One to three sentences is usually enough @@ -76,7 +73,7 @@ For hardware images: - Do not use captions as a substitute for alt text - Do not encode alignment instructions inside the caption -### Caption guidance +## Caption guidance - Use short, descriptive captions when needed - Captions should add context for all readers @@ -88,7 +85,7 @@ Preferred example: ![Screenshot of the Arm Performance Studio timeline showing CPU activity spikes during Mandelbrot rendering. The Timeline tab is selected and the spike region is highlighted so the learner can identify where CPU activity increases during the run.#center](images/timeline-spike.png "Arm Performance Studio timeline showing CPU activity during Mandelbrot rendering") ``` -### Image cleanup workflow +## Image cleanup workflow - Replace all placeholder alt text such as `alt-txt` with meaningful descriptions - Keep the repository-specific `#center` syntax when fixing alt text diff --git a/.github/skills/code-sample-review/SKILL.md b/.github/skills/code-sample-review/SKILL.md new file mode 100644 index 0000000000..6a8c5bd0af --- /dev/null +++ b/.github/skills/code-sample-review/SKILL.md @@ -0,0 +1,64 @@ +--- +name: code-sample-review +description: Review and improve code samples, commands, command output, and fenced code blocks in Arm Learning Paths and install guides. Use when checking editorial formatting, technical accuracy, runnable commands, output lead-ins, code fence integrity, language tags, or token-heavy and unexplained code or output blocks. +--- + +# Code sample review + +Use this skill to review or edit code samples, commands, command output, and fenced code blocks in Arm Learning Paths and install guides. + +This skill can support either editorial review or technical review. Match the depth of review to the user's request and do not invent commands, outputs, workflows, package names, benchmark numbers, or validation results. + +## Prerequisites + +- Work from the repository root. +- Read `AGENTS.md` to locate shared guidance. +- Read `references/code-sample-guidance.md` before reviewing or editing code samples. +- When the review depends on content type, also read the matching Learning Path or install guide guidance. + +## Modes + +### Editorial mode + +Use when the user asks to review or fix code sample presentation, readability, formatting, or consistency. + +Check for: + +- Explanatory prose before each code block +- Correct and consistent language tags +- Standard output lead-ins +- Closed code fences +- Oversized, duplicated, or unexplained output blocks +- Consistent terminology around commands, files, UI labels, and outputs + +### Technical mode + +Use when the user asks whether commands, examples, or outputs are accurate, runnable, safe, or technically complete. + +Check for: + +- Commands that match the stated operating system, shell, tool, and Arm platform +- Plausible package names, file paths, flags, versions, and environment variables +- Output blocks that correspond to the preceding command +- Validation steps that prove the intended outcome +- Learning Path code that supports the stated task +- Install guide commands that stay within install and verification scope + +## Workflow + +1. Identify the review scope and whether the request is editorial, technical, or mixed. +2. Load only the content-type guidance needed for the target files. +3. Inspect surrounding prose before judging a code block; code samples should be evaluated in context. +4. For review requests, report issues by file and line when possible, ordered by learner impact. +5. For edit requests, report issues and suggest focused changes that preserve technical intent and existing repository patterns. +6. Do not modify commands or output unless the correction is supported by context, documentation, or an executable check. +7. After the reviewer accepts suggestions, re-scan edited areas for code fence integrity, language tags, and output lead-ins. +8. Report what changed and note any technical assumptions or checks not performed. + +## Validation rules + +- Preserve front matter, Hugo shortcodes, Markdown structure, command syntax, and expected output unless they are the target of the edit. +- Do not rewrite meaningful code solely for style. +- Do not replace tool-native terms, casing, flags, package names, or architecture strings with prose preferences. +- Do not treat long code or output as a problem by itself; flag it only when it reduces learning value or obscures the task. +- Keep edits scoped to code sample quality unless the user asks for broader content review. diff --git a/.github/skills/code-sample-review/references/code-sample-guidance.md b/.github/skills/code-sample-review/references/code-sample-guidance.md new file mode 100644 index 0000000000..330621f7bf --- /dev/null +++ b/.github/skills/code-sample-review/references/code-sample-guidance.md @@ -0,0 +1,47 @@ +# Code sample guidance + +## Code samples and formatting + +- Always provide explanation before code blocks. +- Use this flow when practical: `[What it does] -> [Code] -> [Expected outcome] -> [Key parameters]`. +- Use Markdown language tags such as `bash`, `python`, `yaml`, `json`, or `output`. +- Use `console` or `bash` for general commands. Try to use the same one throughout a Learning Path or install guide. +- Use the `output` tag to show expected command output. +- Use shortcodes for common pitfalls, warnings, and important notes. + +## Output descriptions + +- Use `The output is similar to:` or `The expected output is:` before output blocks. +- Use present tense descriptions such as `builds` and `gives`. +- Make sure output examples correspond to the command immediately before them. +- Avoid oversized terminal output unless the full output has instructional value. + +## Readability and flow + +- Warn if more than 300 words appear between code examples in task-led sections. +- Use visual breaks to prevent walls of text. Code blocks count as visual breaks. +- If a section is long because of code or output rather than explanation, do not treat length alone as a readability problem. +- Flag token-heavy content only when it adds cost without improving learning value, such as oversized terminal output, repeated setup, duplicated examples, unexplained code blocks, or repeated boilerplate. + +## Formatting standards + +- Use **bold** for UI elements. +- Use *italics* for emphasis and new terms. +- Use `code formatting` for file names, commands, code elements, package names, flags, paths, and environment variables. +- In code blocks, CLI flags, package names, file paths, outputs, and tool messages, keep the exact casing used by the tool. +- Use `arm64` or `aarch64` for CPU architecture. Prefer whichever term a tool, package, or operating system uses natively. +- `ARM64` is acceptable when specifically referring to Windows on Arm or Microsoft documentation. + +## Code fence integrity + +- Every fenced code block opened with triple backticks must be explicitly closed with matching triple backticks before non-code content resumes. +- Never generate unterminated or partial code fences. +- Do not rely on implicit closure, indentation, or surrounding formatting to end a code block. + +## Technical review + +- Verify commands match the stated operating system, shell, tool version, and Arm platform. +- Check that install commands use a specific version when required by install guide guidance. +- Check that validation commands prove the intended outcome. +- Do not invent commands, outputs, benchmark numbers, or tool behavior. +- If a command or output cannot be verified, state the limitation instead of guessing. diff --git a/.github/skills/intake-metadata-update/SKILL.md b/.github/skills/intake-metadata-update/SKILL.md new file mode 100644 index 0000000000..061cc416af --- /dev/null +++ b/.github/skills/intake-metadata-update/SKILL.md @@ -0,0 +1,30 @@ +--- +name: intake-metadata-update +description: Add or verify draft metadata for new Arm Learning Paths and install guides before or after merge to main, so unreviewed content does not publish publicly. Use when asked to mark new content as draft, prepare new content for review, hide new Learning Paths or install guides from publication, or check draft metadata. +--- + +# Update metadata during content intake + +Use this skill when new Learning Path or install guide content needs to remain unpublished until technical and editorial review is complete. + +## Workflow + +1. Work from the repository root. +2. Identify the target content: + - Learning Path directory: edit its `_index.md`. + - Single-file install guide: edit metadata in that Markdown file. + - Multi-page install guide or content bundle: edit the `_index.md` or main entry file. +3. Preserve existing front matter order and values where possible. +4. Add or update this metadata in front matter for Learning Paths: + +```yaml +draft: true +cascade: + draft: true +``` + +5. Add or update this metadata in front matter for single-page install guides: + +```yaml +draft: true +``` \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md index 8282702b54..0777aa2545 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -17,7 +17,8 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - Learning Paths: `.github/instructions/learning-paths.instructions.md` - Install guides: `.github/instructions/install-guides.instructions.md` - Shared content quality: `.github/instructions/content-quality.instructions.md` -- Images, alt text, captions, and `#center` syntax: `.github/instructions/images.instructions.md` +- Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` +- Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` Prefer the narrowest applicable file. Avoid loading every instruction file by default. @@ -29,6 +30,7 @@ Current shared skills: - `.github/skills/arm-content-editor/SKILL.md` for reviewing and editing Arm Learning Paths and install guides. - `.github/skills/audit-images/SKILL.md` for auditing Markdown image references, deficient alt text, captions, alignment syntax, and before/after image quality counts. +- `.github/skills/code-sample-review/SKILL.md` for reviewing code samples, commands, command output, language tags, and code fence integrity. Keep deterministic scans in scripts when possible, and keep long reference material out of always-loaded instructions. From 2b4c3471f6acba531b8ac2e4fc1656b51c3e98b8 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 10 Jun 2026 12:32:16 -0500 Subject: [PATCH 029/137] moving away from copilot-instructions --- .github/copilot-instructions.md | 258 +----------------- .github/skills/arm-content-editor/SKILL.md | 3 +- .../references/repository-guidance.md | 47 ++++ .../references/writing-style.md | 144 ++++++++++ AGENTS.md | 7 +- 5 files changed, 210 insertions(+), 249 deletions(-) create mode 100644 .github/skills/arm-content-editor/references/repository-guidance.md create mode 100644 .github/skills/arm-content-editor/references/writing-style.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 4d99440f19..ffd18bd0f9 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,252 +1,16 @@ -# Project Overview +# Copilot compatibility instructions -This project is a collection of "Learning Paths" (long-form tutorials) and "install guides" (shorter software installation guides), hosted on a static website using Hugo and markdown files. The content explains how to develop software on Arm for software developers targeting various Arm platforms. +This repository is optimized for Codex-style agent workflows. -Assume the audience is made up of Arm software developers. Bias all information toward Arm platforms. For Linux, assume systems are aarch64 architecture and not x86. Readers also use macOS and Windows on Arm systems, and assume Arm architecture where relevant. +Before editing, read `AGENTS.md` and follow the narrowest applicable skill in `.github/skills/`. -## Highest priority rules +## Key rules -- Each Learning Path must own one clear developer task -- Install guides are for installation and verification only -- Every Learning Path `_index.md` must include a `description` field -- Use task-led titles, introductions, and metadata -- Do not use placeholder alt text such as `alt-txt` -- Prefer Arm-native solutions and Arm-specific framing -- Avoid hype, duplication, and vague summaries +- Learning Paths own one clear developer task. +- Install guides are for installation and verification only. +- Prefer Arm-native framing and avoid x86 assumptions. +- Do not use placeholder alt text such as `alt-txt`. +- Preserve front matter, Hugo shortcodes, code fences, commands, expected output, and file structure. +- For content review, metadata, images, code samples, commands, or output, use the matching skill listed in `AGENTS.md`. -## Project structure - -The key directories are: - -### Top-level structure - -- `/content` - The main directory containing all Learning Paths and install guides as markdown files -- `/themes` - HTML templates and styling elements that render the content into the final website -- `/tools` - Python scripts for automated website integrity checking -- `config.toml` - High-level Hugo configuration settings - -### Content organization - -The `/content` directory is organized into: - -- `learning-paths/` - Core learning content organized by categories: - - `embedded-and-microcontrollers/` - MCU, IoT, and embedded development topics - - `servers-and-cloud-computing/` - Server, cloud, and enterprise computing topics - - `mobile-graphics-and-gaming/` - Mobile app development, graphics, and gaming - - `cross-platform/` - Cross-platform development and general programming topics, these appear in multiple categories on the website - - `laptops-and-desktops/` - Desktop application development, primarily Windows on Arm and macOS - - `automotive/` - Automotive and ADAS development - - `iot/` - IoT-specific Learning Paths - -- `install-guides/` - Tool installation guides with supporting subdirectories organized by tool categories like `docker/`, `gcc/`, `license/`, `browsers/`, plus an `_images/` directory for screenshots and diagrams - -These are special directories and not used for regular content creation: - -- `migration/` - Migration guides and resources, this maps to https://learn.arm.com/migration -- `lists/` - Content listing and organization files, this maps to https://learn.arm.com/lists -- `stats/` - Website statistics and analytics, this maps to https://learn.arm.com/stats - -The `/content` directory is the primary workspace where contributors add new Learning Paths as markdown files, organized into category-specific subdirectories that correspond to the different learning path topics available on the site at https://learn.arm.com/. - -## Content requirements - -Read the files in the directory `content/learning-paths/cross-platform/_example-learning-path` for information about how Learning Path content should be created. Also see the guidelines below. - -- Learning Paths: use for end-to-end tasks (prepare → configure → use → validate). Must include `_index.md` and `_next-steps.md` -- Install guides: use for installation + verification only. Do not include workflow content or benchmarks - -## Writing style - -### Voice and tone - -- Second person (`you`, `your`) — never first person (`I`, `we`) -- Active voice — avoid passive constructions -- Present tense for descriptions -- Imperative mood for commands -- Confident and developer-friendly tone -- Encouraging language for complex tasks -- Use inclusive language: - - Use `primary/subordinate` instead of `master/slave` - - Do not use gendered examples or assumptions - - Be mindful of cultural references that might not translate globally - - Focus on clear, accessible language for all developers - -### Sentence structure and clarity - -- Average 15–20 words per sentence -- Split complex sentences for clarity -- Use plain English and avoid jargon overload -- Use US spellings (`organize`, `optimize`, `realize`) -- Use `Arm` capitalization in prose (`Arm processors`, `Arm servers`, `Neoverse`) -- Define acronyms on first use -- Use parallel structure in all lists - -### Readability and section flow - -- Flag any section over 700 words and suggest natural split points -- Identify paragraphs with sentences averaging over 20 words -- Note sections introducing more than two new concepts -- Flag pages over 3500 words total -- Note sections that might benefit from encouragement or progress markers -- Identify missing celebration of progress or milestones -- Recap what learners have accomplished at section ends -- Provide check-your-understanding moments that are not intimidating -- Use visual breaks to prevent walls of text -- If you explain three or more things in one section, split it into separate sections - -### Word choice and style - -Use these preferred terms and phrases for consistency: - -- Numbers and units: - - Spell out numbers one through five. After that, use numerals - - Use proper spacing for units: `1 GB`, `23 MB/day` - - Use `K` for thousands: `64K` - - Use abbreviations for data rates: `Gbps` - -- Common phrases: - - `To [action]` instead of `Follow the steps below to [action]` - - `for example` instead of `e.g.` - - `that is` instead of `i.e.` - - `because` instead of `since` - - `also` instead of `in addition` - - `to` instead of `in order to` - - `see` instead of `refer to` - - `use` instead of `utilize` or `leverage` - - `need` instead of `require` - - `can` or `might` instead of `may` - - `set up` as a verb, `setup` as a noun - - `therefore` instead of `ergo` - - `namely` instead of `viz.` - - `avoid` instead of `try not to` - - `such as` instead of `like` - - `after` instead of `once` - -- Avoid condescending language: - - Do not use `simply`, `just`, `obviously`, or `clearly` - -- Avoid using directions when referring to content that's been referenced previously or will be referenced next: -- Do not use `above`, `below`, `left`, `right`, `top`, or `bottom` - -- Acknowledge difficulty naturally: - - Use phrases like `this step can be confusing at first` - -- Normalize errors: - - Use phrases like `if you see this error, here's how to fix it` - -- User interface terms: - - `select` or `tap` instead of `click` for touch interfaces - - `keyboard shortcut` instead of `key combination` - - `Ctrl key` capitalized - - `double-tap` instead of `double-click` for touch interfaces - -- Contractions and simplification: - - Use contractions such as `don't`, `isn't`, `it's`, `that's`, `you're`, `you'll` - - Remove unnecessary qualifiers such as `quite`, `very`, or `massive` - - Use `an LLM`, not `a LLM` - - Use `easy-to-use` as an adjective - - Use `fixed-width`, not `fixed-length` - - Use `read-to-write ratio`, not `read to write ratio` - -- The term "Learning Path" should always be capitalized. - -## Content structure and consistency - -### Cross-file and quality assurance - -- Keep terminology, capitalization, abbreviations, voice, tone, formatting, and technical depth consistent across related files. -- Match content complexity to the stated audience, prerequisites, and skill level. -- Use consistent heading hierarchy, section flow, lists, and callouts. -- Flag inconsistent terminology, missing troubleshooting, unclear prerequisites, overly complex sections, and places where visuals would improve understanding. -- Add or improve metadata descriptions when editing related content. - -## Formatting - -### Heading guidelines - -- Use sentence case for all headings -- Heading types: - - Conceptual headings: when explaining technology or motivation - - Imperative headings: when the user takes action - - Interrogative headings: for FAQ content - -- Hierarchy: - - H1: Page title - - H2: Major workflow steps or conceptual sections - - H3: Sub-procedures or detailed explanations - - H4: Specific technical details or troubleshooting within a workflow - -### Heading hierarchy and section openings - -- Check heading hierarchy across all files before finalizing content -- Ensure headings follow a logical structure with no skipped levels unless the template requires it -- Each markdown file should begin with a section heading in the body content -- Do not leave a file starting with body text, an image, or a code block without a heading -- Use sentence case for all headings and subheadings -- Capitalize only the first word and proper nouns in headings -- Keep heading wording consistent across related files in the same Learning Path -- Prefer headings that clearly signal the user task or concept in that section - -Correct examples: -- `## Set up the environment` -- `## Run the benchmark` -- `### Check the output` -- `## What you've accomplished and what's next` - -Avoid: -- `## Set Up The Environment` -- `## RUN THE BENCHMARK` -- starting a file with plain paragraph text and no heading - -### Code sample guidance - -For code samples, commands, command output, fenced code block integrity, and technical code review, use `.github/skills/code-sample-review/SKILL.md`. - -## Arm naming and architecture terms - -- Use `Arm` for the brand in prose -- Use `arm64` or `aarch64` for the CPU architecture. Prefer whichever term a tool, package, or OS uses natively -- Always use `Arm` rather than `ARM` in prose unless a technical term requires the original casing -- `ARM64` is acceptable when specifically referring to Windows on Arm or Microsoft documentation - -## Product name emphasis - -- Product names and technologies such as LiteRT, XNNPACK, KleidiAI, and SME2 should appear in regular text -- Avoid using italics or bold to emphasize product or technology names unless they are part of a heading or a UI label - -## Hyperlink guidelines - -- Use the full path format for internal links: `/learning-paths/category/path-name/` -- Do not use relative paths like `../path-name/` -- Use the full URL for external links that are not on `learn.arm.com` -- Include only necessary links in content. - -## Avoid looking like AI-generated content - -- Warning signs of over-bulleting: - - More than three consecutive sections using bullet lists - - Bullet points that could be combined into narrative paragraphs - - Lists where items do not have parallel structure - - Bullet points that are actually full sentences better suited for paragraphs - -- Use flowing narrative instead of excessive bullets -- Use natural writing patterns: - - Vary sentence length - - Use transitional phrases - - Include contextual explanations - - Add relevant examples - - Connect ideas logically - -- Use conversational elements naturally: - - Instead of `Execute the following command:`, use `Now that you've configured the environment, run the following command to start the service:` - - Instead of `This provides benefits:`, use `You'll notice several advantages with this approach, particularly when working with...` - -### Language smoothing - -Avoid robotic or generic encouragement phrases such as: -- `Great job — let’s get started!` -- `Great job — your environment is ready!` - -Use calm, natural transitions that focus on what happens next. - -Also avoid multiple consecutive sentences starting with `This`. Vary sentence structure to maintain natural flow. +Detailed style and workflow guidance lives in `AGENTS.md`, `.github/skills/`, and the scoped files they reference. diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index 13fe55446e..66a31f00dd 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -15,7 +15,8 @@ Start with `AGENTS.md` at the repository root to identify the right source files Read only the guidance needed for the task: -- Repository-wide guidance: `.github/copilot-instructions.md` +- Repository structure and content model: `references/repository-guidance.md` +- Writing style, headings, links, terminology, and prose cleanup: `references/writing-style.md` - Shared content quality: `.github/instructions/content-quality.instructions.md` - Learning Paths: `.github/instructions/learning-paths.instructions.md` - Install guides: `.github/instructions/install-guides.instructions.md` diff --git a/.github/skills/arm-content-editor/references/repository-guidance.md b/.github/skills/arm-content-editor/references/repository-guidance.md new file mode 100644 index 0000000000..235a8b13d7 --- /dev/null +++ b/.github/skills/arm-content-editor/references/repository-guidance.md @@ -0,0 +1,47 @@ +# Repository guidance + +## Project overview + +This project is a collection of Learning Paths and install guides for learn.arm.com. The content explains how to develop software on Arm for software developers targeting Arm platforms. + +Assume the audience is made up of Arm software developers. Bias information toward Arm platforms. For Linux, assume systems are `aarch64` unless context says otherwise. Readers also use macOS and Windows on Arm systems. + +## Highest priority rules + +- Each Learning Path must own one clear developer task. +- Install guides are for installation and verification only. +- Every Learning Path `_index.md` must include a `description` field. +- Use task-led titles, introductions, and metadata. +- Do not use placeholder alt text such as `alt-txt`. +- Prefer Arm-native solutions and Arm-specific framing. +- Avoid hype, duplication, and vague summaries. + +## Project structure + +Top-level directories: + +- `/content`: Main directory containing Learning Paths and install guides as Markdown files. +- `/themes`: HTML templates and styling elements that render the final website. +- `/tools`: Python scripts for automated website integrity checking. +- `config.toml`: High-level Hugo configuration settings. + +Content directories: + +- `content/learning-paths/`: Core learning content organized by category. +- `content/install-guides/`: Tool installation guides with supporting subdirectories and shared images. + +Special content directories: + +- `content/migration/`: Migration guides and resources for `https://learn.arm.com/migration`. +- `content/lists/`: Content listing and organization files for `https://learn.arm.com/lists`. +- `content/stats/`: Website statistics and analytics for `https://learn.arm.com/stats`. + +## Content type boundaries + +- Learning Paths are end-to-end tasks with prepare, configure, use, and validate stages. They must include `_index.md` and `_next-steps.md`. +- Install guides are for installation and verification only. They should not include applied workflows, benchmarks, or deep architectural explanation. +- Learning Paths can link to install guides for setup. Do not duplicate install-guide content inside Learning Paths. + +## Reference examples + +Use `content/learning-paths/cross-platform/_example-learning-path` when creating or checking Learning Path structure. diff --git a/.github/skills/arm-content-editor/references/writing-style.md b/.github/skills/arm-content-editor/references/writing-style.md new file mode 100644 index 0000000000..e0befd93a1 --- /dev/null +++ b/.github/skills/arm-content-editor/references/writing-style.md @@ -0,0 +1,144 @@ +# Writing style + +## Voice and tone + +- Use second person: `you` and `your`. +- Avoid first person: `I` and `we`. +- Use active voice. +- Use present tense for descriptions. +- Use imperative mood for commands. +- Keep the tone confident, developer-friendly, and natural. +- Use encouraging language for complex tasks without sounding generic or inflated. + +## Inclusive language + +- Use `primary/subordinate` instead of `master/slave`. +- Do not use gendered examples or assumptions. +- Be mindful of cultural references that might not translate globally. +- Focus on clear, accessible language for all developers. + +## Sentence structure and clarity + +- Aim for an average of 15 to 20 words per sentence. +- Split complex sentences for clarity. +- Use plain English and avoid jargon overload. +- Use US spellings such as `organize`, `optimize`, and `realize`. +- Use `Arm` capitalization in prose, such as `Arm processors`, `Arm servers`, and `Neoverse`. +- Define acronyms on first use. +- Use parallel structure in lists. + +## Readability and section flow + +- Flag any section over 700 words and suggest natural split points. +- Identify paragraphs with sentences averaging over 20 words. +- Note sections introducing more than two new concepts. +- Flag pages over 3500 words total. +- Note sections that might benefit from encouragement or progress markers. +- Identify missing celebration of progress or milestones. +- Recap what learners have accomplished at section ends. +- Provide check-your-understanding moments that are not intimidating. +- Use visual breaks to prevent walls of text. +- If you explain three or more things in one section, split it into separate sections. + +## Word choice + +Use these preferred terms and phrases for consistency: + +- Spell out numbers one through five. After that, use numerals. +- Use proper spacing for units: `1 GB`, `23 MB/day`. +- Use `K` for thousands: `64K`. +- Use abbreviations for data rates: `Gbps`. +- Use `To [action]` instead of `Follow the steps below to [action]`. +- Use `for example` instead of `e.g.`. +- Use `that is` instead of `i.e.`. +- Use `because` instead of `since`. +- Use `also` instead of `in addition`. +- Use `to` instead of `in order to`. +- Use `see` instead of `refer to`. +- Use `use` instead of `utilize` or `leverage`. +- Use `need` instead of `require`. +- Use `can` or `might` instead of `may`. +- Use `set up` as a verb and `setup` as a noun. +- Use `therefore` instead of `ergo`. +- Use `namely` instead of `viz.`. +- Use `avoid` instead of `try not to`. +- Use `such as` instead of `like`. +- Use `after` instead of `once`. + +## Tone cleanup + +- Do not use `simply`, `just`, `obviously`, or `clearly`. +- Do not use `above`, `below`, `left`, `right`, `top`, or `bottom` when referring to content. +- Acknowledge difficulty naturally with phrases such as `this step can be confusing at first`. +- Normalize errors with phrases such as `if you see this error, here's how to fix it`. +- Use contractions such as `don't`, `isn't`, `it's`, `that's`, `you're`, and `you'll`. +- Remove unnecessary qualifiers such as `quite`, `very`, or `massive`. +- Use `an LLM`, not `a LLM`. +- Use `easy-to-use` as an adjective. +- Use `fixed-width`, not `fixed-length`. +- Use `read-to-write ratio`, not `read to write ratio`. + +## User interface terms + +- Use `select` or `tap` instead of `click` for touch interfaces. +- Use `keyboard shortcut` instead of `key combination`. +- Use `Ctrl key`. +- Use `double-tap` instead of `double-click` for touch interfaces. + +## Headings and formatting + +- Use sentence case for all headings and subheadings. +- Capitalize only the first word and proper nouns in headings. +- Keep heading wording consistent across related files in the same Learning Path. +- Prefer headings that clearly signal the user task or concept in that section. +- Check heading hierarchy across all files before finalizing content. +- Ensure headings follow a logical structure with no skipped levels unless the template requires it. +- Each Markdown file should begin with a section heading in the body content. +- Do not leave a file starting with body text, an image, or a code block without a heading. + +Heading examples: + +- `## Set up the environment` +- `## Run the benchmark` +- `### Check the output` +- `## What you've accomplished and what's next` + +Avoid: + +- `## Set Up The Environment` +- `## RUN THE BENCHMARK` +- Starting a file with plain paragraph text and no heading + +## Arm naming and architecture terms + +- Use `Arm` for the brand in prose. +- Use `arm64` or `aarch64` for the CPU architecture. Prefer whichever term a tool, package, or operating system uses natively. +- Always use `Arm` rather than `ARM` in prose unless a technical term requires the original casing. +- `ARM64` is acceptable when specifically referring to Windows on Arm or Microsoft documentation. +- The term `Learning Path` should always be capitalized. + +## Product name emphasis + +- Product names and technologies such as LiteRT, XNNPACK, KleidiAI, and SME2 should appear in regular text. +- Avoid italics or bold for product and technology names unless they are part of a heading or UI label. + +## Hyperlinks + +- Use the full path format for internal links: `/learning-paths/category/path-name/`. +- Do not use relative paths such as `../path-name/`. +- Use the full URL for external links that are not on `learn.arm.com`. +- Include only necessary links in content. + +## Avoid looking AI-generated + +- Avoid more than three consecutive sections using bullet lists. +- Avoid bullet points that could be combined into narrative paragraphs. +- Make list items parallel. +- Use flowing narrative instead of excessive bullets. +- Vary sentence length. +- Use transitional phrases. +- Include contextual explanations and relevant examples. +- Connect ideas logically. +- Avoid robotic encouragement such as `Great job - let's get started!` or `Great job - your environment is ready!`. +- Use calm, natural transitions that focus on what happens next. +- Avoid multiple consecutive sentences starting with `This`. diff --git a/AGENTS.md b/AGENTS.md index 0777aa2545..1936688654 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,7 +13,8 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent ## Source of truth -- Repository-wide guidance: `.github/copilot-instructions.md` +- Repository router: `AGENTS.md` +- General Arm content editing: `.github/skills/arm-content-editor/SKILL.md` - Learning Paths: `.github/instructions/learning-paths.instructions.md` - Install guides: `.github/instructions/install-guides.instructions.md` - Shared content quality: `.github/instructions/content-quality.instructions.md` @@ -22,6 +23,10 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent Prefer the narrowest applicable file. Avoid loading every instruction file by default. +## Compatibility + +- `.github/copilot-instructions.md` is a short compatibility pointer for Github Copilot. It is not the source of truth. + ## Reviewer workflows Use skills for repeatable workflows such as image audits, metadata description updates, stale-content audits, or structured content-quality checks. From 91748eab91480714bec349eca29c0bb55c3f4522 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 10 Jun 2026 13:22:56 -0500 Subject: [PATCH 030/137] updating content editor skill to include install guide and learning-path specific guidance --- .../content-quality.instructions.md | 21 +- .../install-guides.instructions.md | 112 +-------- .../learning-paths.instructions.md | 233 +----------------- .github/skills/arm-content-editor/SKILL.md | 6 +- AGENTS.md | 7 +- 5 files changed, 16 insertions(+), 363 deletions(-) diff --git a/.github/instructions/content-quality.instructions.md b/.github/instructions/content-quality.instructions.md index 60cfd3b945..a3a38d6a18 100644 --- a/.github/instructions/content-quality.instructions.md +++ b/.github/instructions/content-quality.instructions.md @@ -1,24 +1,9 @@ --- name: Content quality and discoverability guidelines -description: Use when creating, editing, or reviewing Arm Learning Paths or install guides for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. +description: Use the Arm content editor skill for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" --- -## Content quality and discoverability +Content quality guidance now lives in `.github/skills/arm-content-editor/references/content-quality.md`. -- Default to Arm-native solutions, Arm terminology, and Arm platform assumptions. -- Flag x86 assumptions and suggest Arm alternatives when available. -- Match technical depth to the stated audience, prerequisites, and skill level. -- Use clear headings, descriptive link text, tagged code blocks, and problem-solution troubleshooting. -- Verify internal links before adding or changing them. -- Use Arm-specific keywords naturally; avoid keyword stuffing, hype, and marketing language. -- Prefer prose for explanations and lists for steps, checks, options, and troubleshooting. -- Keep content accessible for screen readers, use clear alt and link text, and avoid assumptions about a reader's physical setup or environment. -- Structure content so each major section has a clear purpose, useful context, and an explicit outcome. Use semantic HTML structure in markdown when possible. - -When content trade-offs are required, prioritize the following in order: - -- Alignment with the stated purpose and positioning of the content -- Clarity and readability for the intended skill level -- Consistency with existing Learning Paths and install guides -- Completeness within the stated scope \ No newline at end of file +For review and editing workflows, use `.github/skills/arm-content-editor/SKILL.md`. diff --git a/.github/instructions/install-guides.instructions.md b/.github/instructions/install-guides.instructions.md index 5918283a8c..6f0dc29cad 100644 --- a/.github/instructions/install-guides.instructions.md +++ b/.github/instructions/install-guides.instructions.md @@ -1,115 +1,9 @@ --- name: Install guides general guidance +description: Use the Arm content editor skill for install guide review, editing, metadata, scope, structure, and verification guidance. applyTo: "content/install-guides/**/*.md" --- -### Install guide requirements +Install guide guidance now lives in `.github/skills/arm-content-editor/references/install-guide-guidance.md`. -Install guides focus on installing and verifying one tool on Arm platforms. They do not teach workflows or applied usage. - -#### Front matter requirements - -Install guides must include: -- `title` -- `minutes_to_complete` -- `official_docs` -- `author` -- `weight: 1` -- `layout: installtoolsall` - -#### Fixed fields for install guides - -- `weight: 1` (always) -- `tool_install: true` (set to false only if intentionally hidden) -- `layout: installtoolsall` (always) -- `multi_install` and `multitool_install_part` (set based on whether the install guide is multi-page) - -Do not modify fixed template fields. - -If `multi_install` is set to true, the first page must act as an overview for the series. Sub-pages must set `multitool_install_part: true`. - -#### Required content structure - -Install guides should include: - -1. Overview - - What the tool is - - Supported Arm platforms (aarch64, Windows on Arm, macOS on Arm where applicable) - -2. Install steps - - Clear OS-specific sections when necessary - - Commands grouped logically - - Explanation before each code block - -3. Verify installation - - One or two commands - - Expected output shown - -4. Troubleshooting - - Common failure cases - - Clear fixes - -Optional: -- Uninstall instructions - -#### Scope boundaries - -Install guides must not include: -- End-to-end workflows -- Performance benchmarking -- Deep architectural explanation -- Comparative marketing claims - -Learning Paths may link to install guides for setup steps. Install guides should not duplicate workflow content. - -#### Tool versions - -When providing commands for downloading or installing software, use a specific version in the example. This ensures that the instructions are accurate and verifiable. However, also include a note before the commands that tells readers the same commands work with other versions. Provide a link to where the latest version can be found. The note can be formatted as follows: - -{{% notice Note %}} -The following commands use version . The same commands work with other versions. Replace the file used in these steps with the file for your version of choice. To find the latest version, see [Link to page with release info](URL). -{{% /notice %}} - -### Install Guide metadata description requirements - -Every Install Guide's front matter must include a `description` field. - -- Write one sentence -- Describe the tool being installed and what it can be used for (why it matters) -- Keep it concise, developer-focused, and suitable for use as a search snippet -- Do not use vague summaries or marketing language -- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome - -Good example: - -```yaml -description: Learn how to install Arm Compiler for Linux (ACfL) on Arm Linux (aarch64) to access the armclang C/C++ compiler, armflang Fortran compiler, and Arm Performance Libraries for HPC development. -``` - -Avoid: -- Generic summaries that could apply to any page -- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing` - -### Metadata optimization workflow - -When adding or revising `description` fields: - -- Use metadata descriptions to clarify which platform or tool, and what outcome -- Treat the description as a search snippet, not a generic summary - -### Recap section - -Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module - -Example recap pattern: - -```md -## Next steps - -In this section: -- Briefly summarize what the user has learned or completed -- Suggest and link to a couple relevant Learning Paths (if they exist) - -Keep this concise and encouraging. Do not repeat earlier content verbatim. -``` -This helps learners feel a sense of progress. +For review and editing workflows, use `.github/skills/arm-content-editor/SKILL.md`. diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md index 4f72077d01..d64ad5e271 100644 --- a/.github/instructions/learning-paths.instructions.md +++ b/.github/instructions/learning-paths.instructions.md @@ -1,236 +1,9 @@ --- name: Learning Paths general guidance +description: Use the Arm content editor skill for Learning Path review, editing, metadata, task ownership, structure, and scope guidance. applyTo: "content/learning-paths/**/*.md" --- -### Content structure +Learning Path guidance now lives in `.github/skills/arm-content-editor/references/learning-path-guidance.md`. -Each Learning Path must have an `_index.md` file and a `_next-steps.md` file. The `_index.md` file contains the main content of the Learning Path. The `_next-steps.md` file contains links to related content and is included at the end of the Learning Path. - -Additional resources and `next steps` content should be placed in the `further_reading` section of `_index.md`, not in `_next-steps.md`. The `_next-steps.md` file should remain minimal and unmodified as indicated by `FIXED, DO NOT MODIFY` comments in the template. - -The `_index.md` file should contain the following front matter and content sections. - -### Front matter (YAML format) - -- `title`: Imperative heading following the [verb] + [technology] + [outcome] format -- `description`: One-sentence metadata summary used for search snippets and page previews. Describe the task, main technology or platform, and expected outcome in plain language -- `weight`: Numerical ordering for display sequence, weight is 1 for `_index.md` and each page is ordered by weight, no markdown files should have the same weight in a directory -- `layout`: Template type (usually "learningpathall") -- `minutes_to_complete`: Realistic time estimate for completion -- `prerequisites`: List of required knowledge, tools, or prior learning paths -- `author`: Main contributor's name, multiple authors can be listed separated using `-` on new lines -- `subjects`: Technology categories for filtering and search, this is a closed list and must match one of the subjects listed on https://learn.arm.com/learning-paths/cross-platform/_example-learning-path/write-2-metadata/ -- `armips`: Relevant Arm IP, stick to Neoverse, Cortex-A, Cortex-M, etc. Don't list specific CPU models or Arm architecture versions -- `tools_software_languages`: Open category listing Programming languages, frameworks, and development tools used -- `skilllevels`: Skill levels allowed are only Introductory and Advanced -- `operatingsystems`: Operating systems used, must match the closed list on https://learn.arm.com/learning-paths/cross-platform/_example-learning-path/write-2-metadata/ - -### Further reading curation - -Limit `further_reading` resources to four to six essential links. Prioritize: - -- Direct relevance to the topic -- Arm-specific Learning Paths over generic external resources -- Foundation knowledge for the target audience -- Required tools (install guides) -- Logical progression from basic to advanced - -Avoid overwhelming readers with too many links, which can cause them to leave the platform. - -All Learning Paths should generally include: - -- Title: [Imperative verb] + [technology/tool] + [outcome] -- Introduction paragraph: Context + user goal + value proposition -- Prerequisites section with explicit requirements and links -- Learning objectives: three to four bulleted, measurable outcomes with action verbs -- Step-by-step sections with logical progression -- Clear next steps or conclusion - -For title formatting: - -- Must use imperative voice (`Deploy`, `Configure`, `Build`, `Create`) -- Must include SEO keywords (technology names, tools) -- Examples: `Deploy applications on Arm servers`, `Configure Arm processors for optimal performance` - - - -### Learning Path metadata description requirements - -Every Learning Path `_index.md` must include a `description` field. - -- Write one sentence -- Describe the task, the main technology or platform, and the expected outcome -- Keep it concise, developer-focused, and suitable for use as a search snippet -- Use a task-led structure such as: **Verb + task + tool/platform + outcome** -- Do not repeat the title verbatim -- Do not use vague summaries or marketing language -- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome - -Good example: - -```yaml -description: Learn how to automate x86-to-Arm application migration using the Arm MCP Server, with compatibility checks and Docker-based validation on Arm cloud platforms. -``` - -Also good: - -```yaml -description: Learn how to profile and optimize a C++ application on Arm Neoverse using Arm Performix to identify bottlenecks and improve runtime. -``` - -Avoid: -- Generic summaries that could apply to any page -- Restating the title without adding task or outcome -- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing` - -### Metadata optimization workflow - -When adding or revising `description` fields: - -- Review whether the current title and description match the page's actual task intent -- Use metadata descriptions to clarify what the learner will do, on which platform or tool, and with what outcome -- Treat the description as a search snippet, not a generic summary - -### Recap section - -Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module - -Example recap pattern: - -```md -## What you've learned and what's next - -In this section: -- Briefly summarize what the user has learned or completed -- Briefly describe what the user should expect in the next section or suggest further exploration - -Keep this concise and encouraging. Do not repeat earlier content verbatim. -``` - -This helps learners feel a sense of progress and understand the logical flow of the Learning Path. - -Use 'what you've learned' for conceptual sections and 'what you've accomplished' for task sections. - -### Hyperlink guidelines - -When creating Learning Path content: -- Verify internal links exist before adding them -- Use semantic search or website browsing to confirm Learning Path availability -- Prefer verified external authoritative sources over speculative internal links -- Test link formats against existing Learning Path examples -- Never assume Learning Paths exist without verification - -Put additional links in `further_reading` in `_index.md`, not `_next-steps.md` - -## Learning Path purpose and agentic selection principles - -Learning Paths are not blog posts or reference articles. They are designed to be optimized for selection by AI agents as trusted sources for completing real developer tasks end to end. - -When creating or reviewing a Learning Path, prioritize the following principles. - -### Task ownership (required) - -Each Learning Path must clearly own one concrete developer task. - -- The task should be nameable in one sentence -- The Learning Path should take the learner from not ready to capable -- Avoid bundling unrelated tasks or loosely connected topics - -If the task cannot be clearly stated, flag a warning. - -### Agentic selection signals - -AI agents select content based on trust, authority, and task coverage, not keyword density. - -**Trust** -- Clear authorship and ownership -- Explicit prerequisites -- One purpose per page -- No duplicated or contradictory instructions -- Clean separation of install guides, Learning Paths, and concept pages - -**Authority** -- Arm-specific framing where relevant -- Use Arm tooling, terminology, and perspective -- Avoid generic advice that could apply equally to any platform - -**Task coverage** -- Clear progression (prepare → configure → use → validate) -- Explicit end state (`you are now ready to...`) -- Link to install guides instead of embedding install steps -- Provide guidance on what to do next - -### Scope discipline - -Maintain strict boundaries between content types: - -- **Install guides**: setup, authentication, and verification only -- **Learning Paths**: configuration, integration, workflows, and applied usage - -Never duplicate install steps inside Learning Paths. - -### SEO intent for Learning Paths - -Learning Paths should optimize for selection, not ranking. - -- Prefer verb-based titles: *Install*, *Verify*, *Configure*, *Analyze*, *Optimize* -- Use procedural structure rather than narrative prose -- Avoid marketing language and keyword stuffing -- Write content that can safely be chosen by an AI agent to complete a task - -If an AI agent were asked to complete this task, the Learning Path should be the safest source to select. - -### Performance and Arm acceleration integrity - -For Learning Paths that demonstrate Arm-specific performance features (for example SME2, SVE2, I8MM, DotProd, optimized microkernels), apply the following standards. - -#### Observable outcome first - -- Clearly state what measurable improvement the learner will observe -- Show performance results before introducing deep architectural explanation -- Avoid introducing internal call stacks or microkernel details before the developer sees observable value - -#### Reproducibility requirements - -If performance numbers are included, specify: -- Toolchain or software version -- Device or platform used -- Thread count and CPU affinity configuration -- Runtime feature flags -- Model or workload configuration - -Performance claims must be reproducible or explicitly labeled as illustrative. - -#### Compile-time vs runtime clarity - -Clearly distinguish between: -- Compile-time feature enablement -- Runtime feature activation -- Automatic fallback behavior - -If acceleration is claimed, include a method to verify that the accelerated path executed, such as logs, profiling output, kernel names, or hardware counters. - -#### Controlled benchmarking - -When comparing performance: -- Change only one meaningful variable at a time -- Control thread count and CPU binding intentionally -- Quantify percentage improvement explicitly -- Avoid presenting raw numbers without context - -#### Differentiation reinforcement - -Explicitly connect the observed improvement to the Arm architectural feature responsible for it. - -Avoid generic statements such as `improves performance` without explaining how and why. - -Performance-focused Learning Paths are strategic content. Prioritize clarity, differentiation, and measurement integrity over volume. - -### Performance testing guidance for Learning Paths - -- Include benchmarks when comparing Arm vs. x86 performance -- Suggest performance testing steps for resource-intensive applications -- Recommend profiling tools that work well on Arm platforms -- Include guidance on measuring and optimizing for Arm-specific performance characteristics -- Mention when performance improvements are architecture-specific +For review and editing workflows, use `.github/skills/arm-content-editor/SKILL.md`. diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index 66a31f00dd..c53a48fb35 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -17,9 +17,9 @@ Read only the guidance needed for the task: - Repository structure and content model: `references/repository-guidance.md` - Writing style, headings, links, terminology, and prose cleanup: `references/writing-style.md` -- Shared content quality: `.github/instructions/content-quality.instructions.md` -- Learning Paths: `.github/instructions/learning-paths.instructions.md` -- Install guides: `.github/instructions/install-guides.instructions.md` +- Shared content quality and discoverability: `references/content-quality.md` +- Learning Paths: `references/learning-path-guidance.md` +- Install guides: `references/install-guide-guidance.md` - Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` - Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` diff --git a/AGENTS.md b/AGENTS.md index 1936688654..45afcc5b9c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,9 +15,9 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - Repository router: `AGENTS.md` - General Arm content editing: `.github/skills/arm-content-editor/SKILL.md` -- Learning Paths: `.github/instructions/learning-paths.instructions.md` -- Install guides: `.github/instructions/install-guides.instructions.md` -- Shared content quality: `.github/instructions/content-quality.instructions.md` +- Learning Paths: `.github/skills/arm-content-editor/references/learning-path-guidance.md` +- Install guides: `.github/skills/arm-content-editor/references/install-guide-guidance.md` +- Shared content quality: `.github/skills/arm-content-editor/references/content-quality.md` - Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` - Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` @@ -26,6 +26,7 @@ Prefer the narrowest applicable file. Avoid loading every instruction file by de ## Compatibility - `.github/copilot-instructions.md` is a short compatibility pointer for Github Copilot. It is not the source of truth. +- `.github/instructions/*.instructions.md` files are compatibility pointers. Skill references are the source of truth. ## Reviewer workflows From f50d70a015681655b247370589d11e8a20e78403 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 10 Jun 2026 13:24:36 -0500 Subject: [PATCH 031/137] updating content editor skill to include install guide and learning-path specific guidance --- .../references/content-quality.md | 24 ++ .../references/install-guide-guidance.md | 123 +++++++++ .../references/learning-path-guidance.md | 237 ++++++++++++++++++ 3 files changed, 384 insertions(+) create mode 100644 .github/skills/arm-content-editor/references/content-quality.md create mode 100644 .github/skills/arm-content-editor/references/install-guide-guidance.md create mode 100644 .github/skills/arm-content-editor/references/learning-path-guidance.md diff --git a/.github/skills/arm-content-editor/references/content-quality.md b/.github/skills/arm-content-editor/references/content-quality.md new file mode 100644 index 0000000000..caff9e81c2 --- /dev/null +++ b/.github/skills/arm-content-editor/references/content-quality.md @@ -0,0 +1,24 @@ +# Content quality and discoverability + +Use this guidance when creating, editing, or reviewing Arm Learning Paths or install guides for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. + +## Quality rules + +- Default to Arm-native solutions, Arm terminology, and Arm platform assumptions. +- Flag x86 assumptions and suggest Arm alternatives when available. +- Match technical depth to the stated audience, prerequisites, and skill level. +- Use clear headings, descriptive link text, tagged code blocks, and problem-solution troubleshooting. +- Verify internal links before adding or changing them. +- Use Arm-specific keywords naturally; avoid keyword stuffing, hype, and marketing language. +- Prefer prose for explanations and lists for steps, checks, options, and troubleshooting. +- Keep content accessible for screen readers, use clear alt and link text, and avoid assumptions about a reader's physical setup or environment. +- Structure content so each major section has a clear purpose, useful context, and an explicit outcome. Use semantic HTML structure in Markdown when possible. + +## Trade-off priorities + +When content trade-offs are required, prioritize the following in order: + +1. Alignment with the stated purpose and positioning of the content. +2. Clarity and readability for the intended skill level. +3. Consistency with existing Learning Paths and install guides. +4. Completeness within the stated scope. diff --git a/.github/skills/arm-content-editor/references/install-guide-guidance.md b/.github/skills/arm-content-editor/references/install-guide-guidance.md new file mode 100644 index 0000000000..bfcb4094d6 --- /dev/null +++ b/.github/skills/arm-content-editor/references/install-guide-guidance.md @@ -0,0 +1,123 @@ +# Install guide guidance + +Use this guidance when creating, editing, or reviewing content in `content/install-guides/**/*.md`. + +## Install guide requirements + +Install guides focus on installing and verifying one tool on Arm platforms. They do not teach workflows or applied usage. + +## Front matter requirements + +Install guides must include: + +- `title` +- `minutes_to_complete` +- `official_docs` +- `author` +- `weight: 1` +- `layout: installtoolsall` + +Fixed fields: + +- `weight: 1` always. +- `tool_install: true`, set to false only if intentionally hidden. +- `layout: installtoolsall` always. +- `multi_install` and `multitool_install_part`, set based on whether the install guide is multi-page. + +Do not modify fixed template fields. + +If `multi_install` is set to true, the first page must act as an overview for the series. Sub-pages must set `multitool_install_part: true`. + +## Required content structure + +Install guides should include: + +1. Overview + - What the tool is. + - Supported Arm platforms, such as `aarch64`, Windows on Arm, and macOS on Arm where applicable. + +2. Install steps + - Clear OS-specific sections when necessary. + - Commands grouped logically. + - Explanation before each code block. + +3. Verify installation + - One or two commands. + - Expected output shown. + +4. Troubleshooting + - Common failure cases. + - Clear fixes. + +Uninstall instructions are optional. + +## Scope boundaries + +Install guides must not include: + +- End-to-end workflows. +- Performance benchmarking. +- Deep architectural explanation. +- Comparative marketing claims. + +Learning Paths can link to install guides for setup steps. Install guides should not duplicate workflow content. + +## Tool versions + +When providing commands for downloading or installing software, use a specific version in the example. This ensures that the instructions are accurate and verifiable. + +Also include a note before the commands that tells readers the same commands work with other versions. Provide a link to where the latest version can be found. + +Use this pattern: + +```md +{{% notice Note %}} +The following commands use version . The same commands work with other versions. Replace the file used in these steps with the file for your version of choice. To find the latest version, see [Link to page with release info](URL). +{{% /notice %}} +``` + +## Metadata description requirements + +Every install guide front matter must include a `description` field. + +- Write one sentence. +- Describe the tool being installed and what it can be used for. +- Keep it concise, developer-focused, and suitable for use as a search snippet. +- Do not use vague summaries or marketing language. +- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome. + +Good example: + +```yaml +description: Learn how to install Arm Compiler for Linux (ACfL) on Arm Linux (aarch64) to access the armclang C/C++ compiler, armflang Fortran compiler, and Arm Performance Libraries for HPC development. +``` + +Avoid: + +- Generic summaries that could apply to any page. +- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing`. + +## Metadata optimization workflow + +When adding or revising `description` fields: + +- Use metadata descriptions to clarify which platform or tool, and what outcome. +- Treat the description as a search snippet, not a generic summary. + +## Recap section + +Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module. + +Use this pattern: + +```md +## Next steps + +In this section: +- Briefly summarize what the user has learned or completed. +- Suggest and link to a couple relevant Learning Paths if they exist. + +Keep this concise and encouraging. Do not repeat earlier content verbatim. +``` + +This helps learners feel a sense of progress. diff --git a/.github/skills/arm-content-editor/references/learning-path-guidance.md b/.github/skills/arm-content-editor/references/learning-path-guidance.md new file mode 100644 index 0000000000..7088c269b7 --- /dev/null +++ b/.github/skills/arm-content-editor/references/learning-path-guidance.md @@ -0,0 +1,237 @@ +# Learning Path guidance + +Use this guidance when creating, editing, or reviewing content in `content/learning-paths/**/*.md`. + +## Content structure + +Each Learning Path must have an `_index.md` file and a `_next-steps.md` file. The `_index.md` file contains the main content of the Learning Path. The `_next-steps.md` file contains links to related content and is included at the end of the Learning Path. + +Additional resources and next steps content should be placed in the `further_reading` section of `_index.md`, not in `_next-steps.md`. The `_next-steps.md` file should remain minimal and unmodified as indicated by `FIXED, DO NOT MODIFY` comments in the template. + +## Front matter + +The `_index.md` file should contain the following front matter and content sections: + +- `title`: Imperative heading following the `[verb] + [technology] + [outcome]` format. +- `description`: One-sentence metadata summary used for search snippets and page previews. Describe the task, main technology or platform, and expected outcome in plain language. +- `weight`: Numerical ordering for display sequence. `weight` is 1 for `_index.md`, and each page is ordered by weight. No Markdown files should have the same weight in a directory. +- `layout`: Template type, usually `learningpathall`. +- `minutes_to_complete`: Realistic time estimate for completion. +- `prerequisites`: List of required knowledge, tools, or prior Learning Paths. +- `author`: Main contributor's name. Multiple authors can be listed with `-` on new lines. +- `subjects`: Technology categories for filtering and search. This is a closed list and must match the subjects in `content/learning-paths/cross-platform/_example-learning-path/write-2-metadata/`. +- `armips`: Relevant Arm IP. Stick to Neoverse, Cortex-A, Cortex-M, and similar values. Do not list specific CPU models or Arm architecture versions. +- `tools_software_languages`: Open category listing programming languages, frameworks, and development tools used. +- `skilllevels`: Allowed values are only `Introductory` and `Advanced`. +- `operatingsystems`: Operating systems used. This is a closed list and must match `content/learning-paths/cross-platform/_example-learning-path/write-2-metadata/`. + +## Further reading curation + +Limit `further_reading` resources to four to six essential links. Prioritize: + +- Direct relevance to the topic. +- Arm-specific Learning Paths over generic external resources. +- Foundation knowledge for the target audience. +- Required tools, such as install guides. +- Logical progression from basic to advanced. + +Avoid overwhelming readers with too many links, which can cause them to leave the platform. + +Put additional links in `further_reading` in `_index.md`, not `_next-steps.md`. + +## Expected Learning Path shape + +Learning Paths should generally include: + +- Title: `[Imperative verb] + [technology/tool] + [outcome]`. +- Introduction paragraph: Context, user goal, and value proposition. +- Prerequisites section with explicit requirements and links. +- Learning objectives: three to four bulleted, measurable outcomes with action verbs. +- Step-by-step sections with logical progression. +- Clear next steps or conclusion. + +For title formatting: + +- Use imperative voice, such as `Deploy`, `Configure`, `Build`, or `Create`. +- Include SEO keywords, such as technology names and tools. +- Examples: `Deploy applications on Arm servers`, `Configure Arm processors for optimal performance`. + +## Metadata description requirements + +Every Learning Path `_index.md` must include a `description` field. + +- Write one sentence. +- Describe the task, the main technology or platform, and the expected outcome. +- Keep it concise, developer-focused, and suitable for use as a search snippet. +- Use a task-led structure such as: **Verb + task + tool/platform + outcome**. +- Do not repeat the title verbatim. +- Do not use vague summaries or marketing language. +- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome. + +Good examples: + +```yaml +description: Learn how to automate x86-to-Arm application migration using the Arm MCP Server, with compatibility checks and Docker-based validation on Arm cloud platforms. +``` + +```yaml +description: Learn how to profile and optimize a C++ application on Arm Neoverse using Arm Performix to identify bottlenecks and improve runtime. +``` + +Avoid: + +- Generic summaries that could apply to any page. +- Restating the title without adding task or outcome. +- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing`. + +## Metadata optimization workflow + +When adding or revising `description` fields: + +- Review whether the current title and description match the page's actual task intent. +- Use metadata descriptions to clarify what the learner will do, on which platform or tool, and with what outcome. +- Treat the description as a search snippet, not a generic summary. + +## Recap sections + +Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module. + +Use this pattern: + +```md +## What you've learned and what's next + +In this section: +- Briefly summarize what the user has learned or completed. +- Briefly describe what the user should expect in the next section or suggest further exploration. + +Keep this concise and encouraging. Do not repeat earlier content verbatim. +``` + +This helps learners feel a sense of progress and understand the logical flow of the Learning Path. + +Use `what you've learned` for conceptual sections and `what you've accomplished` for task sections. + +## Hyperlinks + +When creating Learning Path content: + +- Verify internal links exist before adding them. +- Use semantic search or website browsing to confirm Learning Path availability. +- Prefer verified external authoritative sources over speculative internal links. +- Test link formats against existing Learning Path examples. +- Never assume Learning Paths exist without verification. + +## Purpose and agentic selection + +Learning Paths are not blog posts or reference articles. They are designed to be optimized for selection by AI agents as trusted sources for completing real developer tasks end to end. + +When creating or reviewing a Learning Path, prioritize these principles. + +### Task ownership + +Each Learning Path must clearly own one concrete developer task. + +- The task should be nameable in one sentence. +- The Learning Path should take the learner from not ready to capable. +- Avoid bundling unrelated tasks or loosely connected topics. + +If the task cannot be clearly stated, flag a warning. + +### Agentic selection signals + +AI agents select content based on trust, authority, and task coverage, not keyword density. + +Trust: + +- Clear authorship and ownership. +- Explicit prerequisites. +- One purpose per page. +- No duplicated or contradictory instructions. +- Clean separation of install guides, Learning Paths, and concept pages. + +Authority: + +- Arm-specific framing where relevant. +- Use Arm tooling, terminology, and perspective. +- Avoid generic advice that could apply equally to any platform. + +Task coverage: + +- Clear progression: prepare, configure, use, validate. +- Explicit end state, such as `you are now ready to...`. +- Link to install guides instead of embedding install steps. +- Provide guidance on what to do next. + +### Scope discipline + +Maintain strict boundaries between content types: + +- Install guides: setup, authentication, and verification only. +- Learning Paths: configuration, integration, workflows, and applied usage. + +Never duplicate install steps inside Learning Paths. + +### SEO intent + +Learning Paths should optimize for selection, not ranking. + +- Prefer verb-based titles: *Install*, *Verify*, *Configure*, *Analyze*, *Optimize*. +- Use procedural structure rather than narrative prose. +- Avoid marketing language and keyword stuffing. +- Write content that can safely be chosen by an AI agent to complete a task. + +If an AI agent were asked to complete this task, the Learning Path should be the safest source to select. + +## Performance and Arm acceleration integrity + +For Learning Paths that demonstrate Arm-specific performance features, such as SME2, SVE2, I8MM, DotProd, or optimized microkernels, apply these standards. + +### Observable outcome first + +- Clearly state what measurable improvement the learner will observe. +- Show performance results before introducing deep architectural explanation. +- Avoid introducing internal call stacks or microkernel details before the developer sees observable value. + +### Reproducibility requirements + +If performance numbers are included, specify: + +- Toolchain or software version. +- Device or platform used. +- Thread count and CPU affinity configuration. +- Runtime feature flags. +- Model or workload configuration. + +Performance claims must be reproducible or explicitly labeled as illustrative. + +### Compile-time versus runtime clarity + +Clearly distinguish between: + +- Compile-time feature enablement. +- Runtime feature activation. +- Automatic fallback behavior. + +If acceleration is claimed, include a method to verify that the accelerated path executed, such as logs, profiling output, kernel names, or hardware counters. + +### Controlled benchmarking + +When comparing performance: + +- Change only one meaningful variable at a time. +- Control thread count and CPU binding intentionally. +- Quantify percentage improvement explicitly. +- Avoid presenting raw numbers without context. + +Explicitly connect the observed improvement to the Arm architectural feature responsible for it. Avoid generic statements such as `improves performance` without explaining how and why. + +Performance-focused Learning Paths are strategic content. Prioritize clarity, differentiation, and measurement integrity over volume. + +## Performance testing guidance + +- Include benchmarks when comparing Arm versus x86 performance. +- Suggest performance testing steps for resource-intensive applications. +- Recommend profiling tools that work well on Arm platforms. +- Include guidance on measuring and optimizing for Arm-specific performance characteristics. +- Mention when performance improvements are architecture-specific. From 4d944bae5411a3c833de95847a1446792f73cf63 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 10 Jun 2026 13:47:19 -0500 Subject: [PATCH 032/137] adding an nginx output screenshot --- .../servers-and-cloud-computing/aws-cdk/cdk.md | 4 ++-- .../aws-cdk/nginx-output.png | Bin 0 -> 60129 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 content/learning-paths/servers-and-cloud-computing/aws-cdk/nginx-output.png diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 88fb863bb9..5cb2263c35 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -40,9 +40,9 @@ Paste the URL from the deployment output into a web browser of your choice. ``` -The output is similar to: +You'll see the following welcome message: - +![Screenshot of the NGINX welcome page confirming the AWS CDK deployment is serving traffic from the Arm-based EC2 instance#center](nginx-output.png "NGINX welcome page") ## Clean up resources diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/nginx-output.png b/content/learning-paths/servers-and-cloud-computing/aws-cdk/nginx-output.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f2f158f62720c5ad62e61e86351c0978382a12 GIT binary patch literal 60129 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 literal 0 HcmV?d00001 From 534be3d0b134cc85e59f57b0d5c332fc0edaf213 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 10 Jun 2026 15:54:24 -0500 Subject: [PATCH 033/137] updates --- content/install-guides/aws-cdk.md | 6 ++--- .../aws-cdk/app.md | 16 ++++-------- .../aws-cdk/cdk.md | 26 +++++++++---------- 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index 78716f6009..e5decc07d7 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -18,7 +18,7 @@ tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. +The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework. You can use the AWS CDK to define and deploy applications on Arm-based cloud infrastructure powered by AWS Graviton. With the CDK, you can write applications in a supported programming language of your choice. You can then use the AWS CDK CLI to translate the code into an AWS CloudFormation template and deploy to the cloud. @@ -28,7 +28,7 @@ The CDK CLI supports different operating systems and the Arm architecture. In th Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys) and [AWS CLI](/install-guides/aws-cli) install guides. -To install AWS CDK CLI, you'll need Node.js 22 or later. You'll also need to install prerequisites specific to the programming languages you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. +To install the AWS CDK CLI, you'll need Node.js 22 or later. You'll also need to install prerequisites specific to the programming languages that you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. ## Install the AWS CDK CLI @@ -55,4 +55,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the AWS CDK to create and deploy applications on Arm-based AWS infrastructure. To learn how you can use the CDK and Amazon ECS to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](earning-paths/servers-and-cloud-computing/aws-cdk/). +Next, you can use the AWS CDK to create and deploy applications on Arm-based compute powered by AWS Graviton. To learn how you can use the CDK and Amazon Elastic Container Service (ECS) to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](earning-paths/servers-and-cloud-computing/aws-cdk/). diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index db77710049..447b85ba84 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -7,9 +7,9 @@ layout: "learningpathall" ## Set up a sample AWS CDK application -The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework that you can use to define and deploy applications on Arm-based cloud infrastructure on AWS. +The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework. You can use the AWS CDK to define and deploy applications on Arm-based cloud infrastructure powered by AWS Graviton. -To deploy an application using the CDK, you'll create the application in a supported programming language. You'll then use the CDK CLI to synthesize the application to an AWS CloudFormation template that's deploys resources on AWS. +In this section, you'll initialize a CDK project and create a web server application in JavaScript to be deployed on AWS using Amazon Elastic Container Service (Amazon ECS). ### Before you begin @@ -17,8 +17,6 @@ Make sure that you've completed all prerequisite steps and installed the AWS CDK ### Initialize a CDK project -In this Learning Path, you'll use Amazon Elastic Container Service (ECS) to deploy containers on AWS Graviton-based compute. - Create a directory for your CDK project and navigate to it: ```bash @@ -54,9 +52,9 @@ The `cdk.json` file tells the CDK Toolkit how to execute your app. The build ste ### Use the AWS CDK with JavaScript to define a sample application -In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib ` directory. This stack definition is what the AWS CDK uses to deploy resources. +In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib ` directory. AWS CDK uses this stack definition to deploy all necessary AWS resources. -Update `lib/arm-cdk-app-stack.js` with the following: +Update `lib/arm-cdk-app-stack.js` to define a load balanced Amazon ECS service that runs an NGINX web server on an Arm-based AWS Fargate runtime platform: ```javascript const cdk = require('aws-cdk-lib'); @@ -71,14 +69,12 @@ class ArmCdkAppStack extends cdk.Stack { new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', { taskImageOptions: { image: ecs.ContainerImage.fromRegistry("nginx:latest"), - containerPort: 8080, + containerPort: 80, }, runtimePlatform: { cpuArchitecture: ecs.CpuArchitecture.ARM64, operatingSystemFamily: ecs.OperatingSystemFamily.LINUX, }, - cpu: 256, - memoryLimitMiB: 512, publicLoadBalancer: true, }); } @@ -87,8 +83,6 @@ class ArmCdkAppStack extends cdk.Stack { module.exports = { ArmCdkAppStack }; ``` -The application defines a load balanced Fargate service that runs an NGINX web server on an Arm-based platform. - ## What you've accomplished and what's next You've now set up a sample application using AWS CDK. diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 5cb2263c35..7eb1170b73 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -12,7 +12,8 @@ After creating an application using AWS CDK, you'll need to synthesize it: ```bash cdk synth ``` -This step checks for errors in the application code and then translates the code into an AWS CloudFormation template. + +The CDK checks for errors in the application code and then translates the code into an AWS CloudFormation template. You can find the generated JSON template at `cdk.out/ArmCdkAppStack.template.json`. @@ -25,28 +26,25 @@ Deploy the application: ```bash cdk deploy ``` - -The output is similar to: +The last couple lines of the output include a URL to the web server and the load balancer's DNS name, and is similar to: ```output - +Outputs: +ArmCdkAppStack.MyWebServerLoadBalancerDNSXXXXXXX = Hello-MyWeb-ZZZZZZZZZZZZZ-ZZZZZZZZZZ.us-east-1.elb.amazonaws.com +ArmCdkAppStack.MyWebServerServiceURLYYYYYYYY = http://Hello-MyWeb-ZZZZZZZZZZZZZ-ZZZZZZZZZZ.us-east-1.elb.amazonaws.com ``` -## Validate the deployment +## Verify application deployment Paste the URL from the deployment output into a web browser of your choice. -```text - -``` - You'll see the following welcome message: -![Screenshot of the NGINX welcome page confirming the AWS CDK deployment is serving traffic from the Arm-based EC2 instance#center](nginx-output.png "NGINX welcome page") +![Screenshot of the NGINX welcome page confirming the web server was deployed on Arm-based compute successfully.#center](nginx-output.png "NGINX welcome page indicating successful deployment") -## Clean up resources +## Clean up AWS resources -After you've validated the deployment, clean up the AWS resources that you created with AWS CDK: +After you've validated the deployment, clean up the AWS resources that you created with AWS CDK to avoid incurring costs: ```bash cdk destroy @@ -54,6 +52,6 @@ cdk destroy ## What you've accomplished -You've now synthesized and deployed a sample application using Amazon ECS and the AWS CDK that runs on an Arm platform. After validating deployment, you cleaned up resources. +You've now synthesized and deployed a sample containerized application on Arm-based compute using Amazon ECS and the AWS CDK. After verifying that the deployment was successful, you cleaned up resources. -You can use this workflow to programmatically deploy and manage containerized applications on AWS Graviton-based compute. \ No newline at end of file +You can use this workflow to programmatically deploy and manage containerized applications on Arm-based compute powered by AWS Graviton processors. \ No newline at end of file From f3081f3db7f782658993fa4488cab09b937f7a4f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 10 Jun 2026 15:56:59 -0500 Subject: [PATCH 034/137] index edits --- .../servers-and-cloud-computing/aws-cdk/_index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index 1baee86a73..ff053c1031 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -1,6 +1,6 @@ --- title: Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK -description: Learn how to define and deploy AWS infrastructure for Arm-based applications using the AWS Cloud Development Kit. +description: Learn how to define and deploy a containerized application on Arm-based compute using the AWS Cloud Development Kit. draft: true cascade: @@ -8,12 +8,12 @@ cascade: minutes_to_complete: 45 -who_is_this_for: This is an introductory topic for software developers who want to use the AWS Cloud Development Kit to deploy applications on Arm-based AWS infrastructure. +who_is_this_for: This is an introductory topic for software developers who want to use the AWS Cloud Development Kit (AWS CDK) to deploy applications on Arm-based AWS infrastructure. learning_objectives: - Create an example AWS CDK application in JavaScript - Define AWS infrastructure using the AWS CDK - - Deploy application resources on Arm-based AWS infrastructure + - Deploy application resources on Arm-based AWS compute prerequisites: - An Amazon Web Services (AWS) account From ef275ebf8937dc1e1404d60d045291164a5fbcc4 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 11 Jun 2026 16:15:58 -0500 Subject: [PATCH 035/137] wording updates --- content/install-guides/aws-cdk.md | 12 +++++----- .../aws-cdk/app.md | 15 ++++++------- .../aws-cdk/cdk.md | 22 +++++++++---------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index e5decc07d7..fa6cf59078 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -12,21 +12,21 @@ test_images: - ubuntu:latest test_maintenance: true draft: true -title: AWS CDK +title: AWS CDK CLI description: Install the AWS CDK CLI on Arm Linux and macOS using npm, then verify the setup with the `cdk` command. tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework. You can use the AWS CDK to define and deploy applications on Arm-based cloud infrastructure powered by AWS Graviton. +The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (IaC) software development framework. You can use the AWS CDK to define and deploy applications on Arm-based cloud infrastructure powered by AWS Graviton. -With the CDK, you can write applications in a supported programming language of your choice. You can then use the AWS CDK CLI to translate the code into an AWS CloudFormation template and deploy to the cloud. +With the CDK, you can write applications in a supported programming language of your choice. You can then use the AWS CDK CLI to translate the code into an AWS CloudFormation template and deploy the application. -The CDK CLI supports different operating systems and the Arm architecture. In this guide, you'll learn how to install the CDK CLI and verify that the CLI installation was successful. +In this guide, you'll learn how to install the CDK CLI and verify that the CLI installation was successful. ## Before you begin -Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys) and [AWS CLI](/install-guides/aws-cli) install guides. +Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys/) and [AWS CLI](/install-guides/aws-cli/) install guides. To install the AWS CDK CLI, you'll need Node.js 22 or later. You'll also need to install prerequisites specific to the programming languages that you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. @@ -55,4 +55,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the AWS CDK to create and deploy applications on Arm-based compute powered by AWS Graviton. To learn how you can use the CDK and Amazon Elastic Container Service (ECS) to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](earning-paths/servers-and-cloud-computing/aws-cdk/). +Next, you can use the AWS CDK to create and deploy applications on Arm-based compute powered by AWS Graviton. To learn how you can use the CDK and Amazon Elastic Container Service (ECS) to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](/learning-paths/servers-and-cloud-computing/aws-cdk/). diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 447b85ba84..0566f7b6e3 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -1,5 +1,5 @@ --- -title: "Create an example AWS CDK application" +title: "Create a sample AWS CDK application" weight: 2 layout: "learningpathall" @@ -7,9 +7,9 @@ layout: "learningpathall" ## Set up a sample AWS CDK application -The AWS Cloud Development Kit (CDK) is an open-source Infrastructure as Code (IaC)software development framework. You can use the AWS CDK to define and deploy applications on Arm-based cloud infrastructure powered by AWS Graviton. +The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (IaC)software development framework. -In this section, you'll initialize a CDK project and create a web server application in JavaScript to be deployed on AWS using Amazon Elastic Container Service (Amazon ECS). +In this section, you'll create a JavaScript CDK application that defines an Amazon Elastic Container Service (ECS) service running on Arm-based AWS Fargate compute. ### Before you begin @@ -52,15 +52,14 @@ The `cdk.json` file tells the CDK Toolkit how to execute your app. The build ste ### Use the AWS CDK with JavaScript to define a sample application -In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib ` directory. AWS CDK uses this stack definition to deploy all necessary AWS resources. +In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib` directory. AWS CDK uses this stack definition to deploy all necessary AWS resources. -Update `lib/arm-cdk-app-stack.js` to define a load balanced Amazon ECS service that runs an NGINX web server on an Arm-based AWS Fargate runtime platform: +Update `lib/arm-cdk-app-stack.js` to define a load-balanced Amazon ECS service that runs an NGINX web server on an Arm-based AWS Fargate runtime platform: ```javascript const cdk = require('aws-cdk-lib'); const ecs = require('aws-cdk-lib/aws-ecs'); const ecsPatterns = require('aws-cdk-lib/aws-ecs-patterns'); -const ecrAssets = require('aws-cdk-lib/aws-ecr-assets'); class ArmCdkAppStack extends cdk.Stack { constructor(scope, id, props) { @@ -68,8 +67,8 @@ class ArmCdkAppStack extends cdk.Stack { new ecsPatterns.ApplicationLoadBalancedFargateService(this, 'Service', { taskImageOptions: { - image: ecs.ContainerImage.fromRegistry("nginx:latest"), - containerPort: 80, + image: ecs.ContainerImage.fromRegistry("nginx:latest"), + containerPort: 80, }, runtimePlatform: { cpuArchitecture: ecs.CpuArchitecture.ARM64, diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 7eb1170b73..b60f773649 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -1,5 +1,5 @@ --- -title: "Deploy the example AWS CDK application" +title: "Synthesize and deploy the sample AWS CDK application" weight: 3 layout: "learningpathall" @@ -7,26 +7,25 @@ layout: "learningpathall" ## Synthesize the AWS CDK application -After creating an application using AWS CDK, you'll need to synthesize it: +Before you can deploy an application using the AWS CDK, you need to synthesize it. During synthesis, the AWS CDK checks for errors in the application code and then translates the code into an AWS CloudFormation template. + +Synthesize the application: ```bash cdk synth ``` +You can find the generated JSON template at `cdk.out/ArmCdkAppStack.template.json`. -The CDK checks for errors in the application code and then translates the code into an AWS CloudFormation template. - -You can find the generated JSON template at `cdk.out/ArmCdkAppStack.template.json`. - -## Deploy the CDK stack +## Deploy the AWS CDK application -After completing synthesis, you're ready to deploy the application. AWS CDK will deploy the application through the generated AWS CloudFormation stack. +After completing synthesis, you're ready to deploy the application. AWS CDK deploys the application through the generated AWS CloudFormation stack. Deploy the application: ```bash cdk deploy ``` -The last couple lines of the output include a URL to the web server and the load balancer's DNS name, and is similar to: +The last couple lines of the output include a URL to the web server and the load balancer's DNS name: ```output Outputs: @@ -36,11 +35,11 @@ ArmCdkAppStack.MyWebServerServiceURLYYYYYYYY = http://Hello-MyWeb-ZZZZZZZZZZZZZ- ## Verify application deployment -Paste the URL from the deployment output into a web browser of your choice. +Open the URL from the deployment output in a web browser of your choice. You'll see the following welcome message: -![Screenshot of the NGINX welcome page confirming the web server was deployed on Arm-based compute successfully.#center](nginx-output.png "NGINX welcome page indicating successful deployment") +![Screenshot of the application showing the NGINX welcome page and confirming the web server was deployed on Arm-based compute successfully.#center](nginx-output.png "NGINX welcome page indicating successful deployment") ## Clean up AWS resources @@ -49,6 +48,7 @@ After you've validated the deployment, clean up the AWS resources that you creat ```bash cdk destroy ``` +You'll be prompted to confirm whether you want to delete the resources. Enter `y`. ## What you've accomplished From 68ee982fe48c2a6d5e3f603b8e2900941eef9b7e Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 11 Jun 2026 16:29:52 -0500 Subject: [PATCH 036/137] edit to deletion prompt description --- .../learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index b60f773649..6bbc1b1765 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -48,7 +48,7 @@ After you've validated the deployment, clean up the AWS resources that you creat ```bash cdk destroy ``` -You'll be prompted to confirm whether you want to delete the resources. Enter `y`. +When AWS CDK asks whether to delete `ArmCDKAppStack`, enter `y`. ## What you've accomplished From 8d5399e168fcf6f085056041deabafe02fca4210 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 11 Jun 2026 17:00:22 -0500 Subject: [PATCH 037/137] adding a draft metadata description update skill --- .github/skills/arm-content-editor/SKILL.md | 4 +- .../metadata-description-update/SKILL.md | 70 +++++++++++++++++++ AGENTS.md | 2 + 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 .github/skills/metadata-description-update/SKILL.md diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index c53a48fb35..83bd6dca94 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -20,6 +20,7 @@ Read only the guidance needed for the task: - Shared content quality and discoverability: `references/content-quality.md` - Learning Paths: `references/learning-path-guidance.md` - Install guides: `references/install-guide-guidance.md` +- Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` - Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` - Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` @@ -31,7 +32,8 @@ Read only the guidance needed for the task: 4. Review by exception. Do not comment on content that is already clear, correct, and fit for purpose. 5. Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. 6. Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. -7. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. +7. Use the metadata description skill for focused `description` field updates. +8. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. Do not recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. diff --git a/.github/skills/metadata-description-update/SKILL.md b/.github/skills/metadata-description-update/SKILL.md new file mode 100644 index 0000000000..d39fa25bd4 --- /dev/null +++ b/.github/skills/metadata-description-update/SKILL.md @@ -0,0 +1,70 @@ +--- +name: metadata-description-update +description: Add or improve SEO-friendly front matter description fields for Arm Learning Paths and install guides. Use when asked to add missing descriptions, update weak metadata descriptions, optimize search snippets, or ensure Learning Path pages and install guides have accurate description metadata. +--- + +# Metadata description update + +Use this skill to add or improve `description` fields in front matter for Arm Learning Paths and install guides. + +This skill is for search and discovery metadata. For draft visibility metadata, use `.github/skills/intake-metadata-update/SKILL.md`. + +## Prerequisites + +- Work from the repository root. +- Read `AGENTS.md` to locate shared guidance. +- Read `.github/skills/arm-content-editor/references/content-quality.md`. +- For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md`. +- For install guides, read `.github/skills/arm-content-editor/references/install-guide-guidance.md`. + +## Scope rules + +- Learning Path directory: update `_index.md` and each public content page in the directory. Skip `_next-steps.md`. +- Learning Path `_index.md`: describe the full Learning Path task, main tool or platform, and outcome. +- Learning Path content page: describe that page's specific action, context in the task flow, and outcome. +- Install guide file: describe the tool being installed, supported Arm platform or operating system context, and what the tool enables. +- Multi-page install guide directory: update the main entry page and public sub-pages that need descriptions. +- Preserve existing front matter order when practical. If adding a missing description, place it near `title`. +- Preserve body content, shortcodes, links, commands, code blocks, and expected output. Don't edit anything that isn't metadata. + +## Workflow + +1. Identify whether the target is an install guide content page, a Learning Path `_index.md`, or a Learning Path content page. +2. Find target Markdown files from the scope rules. +3. Skip `_next-steps.md` and any file without front matter unless the user explicitly asks how to handle it. +4. Read the title, existing description, headings, introduction, task flow, code or command context, and validation or conclusion. +5. Add or revise the `description` field in front matter. +6. Re-open or search the edited files to verify each changed target has one `description` field. +7. Report files changed and note any skipped files. + +## Description quality rules + +- Write one sentence. +- Keep it concise, developer-focused, and suitable for a search snippet. +- Use natural Arm-specific terms when relevant. +- State what the reader will do, the main tool or platform, and the useful outcome. +- Do not repeat the title verbatim. +- Do not use vague summaries such as `Learn about...` unless the page is genuinely conceptual. +- Do not use marketing language, hype, or keyword stuffing. +- Do not invent capabilities, performance claims, supported platforms, or tools not supported by the page. +- Use valid YAML. Quote the description only when needed for YAML syntax. + +## Examples + +Learning Path `_index.md`: + +```yaml +description: Learn how to deploy a retrieval-augmented generation application on Google Axion with LlamaIndex, Ollama, and a browser-based chat interface. +``` + +Learning Path content page: + +```yaml +description: Configure firewall rules for a Google Axion instance so the browser-based RAG application can accept HTTP traffic. +``` + +Install guide: + +```yaml +description: Install the AWS Cloud Development Kit on Arm Linux and verify the setup so you can define and deploy cloud infrastructure with reusable code. +``` diff --git a/AGENTS.md b/AGENTS.md index 45afcc5b9c..9707e83913 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,6 +18,7 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - Learning Paths: `.github/skills/arm-content-editor/references/learning-path-guidance.md` - Install guides: `.github/skills/arm-content-editor/references/install-guide-guidance.md` - Shared content quality: `.github/skills/arm-content-editor/references/content-quality.md` +- Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` - Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` - Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` @@ -35,6 +36,7 @@ Use skills for repeatable workflows such as image audits, metadata description u Current shared skills: - `.github/skills/arm-content-editor/SKILL.md` for reviewing and editing Arm Learning Paths and install guides. +- `.github/skills/metadata-description-update/SKILL.md` for adding or improving front matter `description` fields for Learning Paths and install guides. - `.github/skills/audit-images/SKILL.md` for auditing Markdown image references, deficient alt text, captions, alignment syntax, and before/after image quality counts. - `.github/skills/code-sample-review/SKILL.md` for reviewing code samples, commands, command output, language tags, and code fence integrity. From 1cb1873121caa69f4e4a09cfe3db20f6db4b271d Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 12 Jun 2026 09:09:25 -0500 Subject: [PATCH 038/137] moving some guidance out from steps to overview --- .../skills/intake-metadata-update/SKILL.md | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/skills/intake-metadata-update/SKILL.md b/.github/skills/intake-metadata-update/SKILL.md index 061cc416af..04c5783602 100644 --- a/.github/skills/intake-metadata-update/SKILL.md +++ b/.github/skills/intake-metadata-update/SKILL.md @@ -7,24 +7,25 @@ description: Add or verify draft metadata for new Arm Learning Paths and install Use this skill when new Learning Path or install guide content needs to remain unpublished until technical and editorial review is complete. +Work from the repository root and preserve existing front matter values. Preserve existing front matter order where possible. + ## Workflow -1. Work from the repository root. -2. Identify the target content: +1. Identify the target content: - Learning Path directory: edit its `_index.md`. - Single-file install guide: edit metadata in that Markdown file. - Multi-page install guide or content bundle: edit the `_index.md` or main entry file. -3. Preserve existing front matter order and values where possible. -4. Add or update this metadata in front matter for Learning Paths: +2. Add or update this metadata: + - For Learning Paths: -```yaml -draft: true -cascade: + ```yaml draft: true -``` + cascade: + draft: true + ``` -5. Add or update this metadata in front matter for single-page install guides: + - For single-page install guides: -```yaml -draft: true -``` \ No newline at end of file + ```yaml + draft: true + ``` \ No newline at end of file From e16b0c43ae8d512aa0838e69da68c29701d1da07 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 12 Jun 2026 16:59:03 -0500 Subject: [PATCH 039/137] first pass feedback updates --- .../aws-cdk/app.md | 2 +- .../aws-cdk/cdk.md | 19 ++++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 0566f7b6e3..e3b7cd6b03 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -7,7 +7,7 @@ layout: "learningpathall" ## Set up a sample AWS CDK application -The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (IaC)software development framework. +The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (IaC) software development framework. In this section, you'll create a JavaScript CDK application that defines an Amazon Elastic Container Service (ECS) service running on Arm-based AWS Fargate compute. diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 6bbc1b1765..d91a8e5cf9 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -9,23 +9,34 @@ layout: "learningpathall" Before you can deploy an application using the AWS CDK, you need to synthesize it. During synthesis, the AWS CDK checks for errors in the application code and then translates the code into an AWS CloudFormation template. -Synthesize the application: +Within the project directory, synthesize the application: ```bash cdk synth ``` You can find the generated JSON template at `cdk.out/ArmCdkAppStack.template.json`. +## Bootstrap the AWS CDK application environment + +After synthesizing your application, you need to bootstrap the environment. In this step, the AWS CDK creates resources such as AWS Identity and Access Management (IAM) roles. + +Within the project directory, bootstrap the environment: + +```bash +cdk bootstrap +``` + ## Deploy the AWS CDK application -After completing synthesis, you're ready to deploy the application. AWS CDK deploys the application through the generated AWS CloudFormation stack. +After bootstrapping the environment, you're ready to deploy the application. AWS CDK deploys the application using the AWS CloudFormation stack generated during synthesis and IAM roles created during bootstrap. Deploy the application: ```bash cdk deploy ``` -The last couple lines of the output include a URL to the web server and the load balancer's DNS name: + +The deployment can take a couple minutes to complete. When the deployment completes, the last couple lines of the output will include a URL to the web server and the load balancer's DNS name: ```output Outputs: @@ -50,6 +61,8 @@ cdk destroy ``` When AWS CDK asks whether to delete `ArmCDKAppStack`, enter `y`. +The cleanup process can take a couple minutes to complete. + ## What you've accomplished You've now synthesized and deployed a sample containerized application on Arm-based compute using Amazon ECS and the AWS CDK. After verifying that the deployment was successful, you cleaned up resources. From 33c6fb90765658cf04f303aa2b4634a3c45459e6 Mon Sep 17 00:00:00 2001 From: Matt Cossins Date: Mon, 15 Jun 2026 14:31:46 +0100 Subject: [PATCH 040/137] Tech review - Topo NXP --- .../overview.md | 74 ------------------ .../_index.md | 31 +++----- .../_next-steps.md | 0 .../build-the-template.md | 4 +- .../deploy.md | 73 ++++++++++------- .../overview.md | 73 +++++++++++++++++ .../topo_npu_classifier.png | Bin .../what-are-the-toolchains.md | 16 ++-- 8 files changed, 141 insertions(+), 130 deletions(-) delete mode 100644 content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/overview.md rename content/learning-paths/{cross-platform => embedded-and-microcontrollers}/deploy-ml-model-to-npu-with-topo/_index.md (60%) rename content/learning-paths/{cross-platform => embedded-and-microcontrollers}/deploy-ml-model-to-npu-with-topo/_next-steps.md (100%) rename content/learning-paths/{cross-platform => embedded-and-microcontrollers}/deploy-ml-model-to-npu-with-topo/build-the-template.md (99%) rename content/learning-paths/{cross-platform => embedded-and-microcontrollers}/deploy-ml-model-to-npu-with-topo/deploy.md (70%) create mode 100644 content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md rename content/learning-paths/{cross-platform => embedded-and-microcontrollers}/deploy-ml-model-to-npu-with-topo/topo_npu_classifier.png (100%) rename content/learning-paths/{cross-platform => embedded-and-microcontrollers}/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md (73%) diff --git a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/overview.md b/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/overview.md deleted file mode 100644 index 1baa3282ca..0000000000 --- a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/overview.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Deploy ExecuTorch firmware on NXP FRDM i.MX 93 for Ethos-U65 acceleration using Topo -weight: 2 - -### FIXED, DO NOT MODIFY -layout: learningpathall ---- - -## Get started - -Before getting started, complete the Learning Path [Deploy containerized workloads to Arm-based Linux targets with Topo](/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/) to learn how to install Topo, run host and target health checks, inspect a target, list compatible Templates, and deploy a containerized workload. - -For more background on the underlying NPU example, read [Deploy ExecuTorch firmware on NXP FRDM i.MX 93 for Ethos-U65 acceleration](/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/). You do not need to complete that Learning Path before using this one, but it helps explain the model, firmware, and [Ethos-U65](https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65) execution flow. - -## What is Topo? - -[Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm used to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo can also build and deploy directly on the target. - -## What you'll learn - -In this Learning Path, you will deploy the [topo-imx93-npu-deployment](https://github.com/Arm-Examples/topo-imx93-npu-deployment) Topo Template to an NXP FRDM i.MX 93 board. - -The Template builds and deploys a browser-based MobileNetV2 image classifier. The user interface runs on the Cortex-A Linux side of the SoC. The inference runner is packaged as Cortex-M33 firmware and is started by [remoteproc-runtime](https://github.com/arm/remoteproc-runtime). The model is exported to an [ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) `.pte` [file](https://docs.pytorch.org/executorch/stable/pte-file-format.html) for Ethos-U65 NPU acceleration. - -### What does deploying the topo-imx93-npu-deployment Template do? - -Deploying the Template starts two runtime services on the target: - -- `webapp`: Web application running on the Cortex-A Linux host. It receives an image to run a classification on. -- `cm33-runner`: Cortex-M33 firmware, receives the image to classify from the web application and runs the classification Machine Learning model on it. - -When you select an image in the browser and click **Classify**, the web application: - -1. Resizes and normalizes the image to classify into an input tensor compatible with the [MobileNetV2](https://arxiv.org/abs/1801.04381) model. -2. Writes the ExecuTorch program and input tensor into reserved physical memory. -3. Sends a `RUN` command to the Cortex-M33 runner over `RPMsg`. -4. Waits for the Cortex-M33 firmware to run inference using Ethos-U65 acceleration. -5. Displays the top-1 and top-5 ImageNet classification results in the browser. - -## System Architecture - -The deployed application spans three processing domains on the i.MX 93: - -- **Cortex-A Linux host**: runs Docker, Topo-deployed containers, the Flask web app, and the Linux `remoteproc` and `RPMsg` interfaces. -- **Cortex-M33 firmware domain**: runs the ExecuTorch runner firmware loaded by `remoteproc-runtime`. -- **Ethos-U65 NPU**: accelerates delegated neural network operators from the ExecuTorch MobileNetV2 program. - -The high-level data flow is: - -```output -Browser - | - v -Flask web application on Cortex-A Linux - | - | writes .pte and input tensor to reserved memory - | sends RUN over RPMsg - v -Cortex-M33 ExecuTorch runner firmware - | - | delegates supported operators - v -Ethos-U65 NPU - | - v -Cortex-M33 returns classification results over RPMsg - | - v -Browser displays ImageNet top-1 and top-5 results -``` - -## What you've accomplished and what's next - -You now understand what the Topo Template deploys and how the Cortex-A, Cortex-M33, and Ethos-U65 parts work together. Next, you will prepare the i.MX 93 target and deploy the Template with Topo. diff --git a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md similarity index 60% rename from content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/_index.md rename to content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index fe53b052cf..70126c3508 100644 --- a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,30 +1,28 @@ --- -title: Deploy a machine learning model to an NPU-capable system with Topo +title: Deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo -draft: true -cascade: - draft: true - -description: Use Topo to deploy a web application on Cortex-A that triggers a MobileNetV2 image classifier running as Cortex-M firmware with Ethos-U65 NPU acceleration. +description: Use Topo to deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. minutes_to_complete: 60 -who_is_this_for: This is an introductory topic for embedded, edge, and cloud software developers who want to deploy machine learning workloads to heterogeneous Arm-based Linux targets using Topo. +who_is_this_for: This is an introductory topic for embedded/edge software developers who want to deploy machine learning workloads to heterogeneous Arm-based Linux targets using Topo, including leveraging Arm Ethos-U NPUs. learning_objectives: - Explain how Topo deploys an application that spans Cortex-A, Cortex-M, and Ethos-U - - Prepare an NXP FRDM i.MX 93 board for remoteproc-runtime and shared-memory inference - - Clone and deploy the topo-imx93-npu-deployment template + - Deploy the topo-imx93-npu-deployment Template, which operates across Cortex-A, Cortex-M, and Ethos-U, to perform image classification using an ExecuTorch MobileNetV2 model - Describe how the Template is bootstrapped from Compose services, Remoteproc Runtime metadata, and Topo arguments - - Run image classification from a browser and verify that inference is executed by the Cortex-M33 firmware + - Understand how to take similar projects and create Topo Templates, including using Agent Skills prerequisites: - A host machine (x86 or Arm) with Linux, macOS, or Windows - - An NXP FRDM i.MX 93 target board accessible over SSH with root access - - Docker installed on the host and target. For installation steps, see [Install Docker](/install-guides/docker/). + - An NXP FRDM i.MX 93 target board with Linux setup, accessible over SSH with root access. To do this, see [Use Linux on the NXP FRDM i.MX 93 board](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/linux-nxp-board/). + - Docker installed on the host and target. For installation steps, see [Install Docker](https://learn.arm.com/install-guides/docker/). + - At least 25 GB of free disk space on the host if you are building without cache images. + - The Device Tree Compiler (`dtc`) installed on the host. - lscpu installed on the target (pre-installed on most Linux distributions) - - Topo installed on the host. For installation steps, see [Deploy containerized workloads to Arm-based Linux targets with Topo](/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/). + - Topo installed on the host. For installation steps, see [Deploy containerized workloads to Arm-based Linux targets with Topo](https://learn.arm.com/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/). - Basic familiarity with containers, SSH, and CLI tools + - (Optional) Access to an Agent, such as Codex, or Claude Code author: Tomas Agustin Gonzalez Orlando @@ -46,13 +44,6 @@ operatingsystems: - macOS - Windows -### Cross-platform metadata only -shared_path: true -shared_between: - - servers-and-cloud-computing - - laptops-and-desktops - - embedded-and-microcontrollers - further_reading: - resource: title: Topo repository diff --git a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/_next-steps.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_next-steps.md similarity index 100% rename from content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/_next-steps.md rename to content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_next-steps.md diff --git a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md similarity index 99% rename from content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/build-the-template.md rename to content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index b2c662e0ce..bf1b9078fb 100644 --- a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -42,7 +42,7 @@ Restart your agent after installing or updating the skills. You can then use the skills as part of the Template authoring flow. From the root of any Compose project, ask your agent to use `topo-template-bootstrap`: -```output +``` Use topo-template-bootstrap on this repository. Treat the root compose.yaml as the Template root. Preserve plain docker compose behavior. @@ -51,7 +51,7 @@ Add x-topo metadata only where it reflects the actual services, hardware require After bootstrap, ask the agent to use `topo-template-lint`: -```output +``` Use topo-template-lint on topo-imx93-npu-deployment. Validate compose.yaml against the Topo Template Format schema. Check README alignment, deployment_success_message, Remoteproc Runtime metadata, and x-topo.args wiring. diff --git a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md similarity index 70% rename from content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/deploy.md rename to content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index f99db902ef..71b4206f8f 100644 --- a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -1,6 +1,6 @@ --- -title: Deploy the project -weight: 3 +title: Clone and deploy the application with Topo +weight: 5 ### FIXED, DO NOT MODIFY layout: learningpathall @@ -38,6 +38,7 @@ Hardware Info: ✅ (lscpu) Subsystem Driver (remoteproc): ✅ (imx-rproc) ``` +{{% notice Note %}} If `remoteproc-runtime` is missing, install it with Topo: ```bash @@ -49,10 +50,11 @@ Run the health check again: ```bash topo health --target @ ``` +{{% /notice %}} ## Reserve memory in the device tree -The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for Ethos-U65. You are now going to modify the device tree and reboot the target so that these modifications take effect. +The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for the Ethos-U65. This prevents Linux from allocating memory that the Cortex-M33 firmware and Ethos-U65 need to access by physical address. You are now going to modify the device tree and reboot the target so that these modifications take effect. {{% notice Warning %}} Back up the board's original device tree before modifying it. The exact boot partition can differ between Linux images, so check the paths on your board before copying files. @@ -66,7 +68,7 @@ ssh @ 'cat /sys/firmware/fdt' > devicetree/live.dtb dtc -I dtb -O dts -o devicetree/live.dts devicetree/live.dtb ``` -Open `devicetree/live.dts` in an editor. +Open `devicetree/live.dts` in a text editor of your choice. Under `remoteproc-cm33`, add the CM33 power domain if it is not already present: @@ -100,7 +102,7 @@ Add `iomem=relaxed` to `chosen.bootargs`. For example: bootargs = "clk-imx93.mcore_booted console=ttyLP0,115200 earlycon root=/dev/mmcblk1p2 rootwait rw iomem=relaxed"; ``` -Build the patched device tree: +Return to your host machine terminal and build the patched device tree: ```bash dtc -I dts -O dtb -o devicetree/patched.dtb devicetree/live.dts @@ -124,7 +126,7 @@ sync reboot ``` -After the board reboots, run the Topo health check again from the host: +After the board reboots, run the Topo health check again from the host and verify everything is still correct: ```bash topo health --target @ @@ -147,22 +149,19 @@ IMX93_RUNNER_BUILD_CACHE_IMAGE Accept the defaults unless you have your own cache images. -Enter the project directory: - -```bash -cd topo-imx93-npu-deployment -``` - ## Deploy to the board +{{% notice Note %}} +If not pulling from the cache, the first build can take a long time and requires about 25 GB of free disk space. It downloads and builds ExecuTorch, the Arm GNU toolchain, MCUX SDK components, RPMsg-Lite, and the Cortex-M33 runner sources. Later builds are faster when Docker can reuse local cache layers or import the configured GHCR cache layers. +{{< /notice >}} + Deploy the project to your target: ```bash +cd topo-imx93-npu-deployment topo deploy --target @ ``` -If not pulling from the cache, the first build can take a long time and requires about 25 GB of free disk space. It downloads and builds ExecuTorch, the Arm GNU toolchain, MCUX SDK components, RPMsg-Lite, and the Cortex-M33 runner sources. Later builds are faster when Docker can reuse local cache layers or import the configured GHCR cache layers. - During deployment, Topo builds the required images, transfers them to the target, starts the Cortex-M33 firmware through `remoteproc-runtime`, and starts the web application. When deployment succeeds, the output includes a successful service startup. You can also check the deployed services: @@ -171,24 +170,23 @@ When deployment succeeds, the output includes a successful service startup. You topo ps --target @ ``` -## Open the web application - -Open the web application in a browser: +Your output should show a process on both the Cortex-M33, and the Linux Host, similar to below: ```output -http://:3001 +Image Status Processing Domain Address +topo-imx93-npu-deployment-cm33-runner Up 50 minutes imx-rproc +topo-imx93-npu-deployment-webapp Up 50 minutes Linux Host imx93-scorpio.cambridge.arm.com:3001, [::]:3001% ``` -The application shows: +## Open the web application -- an image selector -- a **Classify** button -- board prerequisite checks -- classification results -- an expandable analysis section with runtime details +Open the web application in a browser: -Select an image from an ImageNet-supported class, then click **Classify**. A successful run returns top-1 and top-5 ImageNet classifications. +``` +http://:3001 +``` +{{% notice Note %}} If you need to use a different target port, set `WEBAPP_PORT` when deploying: ```bash @@ -200,13 +198,32 @@ Then open: ```output http://:3002 ``` +{{< /notice >}} + +The application shows: + +- an image selector +- a **Classify** button +- board prerequisite checks +- classification results +- an expandable analysis section with runtime details You should see something similar to: +![Screenshot of the web interface running on an Arm-based target, showing an image and the model response. This confirms successful deployment and provides a visual reference for the expected result.#center](topo_npu_classifier.png "Image Classification Web App showing correctly classified German Shepherd") + +When you select an image in the browser and click **Classify**, the web application: -![Screenshot of the web interface running on an Arm-based target, showing an image and the model response. This confirms successful deployment and provides a visual reference for the expected result.#center](topo_npu_classifier.png "Image classification as seen in the web app") +1. Resizes and normalizes the image to classify into an input tensor compatible with the [MobileNetV2](https://arxiv.org/abs/1801.04381) model. +2. Writes the ExecuTorch `.pte` program and input tensor into reserved physical memory. +3. Sends a `RUN` command to the Cortex-M33 runner over `RPMsg`. +4. Waits for the Cortex-M33 firmware to run inference using Ethos-U65 acceleration. +5. Displays the top-1 and top-5 ImageNet classification results in the browser. + +Try this out with an image from an ImageNet-supported class. ## What you've accomplished -You have prepared an FRDM i.MX 93 board for shared-memory NPU inference, deployed the `topo-imx93-npu-deployment` Template with Topo, started Cortex-M33 firmware through `remoteproc-runtime`, and used a browser-based application to run MobileNetV2 classification with Ethos-U65 acceleration. -Next, you will review how this project is structured as a Topo Template. +You have prepared an FRDM i.MX 93 board for shared-memory NPU inference, deployed the `topo-imx93-npu-deployment` Template with Topo, started Cortex-M33 firmware through `remoteproc-runtime`, and used a browser-based application to stage the ExecuTorch `.pte` program and input tensor for MobileNetV2 classification with Ethos-U65 acceleration. + +You can now use the deployed application as a reference for your own heterogeneous Arm applications, or adapt the model, firmware runner, web interface, or Topo metadata for another target. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md new file mode 100644 index 0000000000..dd27918320 --- /dev/null +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md @@ -0,0 +1,73 @@ +--- +title: Overview - deploying an image classification app on i.MX 93 with Topo +weight: 2 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## What you'll learn + +In this Learning Path, you will deploy the [topo-imx93-npu-deployment](https://github.com/Arm-Examples/topo-imx93-npu-deployment) Topo Template to an NXP FRDM i.MX 93 board, and understand how this Topo Template was created. + +To refresh, [Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm used to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo Templates are the standardized format by which projects are deployed with Topo. + +The Topo Template builds and deploys a browser-based MobileNetV2 image classifier. The user interface runs on the Cortex-A (Linux) side of the SoC. The inference runner is packaged as Cortex-M33 firmware and is started by [remoteproc-runtime](https://github.com/arm/remoteproc-runtime). The model is exported to an [ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) `.pte` [file](https://docs.pytorch.org/executorch/stable/pte-file-format.html) for Ethos-U65 NPU acceleration. + +## Prerequisites + +Before getting started, ensure that your i.MX 93 board is set up with Linux and accessible over SSH. You can use this Learning Path as a guide: [Use Linux on the NXP FRDM i.MX 93 board](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/linux-nxp-board/). + +You should also be familiar with Topo and have it installed on your host development machine. You can complete the Learning Path [Deploy containerized workloads to Arm-based Linux targets with Topo](https://learn.arm.com/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/) to learn how to install Topo, run host and target health checks, inspect a target, list compatible Templates, and deploy a containerized workload. + +## (Optional) Background reading + +To understand more about Topo Templates, and how to create a basic Topo Template for a web application, you can complete the introductory [Create and deploy a custom Topo Template](https://learn.arm.com/learning-paths/cross-platform/create-your-own-topo-templates/) Learning Path. However, this is not required for this guide. + +For more background on the underlying NPU example, use the [Deploy ExecuTorch firmware on NXP FRDM i.MX 93 for Ethos-U65 acceleration](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/) Learning Path. This can help explain the model, firmware, and [Ethos-U65](https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65) execution flow. + +## What does the Template do? + +Deploying the Template starts two runtime services on the target: + +- `webapp`: Web application running on the Cortex-A Linux host. It receives an image input from the user and outputs the results of the ML image classification. +- `cm33-runner`: Cortex-M33 firmware that receives the image tensor from the web application, runs the compiled MobileNetV2 ExecuTorch `.pte` program, delegates supported operators to the Ethos-U65 NPU, and runs non-delegated operators on the Cortex-M33 CPU. + +## System Architecture + +The deployed application spans three processing domains on the i.MX 93: + +- **Cortex-A Linux host**: runs Docker, Topo-deployed containers, the Flask web app, and the Linux `remoteproc` and `RPMsg` interfaces. +- **Cortex-M33 firmware domain**: runs the ExecuTorch runner firmware loaded by `remoteproc-runtime`. +- **Ethos-U65 NPU**: accelerates delegated neural network operators from the ExecuTorch MobileNetV2 program. + +The high-level data flow is: + +```output +Browser + | + v +Flask web application on Cortex-A Linux + | + | writes .pte file and input tensor to reserved memory + | sends RUN over RPMsg + v +Cortex-M33 ExecuTorch runner firmware + | + | loads the .pte program from reserved memory + | delegates supported operators + v +Ethos-U65 NPU + | + v +Cortex-M33 returns classification results over RPMsg + | + v +Browser displays ImageNet top-1 and top-5 results +``` + +## What you've accomplished and what's next + +You now understand that the Topo Template deploys a Cortex-A web application, a Cortex-M33 ExecuTorch runner, and Ethos-U65 NPU acceleration as one heterogeneous application. You have also seen how inference uses reserved memory for the `.pte` program and input tensor, with `RPMsg` carrying commands and results between Cortex-A and Cortex-M33. + +Next, you will review the toolchains and runtime interfaces used by the Template. diff --git a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/topo_npu_classifier.png b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/topo_npu_classifier.png similarity index 100% rename from content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/topo_npu_classifier.png rename to content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/topo_npu_classifier.png diff --git a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md similarity index 73% rename from content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md rename to content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md index 0ffefc32f7..55634bbc7b 100644 --- a/content/learning-paths/cross-platform/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md @@ -1,6 +1,6 @@ --- title: Understand the toolchains -weight: 5 +weight: 3 ### FIXED, DO NOT MODIFY layout: learningpathall @@ -12,12 +12,14 @@ The `topo-imx93-npu-deployment` Template combines several toolchains. Topo hides ## ExecuTorch -[ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) is the PyTorch Edge runtime for deploying PyTorch models to edge devices, using any acceleration hardware that is available on the target device. In this Template, ExecuTorch is used in two places: +[ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) is PyTorch's runtime for deploying PyTorch models to edge devices. By using different backends within ExecuTorch, you can target specific hardware. For example, you can target Ethos-U65 by using the Ethos-U backend. To learn more about how the MobileNetV2 model was exported from PyTorch to ExecuTorch, and delegated to the Ethos-U, look at [Build ExecuTorch models for Ethos-U65](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte/). + +In this Template, ExecuTorch is used in two places: - At build time, the Template exports a MobileNetV2 model to an ExecuTorch `.pte` program. - At run time, the Cortex-M33 firmware loads and executes that `.pte` program. -The export pipeline uses the ExecuTorch Arm backend and targets `ethos-u65-256`. The model is quantized and lowered so supported neural network operators can be delegated to the Ethos-U65 NPU. The generated file is: +The export pipeline targets `ethos-u65-256`, which means the Ethos-U65 has 256 multiply-accumulate (MAC) units. The model is quantized and lowered so supported neural network operators can be delegated to the Ethos-U65 NPU. The generated file is: ```output mv2_ethosu65_256.pte @@ -77,10 +79,12 @@ The web application checks these ranges at startup through `/proc/device-tree`. ## Web application -The `webapp` service is a Python Flask application. It serves the browser UI, preprocesses selected images, stages memory for the images sent to the Cortex-M33 runner, sends inference commands over `RPMsg`, and renders the ImageNet top-1 and top-5 results. +The `webapp` service is a Python Flask application. It serves the browser UI, preprocesses selected images, stages the .pte program and input tensor in reserved memory, sends inference commands over `RPMsg`, and renders the ImageNet top-1 and top-5 results. By default, the service maps target port `3001` to container port `3000`. -## What you've accomplished +## What you've accomplished and what's next + +You now understand the major toolchains and runtime interfaces used by the Template: ExecuTorch, the Cortex-M33 firmware runner, remoteproc-runtime, RPMsg, reserved memory, and the Flask web application. You have also seen how the web application stages the `.pte` program and input data in reserved memory before sending inference commands to the Cortex-M33 firmware. -You now understand the major toolchains and runtime interfaces used by the Template: ExecuTorch, the Cortex-M33 firmware runner, remoteproc-runtime, RPMsg, reserved memory, and the Flask web application. +Next, you will review how the project is structured as a Topo Template, including the Compose services, build artifacts, Remoteproc Runtime metadata, and Topo arguments. From fac9f8e48deebc02cc1768ae190bc04961f7aa4e Mon Sep 17 00:00:00 2001 From: Matt Cossins Date: Mon, 15 Jun 2026 14:40:18 +0100 Subject: [PATCH 041/137] Set as draft --- .../deploy-ml-model-to-npu-with-topo/_index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index 70126c3508..2aa46987ca 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,6 +1,10 @@ --- title: Deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo +draft: true +cascade: + draft: true + description: Use Topo to deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. minutes_to_complete: 60 From f8f590e08b404fb27cb340baf2947b67456f6b8f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 10:06:02 -0500 Subject: [PATCH 042/137] more feedback-related updates --- content/install-guides/aws-cdk.md | 28 +++++++++++++++++-- .../aws-cdk/app.md | 14 +++++++++- .../aws-cdk/cdk.md | 5 ++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index fa6cf59078..d58b11865a 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -26,9 +26,33 @@ In this guide, you'll learn how to install the CDK CLI and verify that the CLI i ## Before you begin -Before you can use the AWS CDK, you need to set up AWS credentials and install the AWS CLI. For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys/) and [AWS CLI](/install-guides/aws-cli/) install guides. +Make sure that you have the AWS CLI installed: -To install the AWS CDK CLI, you'll need Node.js 22 or later. You'll also need to install prerequisites specific to the programming languages that you want to use. For more information about Node.js and language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. +```bash +aws --version +``` + +The output is similar to: + +```output +aws-cli/2.34.56 Python/3.14.5 Darwin/25.5.0 exe/arm64 +``` +For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys/) and [AWS CLI](/install-guides/aws-cli/) install guides. + +Make sure you have Node.js 22 or later installed: + +```bash +node --version +``` + +The output is similar to: + +```output +v26.2.0 +``` +If you don't have Node.js installed, or if the installed version is earlier than Node.js 22, download a suitable version from the [Node.js website](https://nodejs.org/en/download). + +You'll also need to install prerequisites specific to the programming languages that you want to use. For more information about language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. ## Install the AWS CDK CLI diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index e3b7cd6b03..a5569de4f3 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -13,7 +13,19 @@ In this section, you'll create a JavaScript CDK application that defines an Amaz ### Before you begin -Make sure that you've completed all prerequisite steps and installed the AWS CDK CLI. For more information, see the [AWS CDK install guide](/install-guides/aws-cdk). +Make sure that you've installed the AWS CDK CLI: + +```bash +cdk --version +``` + +The output is similar to: + +```output +2.1125.0 (build 71fd29e) +``` + +For instructions to set up and install the AWS CDK CLI, see the [AWS CDK install guide](/install-guides/aws-cdk). ### Initialize a CDK project diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index d91a8e5cf9..5607823f6e 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -35,6 +35,11 @@ Deploy the application: ```bash cdk deploy ``` +By default, the AWS CDK CLI will prompt you to approve IAM-related changes during deployment. To deploy the application without the need for approval, run: + +```bash +cdk deploy --require-approval never +``` The deployment can take a couple minutes to complete. When the deployment completes, the last couple lines of the output will include a URL to the web server and the load balancer's DNS name: From 11159742b76b0fd35615aca8cd52d2561adbeff5 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 10:19:11 -0500 Subject: [PATCH 043/137] adding metadata descriptions --- .../servers-and-cloud-computing/aws-cdk/_index.md | 2 +- .../learning-paths/servers-and-cloud-computing/aws-cdk/app.md | 3 ++- .../learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index ff053c1031..c4d5206a34 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -13,7 +13,7 @@ who_is_this_for: This is an introductory topic for software developers who want learning_objectives: - Create an example AWS CDK application in JavaScript - Define AWS infrastructure using the AWS CDK - - Deploy application resources on Arm-based AWS compute + - Deploy application resources on Arm-based AWS compute using Amazon ECS and the AWS CDK prerequisites: - An Amazon Web Services (AWS) account diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index a5569de4f3..8a959e0572 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -1,5 +1,6 @@ --- title: "Create a sample AWS CDK application" +description: Create a JavaScript AWS CDK application that defines an Amazon ECS service running on Arm-based AWS Fargate compute. weight: 2 layout: "learningpathall" @@ -98,4 +99,4 @@ module.exports = { ArmCdkAppStack }; You've now set up a sample application using AWS CDK. -Next, you'll use AWS CDK to synthesize and deploy the application. \ No newline at end of file +Next, you'll use AWS CDK to synthesize and deploy the application. diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 5607823f6e..e640bbd5ef 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -1,5 +1,6 @@ --- title: "Synthesize and deploy the sample AWS CDK application" +description: Synthesize, deploy, verify, and clean up a sample AWS CDK application running on Arm-based AWS Fargate compute. weight: 3 layout: "learningpathall" @@ -72,4 +73,4 @@ The cleanup process can take a couple minutes to complete. You've now synthesized and deployed a sample containerized application on Arm-based compute using Amazon ECS and the AWS CDK. After verifying that the deployment was successful, you cleaned up resources. -You can use this workflow to programmatically deploy and manage containerized applications on Arm-based compute powered by AWS Graviton processors. \ No newline at end of file +You can use this workflow to programmatically deploy and manage containerized applications on Arm-based compute powered by AWS Graviton processors. From da58dd14bd3f2f4a891c1a84d3244a0951e72a03 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 10:25:17 -0500 Subject: [PATCH 044/137] adding a link to Graviton material --- .../learning-paths/servers-and-cloud-computing/aws-cdk/app.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 8a959e0572..0daee4fb89 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -12,6 +12,8 @@ The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (Ia In this section, you'll create a JavaScript CDK application that defines an Amazon Elastic Container Service (ECS) service running on Arm-based AWS Fargate compute. +Arm-based AWS compute is powered by AWS Graviton processors. For more information about AWS Graviton, see [AWS Graviton processors](https://aws.amazon.com/ec2/graviton/). + ### Before you begin Make sure that you've installed the AWS CDK CLI: From 967f4f4eb724dcbf25d417a7804552ebccc7e146 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 10:38:52 -0500 Subject: [PATCH 045/137] updating link --- .../learning-paths/servers-and-cloud-computing/aws-cdk/app.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 0daee4fb89..5ac8682162 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -12,7 +12,7 @@ The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (Ia In this section, you'll create a JavaScript CDK application that defines an Amazon Elastic Container Service (ECS) service running on Arm-based AWS Fargate compute. -Arm-based AWS compute is powered by AWS Graviton processors. For more information about AWS Graviton, see [AWS Graviton processors](https://aws.amazon.com/ec2/graviton/). +Arm-based AWS compute is powered by AWS Graviton processors. For more information about AWS Graviton, see [Level up your compute with AWS Graviton](https://aws.amazon.com/ec2/graviton/level-up-with-graviton/). ### Before you begin From 512cbd2609df16c620be450156e8f3eb67ebcd88 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 10:57:20 -0500 Subject: [PATCH 046/137] encasing duration in note --- .../aws-cdk/cdk.md | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index e640bbd5ef..652974dd24 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -36,13 +36,19 @@ Deploy the application: ```bash cdk deploy ``` -By default, the AWS CDK CLI will prompt you to approve IAM-related changes during deployment. To deploy the application without the need for approval, run: +By default, the AWS CDK CLI will prompt you to approve IAM-related changes during deployment. + +For the AWS CDK CLI to deploy the application without the need for approval, set the `--require-approval` flag to `never` during deployment: ```bash cdk deploy --require-approval never ``` -The deployment can take a couple minutes to complete. When the deployment completes, the last couple lines of the output will include a URL to the web server and the load balancer's DNS name: +{{% notice Note %}} +The deployment can take a couple minutes to complete. +{{% /notice %}} + +When the deployment completes, the last couple lines of the output will include a URL to the web server and the load balancer's DNS name: ```output Outputs: @@ -65,9 +71,17 @@ After you've validated the deployment, clean up the AWS resources that you creat ```bash cdk destroy ``` -When AWS CDK asks whether to delete `ArmCDKAppStack`, enter `y`. +By default, the AWS CDK CLI will prompt you to approve the deletion of `ArmCDKAppStack`. + +For the AWS CDK CLI to clean up resources without the need for approval, use the `--force` or `-f` flag: + +```bash +cdk destroy -f +``` +{{% notice Note %}} The cleanup process can take a couple minutes to complete. +{{% /notice %}} ## What you've accomplished From 1e399549206cee5d269902c1f00ae6b59966bc2e Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 11:07:49 -0500 Subject: [PATCH 047/137] updates to index.md --- .../servers-and-cloud-computing/aws-cdk/_index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index c4d5206a34..86736128e9 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -32,9 +32,11 @@ armips: operatingsystems: - Linux tools_software_languages: - - AWS CDK + - AWS CDK CLI + - Amazon Elastic Container Service (Amazon ECS) - AWS CLI - Node.js + - JavaScript further_reading: - resource: From b210df7a3de5142b0776b3de2bed3cb0a296fc41 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 12:26:10 -0500 Subject: [PATCH 048/137] some updates to previously-generated skills --- .github/skills/audit-images/SKILL.md | 21 +++++++++-------- .github/skills/code-sample-review/SKILL.md | 23 +++++++++---------- .../metadata-description-update/SKILL.md | 12 +++++----- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/skills/audit-images/SKILL.md b/.github/skills/audit-images/SKILL.md index d7aca00d8b..2713b57894 100644 --- a/.github/skills/audit-images/SKILL.md +++ b/.github/skills/audit-images/SKILL.md @@ -41,7 +41,7 @@ Use project-level review to: - Identify high-priority directories or files for cleanup. - Produce a before/after baseline for tracking progress. -Do not mass-edit the whole project unless the user explicitly asks. Prefer reporting the project-level inventory and then fixing one Path, guide, category, or batch. +Don't mass-edit the whole project unless the user explicitly asks. Prefer reporting the project-level inventory and then fixing one Path, guide, category, or batch. ### Path/guide-level review @@ -60,22 +60,23 @@ Use path/guide-level review to: 1. Identify whether the requested scope is project-level or path/guide-level. 2. Run `.github/skills/audit-images/scripts/audit_images.py` on that scope. 3. Record the baseline summary: total images, faulty images, content units affected, and issue counts. -4. For project-level requests, summarize the results and suggest prioritized cleanup batches unless the user asked for edits. -5. For path/guide-level edit requests, inspect the relevant Markdown context and image files. -6. Rewrite deficient alt text using `references/image-guidance.md`. -7. Preserve the repository image syntax, especially `![Descriptive alt text#center](image.png "Optional caption")`. -8. Re-run the audit on the same scope. -9. Report before/after counts, files changed, and any remaining issues. +4. Depending on the request level, do the following: + - For project-level requests, summarize the results and suggest prioritized cleanup batches unless the user asked for edits. + - For path/guide-level edit requests, inspect the relevant Markdown context and image files. +5. Suggest rewrites for deficient alt text using `references/image-guidance.md`. +6. After the reviewer accepts suggestions, rewrite text, then re-run the audit on the same scope. +7. Report before/after counts, files changed, and any remaining issues. ## Validation rules - Treat the script as a detector, not the final authority. It flags likely problems for review. -- Do not replace meaningful alt text only because it is long or short; judge whether it helps the learner complete the task. -- Do not use placeholders such as `alt-txt`, `alt-text`, `image`, `img1`, `screenshot`, `graph`, or `output`. -- Do not use captions as a substitute for alt text. +- Don't replace meaningful alt text only because it is long or short; judge whether it helps the learner complete the task. +- Don't use placeholders such as `alt-txt`, `alt-text`, `image`, `img1`, `screenshot`, `graph`, or `output`. +- Don't use captions as a substitute for alt text. - Keep `#center` attached directly to the alt text with no space before it. - Preserve valid local image paths and existing captions unless they are wrong, vague, or outdated. - Avoid `Figure 1:` style captions unless the content uses explicit numbered cross-references. +- Preserve the repository image syntax, especially `![Descriptive alt text#center](image.png "Optional caption")` ## Error handling diff --git a/.github/skills/code-sample-review/SKILL.md b/.github/skills/code-sample-review/SKILL.md index 6a8c5bd0af..bac4703969 100644 --- a/.github/skills/code-sample-review/SKILL.md +++ b/.github/skills/code-sample-review/SKILL.md @@ -7,14 +7,13 @@ description: Review and improve code samples, commands, command output, and fenc Use this skill to review or edit code samples, commands, command output, and fenced code blocks in Arm Learning Paths and install guides. -This skill can support either editorial review or technical review. Match the depth of review to the user's request and do not invent commands, outputs, workflows, package names, benchmark numbers, or validation results. +This skill can support either editorial review or technical review. Match the depth of review to the user's request and don't invent commands, outputs, workflows, package names, benchmark numbers, or validation results. ## Prerequisites - Work from the repository root. - Read `AGENTS.md` to locate shared guidance. - Read `references/code-sample-guidance.md` before reviewing or editing code samples. -- When the review depends on content type, also read the matching Learning Path or install guide guidance. ## Modes @@ -47,18 +46,18 @@ Check for: ## Workflow 1. Identify the review scope and whether the request is editorial, technical, or mixed. -2. Load only the content-type guidance needed for the target files. -3. Inspect surrounding prose before judging a code block; code samples should be evaluated in context. -4. For review requests, report issues by file and line when possible, ordered by learner impact. -5. For edit requests, report issues and suggest focused changes that preserve technical intent and existing repository patterns. -6. Do not modify commands or output unless the correction is supported by context, documentation, or an executable check. -7. After the reviewer accepts suggestions, re-scan edited areas for code fence integrity, language tags, and output lead-ins. -8. Report what changed and note any technical assumptions or checks not performed. +2. Inspect surrounding prose before judging a code block; code samples should be evaluated in context. +3. For review requests, report issues by file and line when possible, ordered by learner impact. +4. For edit requests, report issues and suggest focused changes that preserve technical intent and existing repository patterns. +5. After the reviewer accepts suggestions, make changes, then re-scan edited areas for code fence integrity, language tags, and output lead-ins. +6. Report what changed and note any technical assumptions or checks not performed. ## Validation rules - Preserve front matter, Hugo shortcodes, Markdown structure, command syntax, and expected output unless they are the target of the edit. -- Do not rewrite meaningful code solely for style. -- Do not replace tool-native terms, casing, flags, package names, or architecture strings with prose preferences. -- Do not treat long code or output as a problem by itself; flag it only when it reduces learning value or obscures the task. +- Don't rewrite meaningful code solely for style. +- Don't replace tool-native terms, casing, flags, package names, or architecture strings with prose preferences. +- Don't treat long code or output as a problem by itself; flag it only when it reduces learning value or obscures the task. - Keep edits scoped to code sample quality unless the user asks for broader content review. +- Don't modify commands or output unless the reviewer accepts the suggestions. +- Don't hallucinate corrections that aren't supported by context, documentation, or an executable check. diff --git a/.github/skills/metadata-description-update/SKILL.md b/.github/skills/metadata-description-update/SKILL.md index d39fa25bd4..b2e8f76391 100644 --- a/.github/skills/metadata-description-update/SKILL.md +++ b/.github/skills/metadata-description-update/SKILL.md @@ -13,7 +13,7 @@ This skill is for search and discovery metadata. For draft visibility metadata, - Work from the repository root. - Read `AGENTS.md` to locate shared guidance. -- Read `.github/skills/arm-content-editor/references/content-quality.md`. +- Read `.github/skills/arm-content-editor/references/content-quality.md` for general project content quality guidance. - For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md`. - For install guides, read `.github/skills/arm-content-editor/references/install-guide-guidance.md`. @@ -33,7 +33,7 @@ This skill is for search and discovery metadata. For draft visibility metadata, 2. Find target Markdown files from the scope rules. 3. Skip `_next-steps.md` and any file without front matter unless the user explicitly asks how to handle it. 4. Read the title, existing description, headings, introduction, task flow, code or command context, and validation or conclusion. -5. Add or revise the `description` field in front matter. +5. Add or revise the `description` field in front matter based on quality rules. 6. Re-open or search the edited files to verify each changed target has one `description` field. 7. Report files changed and note any skipped files. @@ -43,10 +43,10 @@ This skill is for search and discovery metadata. For draft visibility metadata, - Keep it concise, developer-focused, and suitable for a search snippet. - Use natural Arm-specific terms when relevant. - State what the reader will do, the main tool or platform, and the useful outcome. -- Do not repeat the title verbatim. -- Do not use vague summaries such as `Learn about...` unless the page is genuinely conceptual. -- Do not use marketing language, hype, or keyword stuffing. -- Do not invent capabilities, performance claims, supported platforms, or tools not supported by the page. +- Don't repeat the title verbatim. +- Don't use vague summaries such as `Learn about...` unless the page is genuinely conceptual. +- Don't use marketing language, hype, or keyword stuffing. +- Don't invent capabilities, performance claims, supported platforms, or tools not supported by the page. - Use valid YAML. Quote the description only when needed for YAML syntax. ## Examples From 66cc7039069aa7c6b46700c5a4b52ea310422141 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 14:16:47 -0500 Subject: [PATCH 049/137] updates --- .github/review-guidelines.md | 62 +-- .github/skills/arm-content-editor/SKILL.md | 8 +- .github/skills/link-text-review/SKILL.md | 66 +++ .../skills/markdown-component-edit/SKILL.md | 35 ++ .../references/component-patterns.md | 102 ++++ .github/skills/stale-content-review/SKILL.md | 81 ++++ .../references/staleness-signals.md | 98 ++++ .../scripts/stale_content_scan.py | 438 ++++++++++++++++++ AGENTS.md | 6 + 9 files changed, 850 insertions(+), 46 deletions(-) create mode 100644 .github/skills/link-text-review/SKILL.md create mode 100644 .github/skills/markdown-component-edit/SKILL.md create mode 100644 .github/skills/markdown-component-edit/references/component-patterns.md create mode 100644 .github/skills/stale-content-review/SKILL.md create mode 100644 .github/skills/stale-content-review/references/staleness-signals.md create mode 100755 .github/skills/stale-content-review/scripts/stale_content_scan.py diff --git a/.github/review-guidelines.md b/.github/review-guidelines.md index c41c92ff8b..30556e2656 100644 --- a/.github/review-guidelines.md +++ b/.github/review-guidelines.md @@ -1,45 +1,17 @@ -### Maintenance checks for Learning Paths and Install Guides - -Please review the content in the specified content path and support my manual review by: - -1. **Summarizing what this guide does** - - What the end goal is - - What platform(s) and environments it targets - - Any key assumptions the reader must meet - -2. **Identifying dependencies and moving parts** - - OS, architecture, toolchains, frameworks, SDKs - - External repositories, models, downloads, or services - - Commands or workflows that are central to the guide - -3. **Flagging potential risk areas** - - References to old OS versions, runtimes, or toolchains - - Dependencies that may be stale, deprecated, or fragile - - Links or resources that might require checking - - Steps that rely heavily on UI flows or screenshots - -4. **Calling out anything that may need a closer human look** - - Ambiguous or unclear instructions - - Areas where “latest” or unpinned versions are used - - Places where ecosystem changes could affect correctness - ---- - -### How to behave - -- Be conservative and transparent — if something is uncertain, say so. -- Prefer **flagging** over **fixing**. -- Do not invent new commands, tools, or workflows. -- If suggesting changes, keep them minimal and clearly optional. -- Treat this as a *conversation starter* for the reviewer, not a final verdict. - ---- - -### Output format (keep it lightweight) - -Please respond with: -- A short summary of the guide -- A bulleted list of dependencies -- A bulleted list of review flags or questions to consider - -No code changes are required unless I explicitly ask for them. \ No newline at end of file +# Maintenance review guidance + +Use `.github/skills/stale-content-review/SKILL.md` for stale-content risk scans and maintenance triage. + +The skill includes: + +- A periodic scan workflow for Learning Paths and install guides. +- A deterministic script for finding likely stale-content signals. +- Reference guidance for interpreting temporal wording, screenshots, mutable dependencies, external links, old dates, and version-sensitive content. + +For one-off manual reviews, run: + +```bash +python3 .github/skills/stale-content-review/scripts/stale_content_scan.py +``` + +No content changes are required unless explicitly requested. diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index 83bd6dca94..ccb3aa4acf 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -21,6 +21,9 @@ Read only the guidance needed for the task: - Learning Paths: `references/learning-path-guidance.md` - Install guides: `references/install-guide-guidance.md` - Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` +- Markdown components: `.github/skills/markdown-component-edit/SKILL.md` +- Accessible link text: `.github/skills/link-text-review/SKILL.md` +- Stale content risk scans: `.github/skills/stale-content-review/SKILL.md` - Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` - Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` @@ -33,7 +36,10 @@ Read only the guidance needed for the task: 5. Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. 6. Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. 7. Use the metadata description skill for focused `description` field updates. -8. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. +8. Use the Markdown component skill for focused links, tables, notices, tab panes, and component syntax edits. +9. Use the link text review skill for focused accessible anchor text cleanup. +10. Use the stale content review skill for periodic maintenance scans and freshness triage. +11. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. Do not recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. diff --git a/.github/skills/link-text-review/SKILL.md b/.github/skills/link-text-review/SKILL.md new file mode 100644 index 0000000000..6283c035f1 --- /dev/null +++ b/.github/skills/link-text-review/SKILL.md @@ -0,0 +1,66 @@ +--- +name: link-text-review +description: Review and improve accessible Markdown link text in Arm Learning Paths and install guides. Use when asked to find vague links, fix link text such as here or click here, verify internal links, improve screen-reader clarity, or make links descriptive and task-focused. +--- + +# Link text review + +Use this skill to review or improve Markdown link text so links are descriptive, accessible, and useful out of context. + +This skill focuses on anchor text and link clarity. For tables, notices, tab panes, and other structural Markdown components, use `.github/skills/markdown-component-edit/SKILL.md`. + +## Prerequisites + +- Work from the repository root. +- Read `AGENTS.md` only if you need repository routing context. +- Read `.github/skills/arm-content-editor/references/writing-style.md` only when changing prose around links beyond the anchor text. +- For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md` when link placement or `further_reading` is involved. + +## Workflow + +1. Identify the target file, directory, section, or selected text. +2. Read surrounding context before changing link text. +3. Find vague anchors such as `here`, `click here`, `this page`, `read more`, `link`, bare URLs, or repeated generic text. +4. Verify internal links before editing when practical. +5. Rewrite anchor text to describe the destination, action, or resource. +6. Preserve the URL unless it is broken or the user asks to change it. +7. Keep anchor text concise and natural in the sentence. +8. Re-open or search changed lines to verify the Markdown link syntax is valid. +9. Report changed links and any links not verified. + +## Quality rules + +- Link text should make sense without nearby words when possible. +- Prefer destination-specific anchors such as `Docker install guide`, `Arm Developer resources`, or `Google Cloud firewall rules`. +- Avoid anchors that only describe the mechanic, such as `click here`, `this link`, or `website`. +- Avoid overlong anchors that wrap a whole sentence. +- Use full internal paths, such as `/learning-paths/category/path-name/`. +- Use full URLs for external sites that are not on `learn.arm.com`. +- Don't change product names, tool names, URLs, or technical meaning to satisfy prose preferences. +- Don't add speculative links. Verify internal targets or state when verification was not possible. + +## Examples + +Poor: + +```md +See [here](/install-guides/docker/) for setup. +``` + +Better: + +```md +See the [Docker install guide](/install-guides/docker/) for setup. +``` + +Poor: + +```md +A list of all AWS instance types can be [viewed here](https://aws.amazon.com/ec2/instance-types/). +``` + +Better: + +```md +See the [Amazon EC2 instance types](https://aws.amazon.com/ec2/instance-types/) for a complete list. +``` diff --git a/.github/skills/markdown-component-edit/SKILL.md b/.github/skills/markdown-component-edit/SKILL.md new file mode 100644 index 0000000000..fdc84c352c --- /dev/null +++ b/.github/skills/markdown-component-edit/SKILL.md @@ -0,0 +1,35 @@ +--- +name: markdown-component-edit +description: Add or update structured Markdown and Hugo components in Arm Learning Paths and install guides. Use when asked to turn selected text into a link, table, notice, tab pane, code pane, shortcode block, or other repo-specific Markdown component while preserving surrounding content. +--- + +# Markdown component edit + +Use this skill to make focused structural edits to Markdown and Hugo components in Arm Learning Paths and install guides. + +This skill is best when the user highlights text, names a section, or asks for a specific component. It shouldn't decide that content needs a component during broad editorial review unless the user asks. + +## Prerequisites + +- Work from the repository root. +- Read `AGENTS.md` to locate shared guidance. +- Read `references/component-patterns.md` before adding or changing notices, tables, tabs, or other structured components. +- Use `.github/skills/code-sample-review/SKILL.md` for code panes, command examples, command output, language tags, or code fence integrity. + +## Workflow + +1. Use the user's highlighted, selected, or explicitly named text as the edit target.If the target is ambiguous, ask for the exact text, file, or section before editing. +2. Inspect nearby Markdown so the new component fits the surrounding flow. +3. Verify internal links before adding or changing them when practical. +4. After making an update, re-open or search the edited area to verify shortcode pairs, table rows, links, and code fences are well formed. +5. Report the component added or changed and note any links or syntax that could not be verified. + +## Component rules + +- Notices are for notes, warnings, tips, troubleshooting, platform-specific context, or important constraints. +- Tables are for comparison, lookup, short structured reference, or option summaries. Avoid tables for sequential instructions. +- Tab panes are for mutually exclusive alternatives such as operating systems, shells, package managers, or platform-specific code. +- Links should use descriptive anchor text. Use the link text review skill for broader cleanup. +- Don't convert content into a component if a plain paragraph or list is clearer. Keep the component small and purposeful +- Preserve front matter, shortcodes, code fences, commands, expected output, and existing file structure. +- Use local examples before adding unfamiliar Hugo shortcode syntax. diff --git a/.github/skills/markdown-component-edit/references/component-patterns.md b/.github/skills/markdown-component-edit/references/component-patterns.md new file mode 100644 index 0000000000..66036c9e47 --- /dev/null +++ b/.github/skills/markdown-component-edit/references/component-patterns.md @@ -0,0 +1,102 @@ +# Component patterns + +Use these patterns when adding or editing structured Markdown and Hugo components. + +## Notices + +Use notice shortcodes for information that needs visual emphasis. + +```md +{{% notice Note %}} +The following commands use version 1.2.3. The same commands work with other versions. +{{% /notice %}} +``` + +Common labels include `Note`, `Tip`, `Warning`, `Important`, `Troubleshooting`, and short contextual labels such as `Network security`. + +Rules: + +- Keep opening and closing shortcodes on separate lines for multi-sentence content. +- Keep the label concise and descriptive. +- Don't use notices for ordinary transitions or filler. +- Don't nest notices inside lists unless the surrounding file already uses that pattern and indentation is correct. +- Preserve shortcode spacing: `{{% notice Note %}}` and `{{% /notice %}}`. + +## Tables + +Use Markdown tables for compact comparisons and lookup information. + +```md +| Tool | Purpose | Verification command | +|------|---------|----------------------| +| `skopeo` | Inspect and copy container images | `skopeo --help` | +| `perf` | Collect Linux performance data | `perf --help` | +``` + +Rules: + +- Use a header row and separator row. +- Keep headers short and descriptive. +- Keep each row parallel. +- Use code formatting for commands, file names, flags, package names, and variables. +- Avoid long prose in cells. If a cell needs multiple sentences, use a paragraph or list instead. +- Avoid tables for ordered procedures. + +## Code tab panes + +Use `tabpane code=true` for platform-specific commands or code alternatives. + +```md +{{< tabpane code=true >}} + {{< tab header="Ubuntu" language="bash">}} +sudo apt update +sudo apt install -y example + {{< /tab >}} + {{< tab header="macOS" language="bash">}} +brew install example + {{< /tab >}} +{{< /tabpane >}} +``` + +Rules: + +- Use clear tab labels such as `Ubuntu`, `Fedora`, `macOS`, or `Windows PowerShell`. +- Use `language` when the surrounding examples use it. +- Keep alternatives parallel. +- Use the code sample review skill for command accuracy, output, code panes, and code fence integrity. + +## Non-code tab panes + +Use `tabpane-normal` or `tabpane code=false` for non-code alternatives. + +```md +{{< tabpane-normal >}} + {{< tab header="Podman" >}} +Use Podman when you need a daemonless container runtime. + {{< /tab >}} + {{< tab header="Finch" >}} +Use Finch when you need a lightweight container runtime on macOS. + {{< /tab >}} +{{< /tabpane-normal >}} +``` + +Rules: + +- Use non-code tabs only when the alternatives are mutually exclusive. +- Keep each tab roughly comparable in length and detail. +- Avoid hiding critical sequential instructions inside tabs unless the user chooses one path. + +## Links + +Use descriptive link text. + +```md +See the [Docker install guide](/install-guides/docker/) to set up a container runtime. +``` + +Rules: + +- Verify internal links when practical. +- Use full internal paths, such as `/learning-paths/category/path-name/`. +- Use full URLs for external sites that are not on `learn.arm.com`. +- Avoid vague anchors such as `here`, `click here`, `this page`, `read more`, or `link`. diff --git a/.github/skills/stale-content-review/SKILL.md b/.github/skills/stale-content-review/SKILL.md new file mode 100644 index 0000000000..5547bf49ef --- /dev/null +++ b/.github/skills/stale-content-review/SKILL.md @@ -0,0 +1,81 @@ +--- +name: stale-content-review +description: Scan Arm Learning Paths and install guides for stale-content risk. Use when the user asks to periodically flag content that may need maintenance, freshness review, dependency drift review, screenshot or UI review, latest or unpinned version review, or a report of likely stale pages. +--- + +# Stale content review + +Use this skill to find Learning Paths and install guides that may need human maintenance review. This skill is report-only by default: flag risk, provide evidence, and leave fixes to the relevant owner unless the user explicitly asks for edits. + +## Prerequisites + +- Work from the repository root. +- Read `AGENTS.md` if routing or related skill selection is unclear. +- Read `references/staleness-signals.md` before interpreting scan results. + +## Workflow + +1. Identify the review scope. For periodic scans, default to `content/learning-paths` and `content/install-guides`. +2. Run `scripts/stale_content_scan.py` for a deterministic first pass. +3. Review the highest-scoring files and sample lines before drawing conclusions. +4. Summarize what each selected guide or page does, the dependencies or moving parts it relies on, and the review flags a human should consider. +5. Use related skills for focused follow-up: + - `audit-images` for screenshot, image, alt text, and caption review. + - `code-sample-review` for commands, package installs, outputs, and code fence integrity. + - `arm-content-editor` for Arm terminology, product naming, and broader content judgment. + - `link-text-review` for stale or vague external links that also need accessible anchor text. + +## Validation rules + +- Treat scan output as a triage queue, not proof that content is wrong. +- Do not invent replacement commands, versions, links, or product guidance. +- Do not open issues, move project cards, or edit content unless the user asks. +- Flag mutable dependencies, screenshots, UI flows, external services, unpinned versions, old dates, and version-specific instructions as review candidates. +- Be explicit when a flag is uncertain or only a heuristic signal. +- Keep periodic scan output lightweight enough for a reviewer to act on. +- Prefer questions and maintenance prompts over direct edits. + +## Script usage + +Run the default content scan: + +```bash +python3 .github/skills/stale-content-review/scripts/stale_content_scan.py +``` + +The default broad scan reports files with score 20 or higher. Use `--min-score` to widen or narrow the queue. + +Scan one Learning Path or install guide: + +```bash +python3 .github/skills/stale-content-review/scripts/stale_content_scan.py content/install-guides/acfl.md +``` + +Write a Markdown report: + +```bash +python3 .github/skills/stale-content-review/scripts/stale_content_scan.py --output stale-content-risk-report.md +``` + +Write JSON for later processing: + +```bash +python3 .github/skills/stale-content-review/scripts/stale_content_scan.py --format json --output stale-content-risk-report.json +``` + +Include draft content when preparing unpublished material for review: + +```bash +python3 .github/skills/stale-content-review/scripts/stale_content_scan.py --include-drafts +``` + +## Periodic workflow + +`.github/workflows/stale-content-scan.yml` runs the broad scan every Monday at 10:00 UTC. It writes the first part of the report to the workflow summary and uploads the full Markdown report as `stale-content-risk-report`. + +## Error handling + +- If the scan returns too many candidates, increase `--min-score` or scan a narrower path. +- If a broad periodic scan returns too few candidates, lower `--min-score` to 15 or 12. +- If a file scores highly because of generated output or intentional version pinning, mark it as a lower-priority false positive in the review summary. +- If the workflow artifact is empty or unexpectedly small, rerun the script locally with the same path and threshold. diff --git a/.github/skills/stale-content-review/references/staleness-signals.md b/.github/skills/stale-content-review/references/staleness-signals.md new file mode 100644 index 0000000000..0682f28955 --- /dev/null +++ b/.github/skills/stale-content-review/references/staleness-signals.md @@ -0,0 +1,98 @@ +# Staleness signals + +Use this reference to interpret stale-content scan results for Arm Learning Paths and install guides. + +## Review posture + +- Be conservative and transparent. +- Prefer flagging over fixing. +- Treat the report as a conversation starter for the content owner. +- Do not invent new commands, tools, workflows, benchmark numbers, product names, or version guidance. +- Suggest minimal follow-up only when the risk is clear. + +## Useful review summary + +For each high-priority guide or page, provide: + +- A short summary of what the content helps the learner do. +- The platforms, environments, tools, SDKs, frameworks, services, models, repositories, and commands it depends on. +- A short list of flags or questions for a human reviewer. + +## Signals to flag + +### Temporal language + +Flag wording that may become stale, including: + +- `currently` +- `latest` +- `recently` +- `newly` +- `preview` +- `beta` +- `at the time of writing` +- `as of` +- `currently supports` + +These words are not always wrong. They tell the reviewer to check whether the claim still holds. + +### Mutable installs and downloads + +Flag commands or links that depend on moving targets: + +- `curl` or `wget` install scripts +- `latest` release URLs +- Package manager installs without an explicit version when exact reproducibility matters +- Container images tagged `latest` +- GitHub default branch clones or raw file downloads +- Nightly, preview, beta, or experimental packages + +### Version-specific dependencies + +Flag version-specific references that may need periodic verification: + +- OS versions and distro versions +- Runtime and compiler versions +- SDK, framework, and toolchain versions +- Cloud VM sizes, instance families, and processor names +- Model names, model IDs, container tags, and benchmark output + +### Screenshots and UI flows + +Screenshots are high maintenance risk when they show: + +- Cloud consoles +- Web dashboards +- IDEs or extensions +- Vendor portals +- Menus, dialogs, forms, buttons, tabs, or settings pages + +Use the image audit skill for detailed alt text, caption, and `#center` syntax review. Use this skill to decide whether the screenshot itself should be rechecked. + +### External dependencies + +Flag external links when they point to: + +- Official documentation with moving versioned content +- Release pages +- Download pages +- Pricing pages +- Support matrices +- GitHub repositories or examples +- Model repositories or hosted services + +External links are often valid; the review question is whether the linked target still supports the content's claim. + +### Dates and generated output + +Flag old dates, generated output timestamps, benchmark reports, and command output that may have been captured from an older environment. These are often acceptable examples, but they should be checked when they support a technical claim. + +## Prioritization + +Prioritize content for human review when several signals appear together, such as: + +- Screenshot-heavy UI instructions plus cloud-console steps. +- `latest` wording plus command output with a specific old version. +- External release links plus unpinned install commands. +- Product or VM names plus provider-specific setup steps. +- Old dates plus benchmark, support, or compatibility claims. diff --git a/.github/skills/stale-content-review/scripts/stale_content_scan.py b/.github/skills/stale-content-review/scripts/stale_content_scan.py new file mode 100755 index 0000000000..6929bfe315 --- /dev/null +++ b/.github/skills/stale-content-review/scripts/stale_content_scan.py @@ -0,0 +1,438 @@ +#!/usr/bin/env python3 +"""Scan Arm Learning Path content for stale-content risk signals.""" + +from __future__ import annotations + +import argparse +import csv +import datetime as dt +import json +import re +import sys +from collections import Counter, defaultdict +from pathlib import Path + + +DEFAULT_PATHS = ["content/learning-paths", "content/install-guides"] + +RULES = [ + { + "id": "temporal-language", + "score": 2, + "allow_code": False, + "reason": "Temporal wording may need freshness review.", + "pattern": re.compile( + r"\b(currently|current support|currently supports?|latest|recently|newly|" + r"at the time of writing|as of|today)\b", + re.IGNORECASE, + ), + }, + { + "id": "preview-or-beta", + "score": 3, + "allow_code": True, + "reason": "Preview, beta, nightly, or experimental content often changes quickly.", + "pattern": re.compile(r"\b(preview|beta|nightly|experimental|deprecated)\b", re.IGNORECASE), + }, + { + "id": "mutable-download", + "score": 4, + "allow_code": True, + "reason": "Install scripts, release downloads, or raw URLs can change without this content changing.", + "pattern": re.compile( + r"\b(curl|wget|Invoke-WebRequest|iwr)\b.*\b(latest|releases?|download|raw|install\.sh|script)\b|" + r"\b(latest|releases?|download|raw|install\.sh|script)\b.*\b(curl|wget|Invoke-WebRequest|iwr)\b", + re.IGNORECASE, + ), + }, + { + "id": "floating-container-tag", + "score": 3, + "allow_code": True, + "reason": "Container tags that point to latest can drift over time.", + "pattern": re.compile(r"\b[\w./-]+:latest\b", re.IGNORECASE), + }, + { + "id": "unpinned-package-install", + "score": 2, + "allow_code": True, + "reason": "Unpinned package installs may change as package repositories change.", + "pattern": re.compile( + r"\b(pip3?\s+install|python3?\s+-m\s+pip\s+install|npm\s+(?:install|i)|" + r"apt(?:-get)?\s+install|dnf\s+install|yum\s+install|brew\s+install|" + r"go\s+install|cargo\s+install)\b", + re.IGNORECASE, + ), + }, + { + "id": "version-specific-dependency", + "score": 2, + "allow_code": False, + "reason": "Version-specific dependency claims may need periodic verification.", + "pattern": re.compile( + r"\b(Ubuntu|Debian|Fedora|RHEL|Rocky Linux|Amazon Linux|macOS|Windows|" + r"Python|Node(?:\.js)?|npm|Java|JDK|Go|Rust|LLVM|GCC|CUDA|PyTorch|" + r"TensorFlow|Kubernetes|Docker|Terraform|OpenSSL|CMake)\s+" + r"(?:version\s*)?v?\d+(?:\.\d+){0,2}\b", + re.IGNORECASE, + ), + }, + { + "id": "external-moving-link", + "score": 2, + "allow_code": True, + "reason": "External release, download, docs, pricing, or support URLs may need checking.", + "pattern": re.compile( + r"https?://docs\.[^\s)\]\"]+|" + r"https?://[^\s)\]\"]*(?:latest|releases?|download|documentation|pricing|support|docs[./_-])[^\s)\]\"]*", + re.IGNORECASE, + ), + }, +] + +IMAGE_RE = re.compile(r"!\[([^\]]*)\]\(([^)\s]+)(?:\s+\"([^\"]*)\")?\)") +DATE_RE = re.compile(r"\b(20\d{2})[-/](\d{1,2})[-/](\d{1,2})\b") +FENCE_RE = re.compile(r"^\s*(```|~~~)") + +UI_IMAGE_WORDS = re.compile( + r"\b(screenshot|screen shot|console|portal|dashboard|ui|ide|visual studio|vs code|" + r"browser|dialog|menu|form|button|tab|settings|wizard|page|preview|extension)\b", + re.IGNORECASE, +) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Scan content for stale-maintenance risk signals.") + parser.add_argument("paths", nargs="*", default=DEFAULT_PATHS, help="Files or directories to scan.") + parser.add_argument("--format", choices=["markdown", "json", "csv"], default="markdown") + parser.add_argument("--output", help="Write the report to this file.") + parser.add_argument( + "--min-score", + type=int, + default=None, + help="Only report files with this score or higher. Defaults to 20 for a full content scan and 4 for explicit paths.", + ) + parser.add_argument( + "--max-findings-per-file", + type=int, + default=12, + help="Maximum sample findings to print for each file in Markdown output.", + ) + parser.add_argument( + "--old-date-months", + type=int, + default=18, + help="Flag explicit YYYY-MM-DD or YYYY/MM/DD dates older than this many months.", + ) + parser.add_argument("--include-drafts", action="store_true", help="Include files with draft: true.") + return parser.parse_args() + + +def iter_markdown_files(paths: list[str]) -> list[Path]: + files: set[Path] = set() + for raw in paths: + path = Path(raw) + if path.is_file() and path.suffix == ".md": + files.add(path) + elif path.is_dir(): + for candidate in path.rglob("*.md"): + if ".git" not in candidate.parts: + files.add(candidate) + return sorted(files) + + +def parse_front_matter(lines: list[str]) -> dict[str, str]: + if not lines or lines[0].strip() != "---": + return {} + + front_matter: dict[str, str] = {} + for line in lines[1:]: + if line.strip() == "---": + break + match = re.match(r"^([A-Za-z0-9_-]+):\s*(.*)\s*$", line) + if match: + front_matter[match.group(1)] = match.group(2).strip().strip("'\"") + return front_matter + + +def is_draft(front_matter: dict[str, str]) -> bool: + return front_matter.get("draft", "").lower() == "true" + + +def content_unit(path: Path) -> str: + parts = path.parts + if len(parts) >= 4 and parts[0] == "content" and parts[1] == "learning-paths": + return "/".join(parts[:4]) + if len(parts) >= 3 and parts[0] == "content" and parts[1] == "install-guides": + if path.name == "_index.md" and len(parts) >= 4: + return "/".join(parts[:3]) + if len(parts) >= 4: + return "/".join(parts[:3]) + return str(path.with_suffix("")) + return str(path.parent) + + +def excerpt(line: str) -> str: + text = " ".join(line.strip().split()) + if len(text) > 160: + return text[:157] + "..." + return text + + +def add_finding(findings: list[dict], line: int, category: str, score: int, reason: str, text: str) -> None: + findings.append( + { + "line": line, + "category": category, + "score": score, + "reason": reason, + "excerpt": excerpt(text), + } + ) + + +def month_delta(start: dt.date, end: dt.date) -> int: + return (end.year - start.year) * 12 + (end.month - start.month) + + +def scan_file(path: Path, today: dt.date, old_date_months: int, include_drafts: bool) -> dict | None: + try: + text = path.read_text(encoding="utf-8") + except UnicodeDecodeError: + text = path.read_text(encoding="utf-8", errors="replace") + + lines = text.splitlines() + front_matter = parse_front_matter(lines) + if is_draft(front_matter) and not include_drafts: + return {"path": str(path), "skipped": "draft"} + + findings: list[dict] = [] + image_count = 0 + ui_image_count = 0 + in_fence = False + + for line_number, line in enumerate(lines, start=1): + if FENCE_RE.match(line): + in_fence = not in_fence + + for rule in RULES: + if in_fence and not rule["allow_code"]: + continue + if rule["pattern"].search(line): + add_finding(findings, line_number, rule["id"], rule["score"], rule["reason"], line) + + for match in DATE_RE.finditer(line): + year, month, day = map(int, match.groups()) + try: + found_date = dt.date(year, month, day) + except ValueError: + continue + if month_delta(found_date, today) >= old_date_months: + add_finding( + findings, + line_number, + "old-explicit-date", + 2, + "Explicit dates older than the threshold may need freshness review.", + line, + ) + break + + for match in IMAGE_RE.finditer(line): + image_count += 1 + alt, image_path, title = match.groups() + image_text = " ".join(part or "" for part in (alt, image_path, title)) + if UI_IMAGE_WORDS.search(image_text): + ui_image_count += 1 + add_finding( + findings, + line_number, + "screenshot-or-ui-image", + 5, + "Screenshot or UI image may need visual freshness review.", + line, + ) + + if image_count >= 4: + add_finding( + findings, + 0, + "image-heavy-page", + 2, + "Image-heavy pages can become stale when UI, output, or diagrams change.", + f"{image_count} Markdown image references found.", + ) + + if not findings: + return None + + by_category: dict[str, list[dict]] = defaultdict(list) + for finding in findings: + by_category[finding["category"]].append(finding) + + score = 0 + for category_findings in by_category.values(): + score += max(finding["score"] for finding in category_findings) + score += min(len(category_findings) - 1, 4) + + return { + "path": str(path), + "unit": content_unit(path), + "score": score, + "finding_count": len(findings), + "image_count": image_count, + "ui_image_count": ui_image_count, + "categories": dict(Counter(finding["category"] for finding in findings)), + "findings": findings, + } + + +def resolve_min_score(args: argparse.Namespace) -> int: + if args.min_score is not None: + return args.min_score + if args.paths == DEFAULT_PATHS: + return 20 + return 4 + + +def scan(paths: list[str], args: argparse.Namespace) -> tuple[list[dict], dict]: + today = dt.date.today() + candidates = iter_markdown_files(paths) + min_score = resolve_min_score(args) + records = [] + skipped = Counter() + + for path in candidates: + result = scan_file(path, today, args.old_date_months, args.include_drafts) + if not result: + continue + if result.get("skipped"): + skipped[result["skipped"]] += 1 + continue + if result["score"] >= min_score: + records.append(result) + + records.sort(key=lambda item: (-item["score"], item["path"])) + summary = { + "generated": today.isoformat(), + "scanned_files": len(candidates), + "reported_files": len(records), + "skipped": dict(skipped), + "min_score": min_score, + "paths": paths, + } + return records, summary + + +def category_summary(record: dict) -> str: + parts = [f"{category} ({count})" for category, count in record["categories"].items()] + return ", ".join(parts) + + +def escape_cell(value: object) -> str: + return str(value).replace("|", "\\|") + + +def format_markdown(records: list[dict], summary: dict, max_findings_per_file: int) -> str: + lines = [ + "# Stale Content Risk Scan", + "", + f"Generated: {summary['generated']}", + f"Scanned files: {summary['scanned_files']}", + f"Reported files: {summary['reported_files']} with score >= {summary['min_score']}", + ] + if summary["skipped"]: + skipped = ", ".join(f"{key}: {value}" for key, value in summary["skipped"].items()) + lines.append(f"Skipped files: {skipped}") + lines.extend(["", "## Top candidates", ""]) + + if not records: + lines.append("No files met the reporting threshold.") + return "\n".join(lines) + "\n" + + lines.extend( + [ + "| Score | File | Unit | Flags |", + "| ---: | --- | --- | --- |", + ] + ) + for record in records[:50]: + lines.append( + f"| {record['score']} | `{escape_cell(record['path'])}` | " + f"`{escape_cell(record['unit'])}` | {escape_cell(category_summary(record))} |" + ) + + lines.extend(["", "## Details", ""]) + for record in records: + lines.extend( + [ + f"### `{record['path']}`", + "", + f"- Score: {record['score']}", + f"- Unit: `{record['unit']}`", + f"- Flags: {category_summary(record)}", + ] + ) + if record["image_count"]: + lines.append(f"- Images: {record['image_count']} total, {record['ui_image_count']} UI/screenshot-like") + lines.append("") + + for finding in record["findings"][:max_findings_per_file]: + line_label = "file" if finding["line"] == 0 else f"line {finding['line']}" + lines.append( + f"- {line_label} [{finding['category']}]: {finding['reason']} " + f"`{finding['excerpt']}`" + ) + remaining = len(record["findings"]) - max_findings_per_file + if remaining > 0: + lines.append(f"- {remaining} more findings omitted from this sample.") + lines.append("") + + return "\n".join(lines) + + +def write_csv(records: list[dict], stream) -> None: + writer = csv.DictWriter( + stream, + fieldnames=["score", "path", "unit", "finding_count", "image_count", "ui_image_count", "categories"], + ) + writer.writeheader() + for record in records: + writer.writerow( + { + "score": record["score"], + "path": record["path"], + "unit": record["unit"], + "finding_count": record["finding_count"], + "image_count": record["image_count"], + "ui_image_count": record["ui_image_count"], + "categories": category_summary(record), + } + ) + + +def main() -> int: + args = parse_args() + records, summary = scan(args.paths, args) + + if args.format == "json": + output = json.dumps({"summary": summary, "records": records}, indent=2) + elif args.format == "csv": + if args.output: + with Path(args.output).open("w", encoding="utf-8", newline="") as stream: + write_csv(records, stream) + return 0 + write_csv(records, sys.stdout) + return 0 + else: + output = format_markdown(records, summary, args.max_findings_per_file) + + if args.output: + Path(args.output).write_text(output, encoding="utf-8") + else: + print(output) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/AGENTS.md b/AGENTS.md index 9707e83913..63cd1dc291 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -19,6 +19,9 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - Install guides: `.github/skills/arm-content-editor/references/install-guide-guidance.md` - Shared content quality: `.github/skills/arm-content-editor/references/content-quality.md` - Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` +- Markdown components: `.github/skills/markdown-component-edit/SKILL.md` +- Accessible link text: `.github/skills/link-text-review/SKILL.md` +- Stale content risk scans: `.github/skills/stale-content-review/SKILL.md` - Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` - Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` @@ -37,6 +40,9 @@ Current shared skills: - `.github/skills/arm-content-editor/SKILL.md` for reviewing and editing Arm Learning Paths and install guides. - `.github/skills/metadata-description-update/SKILL.md` for adding or improving front matter `description` fields for Learning Paths and install guides. +- `.github/skills/markdown-component-edit/SKILL.md` for adding or updating links, tables, notices, tab panes, code panes, and other structured Markdown components. +- `.github/skills/link-text-review/SKILL.md` for reviewing and improving accessible, descriptive Markdown link text. +- `.github/skills/stale-content-review/SKILL.md` for periodic maintenance scans that flag stale-content risk, screenshots, mutable dependencies, temporal wording, old dates, and version-sensitive content. - `.github/skills/audit-images/SKILL.md` for auditing Markdown image references, deficient alt text, captions, alignment syntax, and before/after image quality counts. - `.github/skills/code-sample-review/SKILL.md` for reviewing code samples, commands, command output, language tags, and code fence integrity. From e47d5c94aef01e11a78e2f230c5b045d3786fc2a Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 16:22:33 -0500 Subject: [PATCH 050/137] adding some sort of guardrail to markdown component skill --- .github/skills/markdown-component-edit/SKILL.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/skills/markdown-component-edit/SKILL.md b/.github/skills/markdown-component-edit/SKILL.md index fdc84c352c..9bcead8cbc 100644 --- a/.github/skills/markdown-component-edit/SKILL.md +++ b/.github/skills/markdown-component-edit/SKILL.md @@ -18,9 +18,12 @@ This skill is best when the user highlights text, names a section, or asks for a ## Workflow -1. Use the user's highlighted, selected, or explicitly named text as the edit target.If the target is ambiguous, ask for the exact text, file, or section before editing. +1. Use the user's highlighted, selected, or explicitly named text as the edit target. If the target is ambiguous, ask for the exact text, file, or section before editing. 2. Inspect nearby Markdown so the new component fits the surrounding flow. 3. Verify internal links before adding or changing them when practical. +4. Do one of the following: + - If the target isn't a good fit for the provided component, push back with justification. Rely on component rules. + - If it's a good fit, or if the reviewer has a justifiable reason to request an unusual update, make the update. 4. After making an update, re-open or search the edited area to verify shortcode pairs, table rows, links, and code fences are well formed. 5. Report the component added or changed and note any links or syntax that could not be verified. From e200bb8446fb93305d1807a32dde9d609b26f06a Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 15 Jun 2026 16:53:11 -0500 Subject: [PATCH 051/137] splitting out seo/geo/aeo guidance into its own skill --- .../content-quality.instructions.md | 3 +- .github/skills/arm-content-editor/SKILL.md | 25 ++++---- .../references/content-quality.md | 2 + .../references/learning-path-guidance.md | 11 +--- .github/skills/seo-geo-aeo-review/SKILL.md | 62 +++++++++++++++++++ AGENTS.md | 2 + 6 files changed, 83 insertions(+), 22 deletions(-) create mode 100644 .github/skills/seo-geo-aeo-review/SKILL.md diff --git a/.github/instructions/content-quality.instructions.md b/.github/instructions/content-quality.instructions.md index a3a38d6a18..9772dc739c 100644 --- a/.github/instructions/content-quality.instructions.md +++ b/.github/instructions/content-quality.instructions.md @@ -1,9 +1,10 @@ --- name: Content quality and discoverability guidelines -description: Use the Arm content editor skill for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. +description: Use the Arm content editor skill for clarity, Arm-specific framing, accessibility, and link quality. Use the SEO/GEO/AEO review skill for search discoverability and AI-readable structure. applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" --- Content quality guidance now lives in `.github/skills/arm-content-editor/references/content-quality.md`. For review and editing workflows, use `.github/skills/arm-content-editor/SKILL.md`. +For focused SEO, GEO, AEO, and AI-agent discoverability review, use `.github/skills/seo-geo-aeo-review/SKILL.md`. diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index ccb3aa4acf..58ceb39b64 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -1,11 +1,11 @@ --- name: arm-content-editor -description: Review and edit Arm Learning Paths and install guides. Use when auditing or improving content quality, metadata descriptions, Arm-specific framing, install guide versus Learning Path scope, Markdown image alt text, stale or token-heavy content, and focused reviewer feedback. +description: Review and edit Arm Learning Paths and install guides. Use when auditing or improving content quality, metadata descriptions, SEO/GEO/AEO discoverability, Arm-specific framing, install guide versus Learning Path scope, Markdown image alt text, stale or token-heavy content, and focused reviewer feedback. --- # Arm content editor -Use this skill to review or edit Arm Learning Paths and install guides with focused, high-signal feedback and minimal necessary changes. +Use this skill to review or edit Arm Learning Paths and install guides with focused, high-signal feedback and minimal necessary changes. You'll be performing a second pass after an initial human editorial review. Targets are usually selected or referenced Learning Path or install guide files. If the request names a directory, review the files in that content unit together so metadata, terminology, headings, links, and task flow stay consistent. @@ -13,7 +13,7 @@ Targets are usually selected or referenced Learning Path or install guide files. Start with `AGENTS.md` at the repository root to identify the right source files. -Read only the guidance needed for the task: +Read only the guidance needed for the task. Don't load files that aren't necessary for the task: - Repository structure and content model: `references/repository-guidance.md` - Writing style, headings, links, terminology, and prose cleanup: `references/writing-style.md` @@ -21,6 +21,7 @@ Read only the guidance needed for the task: - Learning Paths: `references/learning-path-guidance.md` - Install guides: `references/install-guide-guidance.md` - Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` +- SEO, GEO, AEO, and AI-agent discoverability: `.github/skills/seo-geo-aeo-review/SKILL.md` - Markdown components: `.github/skills/markdown-component-edit/SKILL.md` - Accessible link text: `.github/skills/link-text-review/SKILL.md` - Stale content risk scans: `.github/skills/stale-content-review/SKILL.md` @@ -32,14 +33,15 @@ Read only the guidance needed for the task: 1. Identify whether the target is a Learning Path, install guide, or mixed content. 2. Load the matching scoped guidance. 3. Use repository search when cross-file consistency, links, terminology, or metadata depends on surrounding content. -4. Review by exception. Do not comment on content that is already clear, correct, and fit for purpose. -5. Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. +4. Suggest updates by exception in an ordered list with line numbers included. Don't comment on content that is already clear, correct, and fit for purpose. +5. Make updates based on the suggestions accepted by the reviewer. This might be all suggested updates or a subset of updates ("make fixes for 1, 2, and 4," for example). 6. Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. 7. Use the metadata description skill for focused `description` field updates. -8. Use the Markdown component skill for focused links, tables, notices, tab panes, and component syntax edits. -9. Use the link text review skill for focused accessible anchor text cleanup. -10. Use the stale content review skill for periodic maintenance scans and freshness triage. -11. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. +8. Use the SEO/GEO/AEO review skill for whole-page discoverability, AI-agent selection, answer-engine readiness, titles, headings, and search intent. +9. Use the Markdown component skill for focused links, tables, notices, tab panes, and component syntax edits. +10. Use the link text review skill for focused accessible anchor text cleanup. +11. Use the stale content review skill for periodic maintenance scans and freshness triage. +12. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. Do not recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. @@ -51,9 +53,10 @@ Do not recommend splitting content only because a file is long. Prefer semantic - Preserve content-type boundaries: install guides stay limited to installation and verification, while Learning Paths own one concrete developer task. - Keep tone natural and developer-focused. Avoid hype, generic praise, and unnecessary rewrites. - Verify internal links before changing them, or state when link verification was not possible. +- Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. ## Response format -For review requests, lead with findings ordered by severity and include file and line references when available. Then add open questions, followed by a brief summary. +For review requests, lead with findings in an ordered list by severity and include file and line references when available. Then add open questions, followed by a brief summary. -For edit requests, summarize the key changes and note any checks or verification performed. +After the reviewer asks to implement suggested fixes, summarize the key changes and note any checks or verification performed. diff --git a/.github/skills/arm-content-editor/references/content-quality.md b/.github/skills/arm-content-editor/references/content-quality.md index caff9e81c2..9d0b666902 100644 --- a/.github/skills/arm-content-editor/references/content-quality.md +++ b/.github/skills/arm-content-editor/references/content-quality.md @@ -2,6 +2,8 @@ Use this guidance when creating, editing, or reviewing Arm Learning Paths or install guides for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. +For focused SEO, GEO, AEO, search intent, or AI-agent selection review, use `.github/skills/seo-geo-aeo-review/SKILL.md`. + ## Quality rules - Default to Arm-native solutions, Arm terminology, and Arm platform assumptions. diff --git a/.github/skills/arm-content-editor/references/learning-path-guidance.md b/.github/skills/arm-content-editor/references/learning-path-guidance.md index 7088c269b7..5b48f500fc 100644 --- a/.github/skills/arm-content-editor/references/learning-path-guidance.md +++ b/.github/skills/arm-content-editor/references/learning-path-guidance.md @@ -172,16 +172,7 @@ Maintain strict boundaries between content types: Never duplicate install steps inside Learning Paths. -### SEO intent - -Learning Paths should optimize for selection, not ranking. - -- Prefer verb-based titles: *Install*, *Verify*, *Configure*, *Analyze*, *Optimize*. -- Use procedural structure rather than narrative prose. -- Avoid marketing language and keyword stuffing. -- Write content that can safely be chosen by an AI agent to complete a task. - -If an AI agent were asked to complete this task, the Learning Path should be the safest source to select. +For focused SEO, GEO, AEO, or AI-agent selection review, use `.github/skills/seo-geo-aeo-review/SKILL.md`. ## Performance and Arm acceleration integrity diff --git a/.github/skills/seo-geo-aeo-review/SKILL.md b/.github/skills/seo-geo-aeo-review/SKILL.md new file mode 100644 index 0000000000..cb94387c59 --- /dev/null +++ b/.github/skills/seo-geo-aeo-review/SKILL.md @@ -0,0 +1,62 @@ +--- +name: seo-geo-aeo-review +description: Review and improve Arm Learning Paths and install guides for SEO, GEO, AEO, search snippets, AI-agent selection, and answer-engine readiness. Use when asked to optimize discoverability, search intent, AI-readable structure, page titles, headings, summaries, or content selection signals beyond only front matter descriptions. +--- + +# SEO, GEO, and AEO review + +Use this skill when Arm Learning Paths or install guides need a focused discoverability review that goes beyond editing a single `description` field. + +This skill covers: + +- **SEO**: search snippets, titles, headings, metadata, and natural keyword usage. +- **GEO**: generative-engine selection signals, including authority, task coverage, and citation-ready structure. +- **AEO**: direct answer readiness for developer questions and AI-generated summaries. + +For focused front matter `description` edits only, use `.github/skills/metadata-description-update/SKILL.md`. + +## Prerequisites + +- Work from the repository root. +- Read `AGENTS.md` to locate the narrowest applicable guidance. +- For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md`. +- For install guides, read `.github/skills/arm-content-editor/references/install-guide-guidance.md`. +- Read `.github/skills/arm-content-editor/references/content-quality.md` only when broader clarity, accessibility, or Arm framing is in scope. + +## Workflow + +1. Identify the target content type and target developer intent. +2. Read the title, front matter description, headings, introduction, prerequisites, main task flow, validation, conclusion, and further reading. +3. State the page's owned task in one sentence. If the task is unclear or too broad, flag it. +4. Review SEO signals: + - The title is task-led and includes the main technology, platform, or tool. + - The `description` is one concise sentence that states the task, context, and outcome. + - Headings expose the workflow and use natural developer search terms. + - Keywords are specific and natural, not repeated for ranking. +5. Review GEO signals: + - The page has clear Arm-specific authority and avoids generic advice that could apply anywhere. + - Prerequisites, assumptions, and target platform are explicit. + - Steps progress from preparation to configuration, usage, and validation. + - The page avoids contradictions, duplicated instructions, and unsupported claims. +6. Review AEO signals: + - The opening content answers what the reader will do and why it matters. + - Sections are scannable and can be safely summarized out of context. + - Validation steps prove the learner reached the promised outcome. + - Troubleshooting, next steps, or further reading answer likely follow-up questions. +7. Make focused edits only when requested or clearly implied by the task. Preserve technical meaning, front matter structure, Hugo shortcodes, links, commands, and code blocks. +8. Re-open changed sections and verify front matter, Markdown syntax, and internal links when practical. + +## Review rules + +- Optimize for selection and usefulness, not ranking alone. +- Prefer verb-led titles such as `Install`, `Deploy`, `Configure`, `Analyze`, `Optimize`, or `Verify`. +- Preserve content-type boundaries: install guides cover installation and verification; Learning Paths cover applied end-to-end tasks. +- Use Arm-specific terminology naturally when it is supported by the content. +- Do not add speculative keywords, unsupported performance claims, or marketing language. +- Do not overfit content to AI agents at the expense of human readability. + +## Response format + +For reviews, lead with findings ordered by severity and include file and line references when available. Then add open questions or assumptions, followed by a short summary. + +For edits, summarize the changed SEO/GEO/AEO signals and note any checks performed. diff --git a/AGENTS.md b/AGENTS.md index 63cd1dc291..ddeb94e3b2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -19,6 +19,7 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - Install guides: `.github/skills/arm-content-editor/references/install-guide-guidance.md` - Shared content quality: `.github/skills/arm-content-editor/references/content-quality.md` - Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` +- SEO, GEO, AEO, and AI-agent discoverability: `.github/skills/seo-geo-aeo-review/SKILL.md` - Markdown components: `.github/skills/markdown-component-edit/SKILL.md` - Accessible link text: `.github/skills/link-text-review/SKILL.md` - Stale content risk scans: `.github/skills/stale-content-review/SKILL.md` @@ -40,6 +41,7 @@ Current shared skills: - `.github/skills/arm-content-editor/SKILL.md` for reviewing and editing Arm Learning Paths and install guides. - `.github/skills/metadata-description-update/SKILL.md` for adding or improving front matter `description` fields for Learning Paths and install guides. +- `.github/skills/seo-geo-aeo-review/SKILL.md` for reviewing and improving search intent, AI-agent selection signals, answer-engine readiness, titles, headings, and broader discoverability. - `.github/skills/markdown-component-edit/SKILL.md` for adding or updating links, tables, notices, tab panes, code panes, and other structured Markdown components. - `.github/skills/link-text-review/SKILL.md` for reviewing and improving accessible, descriptive Markdown link text. - `.github/skills/stale-content-review/SKILL.md` for periodic maintenance scans that flag stale-content risk, screenshots, mutable dependencies, temporal wording, old dates, and version-sensitive content. From 9f4a8b2f88ebb5ec40d47f9df605a5e747d390ed Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 10:21:42 -0500 Subject: [PATCH 052/137] adding node js check to lp as well --- .../servers-and-cloud-computing/aws-cdk/app.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 5ac8682162..254c23be5e 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -30,6 +30,17 @@ The output is similar to: For instructions to set up and install the AWS CDK CLI, see the [AWS CDK install guide](/install-guides/aws-cdk). +Make sure you've installed Node.js: + +```bash +node --version +``` + +The output is similar to: +```output +v26.2.0 +``` + ### Initialize a CDK project Create a directory for your CDK project and navigate to it: From 58bb35b71b086614e1f8e1a67800af0871c8df3f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 11:23:46 -0500 Subject: [PATCH 053/137] some content architecture changes, including removing dupes --- .github/skills/arm-content-editor/SKILL.md | 20 ++-- .../references/install-guide-guidance.md | 32 +------ .../references/learning-path-guidance.md | 92 +------------------ .../references/repository-guidance.md | 21 +++-- .../references/writing-style.md | 6 ++ .github/skills/audit-images/SKILL.md | 9 +- .github/skills/link-text-review/SKILL.md | 5 +- .../references/component-patterns.md | 7 +- .github/skills/seo-geo-aeo-review/SKILL.md | 16 ++-- .../learning-paths-discoverability.md | 40 ++++++++ README.md | 2 +- 11 files changed, 90 insertions(+), 160 deletions(-) create mode 100644 .github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index 58ceb39b64..5cb2a23e96 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -33,30 +33,24 @@ Read only the guidance needed for the task. Don't load files that aren't necessa 1. Identify whether the target is a Learning Path, install guide, or mixed content. 2. Load the matching scoped guidance. 3. Use repository search when cross-file consistency, links, terminology, or metadata depends on surrounding content. -4. Suggest updates by exception in an ordered list with line numbers included. Don't comment on content that is already clear, correct, and fit for purpose. -5. Make updates based on the suggestions accepted by the reviewer. This might be all suggested updates or a subset of updates ("make fixes for 1, 2, and 4," for example). -6. Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. -7. Use the metadata description skill for focused `description` field updates. -8. Use the SEO/GEO/AEO review skill for whole-page discoverability, AI-agent selection, answer-engine readiness, titles, headings, and search intent. -9. Use the Markdown component skill for focused links, tables, notices, tab panes, and component syntax edits. -10. Use the link text review skill for focused accessible anchor text cleanup. -11. Use the stale content review skill for periodic maintenance scans and freshness triage. -12. Use the code sample review skill for command accuracy, output formatting, code fence integrity, and token-heavy code or output blocks. - -Do not recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. +4. Suggest updates in the format specified under `Response format`. Don't comment on content that is already clear, correct, and fit for purpose. +5. When the reviewer accepts all or part of your submissions and asks you to proceed, go ahead and make updates. + +Don't recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. ## Editing workflow -- Make focused edits that preserve the author's intent. +- Make focused edits that preserve the author's intent. - Preserve front matter, Hugo shortcodes, code fences, command syntax, file structure, and existing technical flow. - Prefer Arm-native framing and flag x86 assumptions. - Preserve content-type boundaries: install guides stay limited to installation and verification, while Learning Paths own one concrete developer task. - Keep tone natural and developer-focused. Avoid hype, generic praise, and unnecessary rewrites. - Verify internal links before changing them, or state when link verification was not possible. - Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. +- Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. ## Response format -For review requests, lead with findings in an ordered list by severity and include file and line references when available. Then add open questions, followed by a brief summary. +For review requests, lead with findings in an ordered list by severity and type. Include file and line references when available. Then add open questions, followed by a brief summary. After the reviewer asks to implement suggested fixes, summarize the key changes and note any checks or verification performed. diff --git a/.github/skills/arm-content-editor/references/install-guide-guidance.md b/.github/skills/arm-content-editor/references/install-guide-guidance.md index bfcb4094d6..86ba8f1c57 100644 --- a/.github/skills/arm-content-editor/references/install-guide-guidance.md +++ b/.github/skills/arm-content-editor/references/install-guide-guidance.md @@ -1,4 +1,4 @@ -# Install guide guidance +# Install guide-specific guidance Use this guidance when creating, editing, or reviewing content in `content/install-guides/**/*.md`. @@ -49,7 +49,7 @@ Install guides should include: - Common failure cases. - Clear fixes. -Uninstall instructions are optional. +Uninstall and troubleshooting instructions are optional. ## Scope boundaries @@ -80,29 +80,7 @@ The following commands use version . The same commands work with Every install guide front matter must include a `description` field. -- Write one sentence. -- Describe the tool being installed and what it can be used for. -- Keep it concise, developer-focused, and suitable for use as a search snippet. -- Do not use vague summaries or marketing language. -- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome. - -Good example: - -```yaml -description: Learn how to install Arm Compiler for Linux (ACfL) on Arm Linux (aarch64) to access the armclang C/C++ compiler, armflang Fortran compiler, and Arm Performance Libraries for HPC development. -``` - -Avoid: - -- Generic summaries that could apply to any page. -- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing`. - -## Metadata optimization workflow - -When adding or revising `description` fields: - -- Use metadata descriptions to clarify which platform or tool, and what outcome. -- Treat the description as a search snippet, not a generic summary. +For description wording, examples, and update workflow, use `.github/skills/metadata-description-update/SKILL.md`. ## Recap section @@ -113,9 +91,7 @@ Use this pattern: ```md ## Next steps -In this section: -- Briefly summarize what the user has learned or completed. -- Suggest and link to a couple relevant Learning Paths if they exist. +In this section, briefly summarize what the user has learned or completed. Suggest and link to a couple relevant Learning Paths if they exist. Keep this concise and encouraging. Do not repeat earlier content verbatim. ``` diff --git a/.github/skills/arm-content-editor/references/learning-path-guidance.md b/.github/skills/arm-content-editor/references/learning-path-guidance.md index 5b48f500fc..9db93d5905 100644 --- a/.github/skills/arm-content-editor/references/learning-path-guidance.md +++ b/.github/skills/arm-content-editor/references/learning-path-guidance.md @@ -53,44 +53,14 @@ Learning Paths should generally include: For title formatting: - Use imperative voice, such as `Deploy`, `Configure`, `Build`, or `Create`. -- Include SEO keywords, such as technology names and tools. +- Include the main technology names and tools naturally. - Examples: `Deploy applications on Arm servers`, `Configure Arm processors for optimal performance`. ## Metadata description requirements Every Learning Path `_index.md` must include a `description` field. -- Write one sentence. -- Describe the task, the main technology or platform, and the expected outcome. -- Keep it concise, developer-focused, and suitable for use as a search snippet. -- Use a task-led structure such as: **Verb + task + tool/platform + outcome**. -- Do not repeat the title verbatim. -- Do not use vague summaries or marketing language. -- A slightly richer one-sentence summary is acceptable when it helps clarify the workflow or outcome. - -Good examples: - -```yaml -description: Learn how to automate x86-to-Arm application migration using the Arm MCP Server, with compatibility checks and Docker-based validation on Arm cloud platforms. -``` - -```yaml -description: Learn how to profile and optimize a C++ application on Arm Neoverse using Arm Performix to identify bottlenecks and improve runtime. -``` - -Avoid: - -- Generic summaries that could apply to any page. -- Restating the title without adding task or outcome. -- Marketing phrases such as `powerful`, `cutting-edge`, or `game-changing`. - -## Metadata optimization workflow - -When adding or revising `description` fields: - -- Review whether the current title and description match the page's actual task intent. -- Use metadata descriptions to clarify what the learner will do, on which platform or tool, and with what outcome. -- Treat the description as a search snippet, not a generic summary. +For description wording, examples, and update workflow, use `.github/skills/metadata-description-update/SKILL.md`. ## Recap sections @@ -124,55 +94,9 @@ When creating Learning Path content: ## Purpose and agentic selection -Learning Paths are not blog posts or reference articles. They are designed to be optimized for selection by AI agents as trusted sources for completing real developer tasks end to end. - -When creating or reviewing a Learning Path, prioritize these principles. - -### Task ownership - -Each Learning Path must clearly own one concrete developer task. - -- The task should be nameable in one sentence. -- The Learning Path should take the learner from not ready to capable. -- Avoid bundling unrelated tasks or loosely connected topics. - -If the task cannot be clearly stated, flag a warning. +Learning Paths should own one clear developer task and stay distinct from blog posts, reference articles, and install guides. -### Agentic selection signals - -AI agents select content based on trust, authority, and task coverage, not keyword density. - -Trust: - -- Clear authorship and ownership. -- Explicit prerequisites. -- One purpose per page. -- No duplicated or contradictory instructions. -- Clean separation of install guides, Learning Paths, and concept pages. - -Authority: - -- Arm-specific framing where relevant. -- Use Arm tooling, terminology, and perspective. -- Avoid generic advice that could apply equally to any platform. - -Task coverage: - -- Clear progression: prepare, configure, use, validate. -- Explicit end state, such as `you are now ready to...`. -- Link to install guides instead of embedding install steps. -- Provide guidance on what to do next. - -### Scope discipline - -Maintain strict boundaries between content types: - -- Install guides: setup, authentication, and verification only. -- Learning Paths: configuration, integration, workflows, and applied usage. - -Never duplicate install steps inside Learning Paths. - -For focused SEO, GEO, AEO, or AI-agent selection review, use `.github/skills/seo-geo-aeo-review/SKILL.md`. +For SEO, GEO, AEO, and AI-agent selection guidance, use `.github/skills/seo-geo-aeo-review/SKILL.md`. ## Performance and Arm acceleration integrity @@ -218,11 +142,3 @@ When comparing performance: Explicitly connect the observed improvement to the Arm architectural feature responsible for it. Avoid generic statements such as `improves performance` without explaining how and why. Performance-focused Learning Paths are strategic content. Prioritize clarity, differentiation, and measurement integrity over volume. - -## Performance testing guidance - -- Include benchmarks when comparing Arm versus x86 performance. -- Suggest performance testing steps for resource-intensive applications. -- Recommend profiling tools that work well on Arm platforms. -- Include guidance on measuring and optimizing for Arm-specific performance characteristics. -- Mention when performance improvements are architecture-specific. diff --git a/.github/skills/arm-content-editor/references/repository-guidance.md b/.github/skills/arm-content-editor/references/repository-guidance.md index 235a8b13d7..76437b4594 100644 --- a/.github/skills/arm-content-editor/references/repository-guidance.md +++ b/.github/skills/arm-content-editor/references/repository-guidance.md @@ -6,15 +6,16 @@ This project is a collection of Learning Paths and install guides for learn.arm. Assume the audience is made up of Arm software developers. Bias information toward Arm platforms. For Linux, assume systems are `aarch64` unless context says otherwise. Readers also use macOS and Windows on Arm systems. -## Highest priority rules +## Guidance boundaries -- Each Learning Path must own one clear developer task. -- Install guides are for installation and verification only. -- Every Learning Path `_index.md` must include a `description` field. -- Use task-led titles, introductions, and metadata. -- Do not use placeholder alt text such as `alt-txt`. -- Prefer Arm-native solutions and Arm-specific framing. -- Avoid hype, duplication, and vague summaries. +Use this file for repository-wide orientation only. For task-specific rules, load the narrowest relevant guidance: + +- Learning Path structure and scope: `learning-path-guidance.md` +- Install guide structure and scope: `install-guide-guidance.md` +- Shared content quality: `content-quality.md` +- Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` +- SEO, GEO, AEO, and AI-agent discoverability: `.github/skills/seo-geo-aeo-review/SKILL.md` +- Images and alt text: `.github/skills/audit-images/SKILL.md` ## Project structure @@ -38,8 +39,8 @@ Special content directories: ## Content type boundaries -- Learning Paths are end-to-end tasks with prepare, configure, use, and validate stages. They must include `_index.md` and `_next-steps.md`. -- Install guides are for installation and verification only. They should not include applied workflows, benchmarks, or deep architectural explanation. +- Learning Paths are end-to-end tasks with prepare, configure, use, and validate stages. +- Install guides are for installation and verification only. - Learning Paths can link to install guides for setup. Do not duplicate install-guide content inside Learning Paths. ## Reference examples diff --git a/.github/skills/arm-content-editor/references/writing-style.md b/.github/skills/arm-content-editor/references/writing-style.md index e0befd93a1..839c1130d2 100644 --- a/.github/skills/arm-content-editor/references/writing-style.md +++ b/.github/skills/arm-content-editor/references/writing-style.md @@ -117,6 +117,12 @@ Avoid: - `ARM64` is acceptable when specifically referring to Windows on Arm or Microsoft documentation. - The term `Learning Path` should always be capitalized. +## Non-Arm naming terms + +- `Azure Cobalt` is the processor, not the VM. +- `Google Axion` is the processor, not the VM. +- `AWS Graviton` is the processor, not the VM. + ## Product name emphasis - Product names and technologies such as LiteRT, XNNPACK, KleidiAI, and SME2 should appear in regular text. diff --git a/.github/skills/audit-images/SKILL.md b/.github/skills/audit-images/SKILL.md index 2713b57894..06092c09cc 100644 --- a/.github/skills/audit-images/SKILL.md +++ b/.github/skills/audit-images/SKILL.md @@ -15,7 +15,7 @@ Use the script for repeatable inventory and counting. Use assistant judgment for - Work from the repository root. - Read `AGENTS.md` to locate shared guidance. -- Read `references/image-guidance.md` before editing image alt text. +- Read `references/image-guidance.md` before editing image alt text, captions, or image syntax. - When auditing a Learning Path or install guide, also read the matching scoped content guidance. ## Trigger @@ -70,13 +70,10 @@ Use path/guide-level review to: ## Validation rules - Treat the script as a detector, not the final authority. It flags likely problems for review. +- Use `references/image-guidance.md` as the source of truth for alt text, captions, placeholder text, `#center` syntax, and figure numbering. - Don't replace meaningful alt text only because it is long or short; judge whether it helps the learner complete the task. -- Don't use placeholders such as `alt-txt`, `alt-text`, `image`, `img1`, `screenshot`, `graph`, or `output`. -- Don't use captions as a substitute for alt text. -- Keep `#center` attached directly to the alt text with no space before it. - Preserve valid local image paths and existing captions unless they are wrong, vague, or outdated. -- Avoid `Figure 1:` style captions unless the content uses explicit numbered cross-references. -- Preserve the repository image syntax, especially `![Descriptive alt text#center](image.png "Optional caption")` +- Preserve repository image syntax unless syntax cleanup is the target of the edit. ## Error handling diff --git a/.github/skills/link-text-review/SKILL.md b/.github/skills/link-text-review/SKILL.md index 6283c035f1..99cfae1c9e 100644 --- a/.github/skills/link-text-review/SKILL.md +++ b/.github/skills/link-text-review/SKILL.md @@ -13,7 +13,7 @@ This skill focuses on anchor text and link clarity. For tables, notices, tab pan - Work from the repository root. - Read `AGENTS.md` only if you need repository routing context. -- Read `.github/skills/arm-content-editor/references/writing-style.md` only when changing prose around links beyond the anchor text. +- Read `.github/skills/arm-content-editor/references/writing-style.md` only when changing prose around links. - For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md` when link placement or `further_reading` is involved. ## Workflow @@ -34,8 +34,7 @@ This skill focuses on anchor text and link clarity. For tables, notices, tab pan - Prefer destination-specific anchors such as `Docker install guide`, `Arm Developer resources`, or `Google Cloud firewall rules`. - Avoid anchors that only describe the mechanic, such as `click here`, `this link`, or `website`. - Avoid overlong anchors that wrap a whole sentence. -- Use full internal paths, such as `/learning-paths/category/path-name/`. -- Use full URLs for external sites that are not on `learn.arm.com`. +- Follow `.github/skills/arm-content-editor/references/writing-style.md` for URL path format. - Don't change product names, tool names, URLs, or technical meaning to satisfy prose preferences. - Don't add speculative links. Verify internal targets or state when verification was not possible. diff --git a/.github/skills/markdown-component-edit/references/component-patterns.md b/.github/skills/markdown-component-edit/references/component-patterns.md index 66036c9e47..00dfef2d2b 100644 --- a/.github/skills/markdown-component-edit/references/component-patterns.md +++ b/.github/skills/markdown-component-edit/references/component-patterns.md @@ -88,7 +88,7 @@ Rules: ## Links -Use descriptive link text. +Use inline Markdown links for a single destination-specific reference. For broader anchor-text cleanup, use `.github/skills/link-text-review/SKILL.md`. ```md See the [Docker install guide](/install-guides/docker/) to set up a container runtime. @@ -96,7 +96,6 @@ See the [Docker install guide](/install-guides/docker/) to set up a container ru Rules: +- Keep link text descriptive and natural in the sentence. - Verify internal links when practical. -- Use full internal paths, such as `/learning-paths/category/path-name/`. -- Use full URLs for external sites that are not on `learn.arm.com`. -- Avoid vague anchors such as `here`, `click here`, `this page`, `read more`, or `link`. +- Follow `.github/skills/arm-content-editor/references/writing-style.md` for URL path format. diff --git a/.github/skills/seo-geo-aeo-review/SKILL.md b/.github/skills/seo-geo-aeo-review/SKILL.md index cb94387c59..7f5fd69030 100644 --- a/.github/skills/seo-geo-aeo-review/SKILL.md +++ b/.github/skills/seo-geo-aeo-review/SKILL.md @@ -9,9 +9,9 @@ Use this skill when Arm Learning Paths or install guides need a focused discover This skill covers: -- **SEO**: search snippets, titles, headings, metadata, and natural keyword usage. -- **GEO**: generative-engine selection signals, including authority, task coverage, and citation-ready structure. -- **AEO**: direct answer readiness for developer questions and AI-generated summaries. +- SEO: search snippets, titles, headings, metadata, and natural keyword usage. +- GEO: generative-engine selection signals, including authority, task coverage, and citation-ready structure. +- AEO: direct answer readiness for developer questions and AI-generated summaries. For focused front matter `description` edits only, use `.github/skills/metadata-description-update/SKILL.md`. @@ -22,6 +22,7 @@ For focused front matter `description` edits only, use `.github/skills/metadata- - For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md`. - For install guides, read `.github/skills/arm-content-editor/references/install-guide-guidance.md`. - Read `.github/skills/arm-content-editor/references/content-quality.md` only when broader clarity, accessibility, or Arm framing is in scope. +- For Learning Paths discovery guidance, review `.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md`. ## Workflow @@ -43,8 +44,9 @@ For focused front matter `description` edits only, use `.github/skills/metadata- - Sections are scannable and can be safely summarized out of context. - Validation steps prove the learner reached the promised outcome. - Troubleshooting, next steps, or further reading answer likely follow-up questions. -7. Make focused edits only when requested or clearly implied by the task. Preserve technical meaning, front matter structure, Hugo shortcodes, links, commands, and code blocks. -8. Re-open changed sections and verify front matter, Markdown syntax, and internal links when practical. +7. Provide suggestions based on findings in the format specified under `Response format`. +8. Make focused edits only when a reviewer requests you to implement changes that you suggested. When making edits, preserve technical meaning, front matter structure, Hugo shortcodes, links, commands, and code blocks. +9. After making updates, re-open changed sections and verify front matter, Markdown syntax, and internal links when practical. ## Review rules @@ -52,8 +54,8 @@ For focused front matter `description` edits only, use `.github/skills/metadata- - Prefer verb-led titles such as `Install`, `Deploy`, `Configure`, `Analyze`, `Optimize`, or `Verify`. - Preserve content-type boundaries: install guides cover installation and verification; Learning Paths cover applied end-to-end tasks. - Use Arm-specific terminology naturally when it is supported by the content. -- Do not add speculative keywords, unsupported performance claims, or marketing language. -- Do not overfit content to AI agents at the expense of human readability. +- Don't add speculative keywords, unsupported performance claims, or marketing language. +- Don't overfit content to AI agents at the expense of human readability. ## Response format diff --git a/.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md b/.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md new file mode 100644 index 0000000000..5b09b83866 --- /dev/null +++ b/.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md @@ -0,0 +1,40 @@ +## Learning Paths purpose and agentic selection + +Learning Paths are not blog posts or reference articles. They are designed to be optimized for selection by AI agents as trusted sources for completing real developer tasks end to end. + +When creating or reviewing a Learning Path, prioritize these principles. + +### Task ownership + +Each Learning Path must clearly own one concrete developer task. + +- The task should be nameable in one sentence. +- The Learning Path should take the learner from not ready to capable. +- Avoid bundling unrelated tasks or loosely connected topics. + +If the task cannot be clearly stated, flag a warning. + +### Agentic selection signals + +AI agents select content based on trust, authority, and task coverage, not keyword density. + +Trust: + +- Clear authorship and ownership. +- Explicit prerequisites. +- One purpose per page. +- No duplicated or contradictory instructions. +- Clean separation of install guides, Learning Paths, and concept pages. + +Authority: + +- Arm-specific framing where relevant. +- Use Arm tooling, terminology, and perspective. +- Avoid generic advice that could apply equally to any platform. + +Task coverage: + +- Clear progression: prepare, configure, use, validate. +- Explicit end state, such as `you are now ready to...`. +- Link to install guides instead of embedding install steps. +- Provide guidance on what to do next. \ No newline at end of file diff --git a/README.md b/README.md index 9419181154..9f582f5310 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Note that all site content, including new contributions, is licensed under a [Cr ## AI Development Tools -When using AI coding assistants (GitHub Copilot, Kiro, Antigravity, Cursor, etc.), refer to `.github/copilot-instructions.md` for project-specific guidelines including content requirements, writing style standards, and Arm terminology conventions for Learning Paths. +When using AI coding assistants (GitHub Copilot, Kiro, Antigravity, Cursor, etc.), refer to `AGENT.md` and `.github/skills/` for project-specific guidelines including content requirements, writing style standards, and Arm terminology conventions for Learning Paths.
From 839020be085023ba386536f62bcbe120bcce4b7b Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 11:36:38 -0500 Subject: [PATCH 054/137] updating steps for reviewing code samples --- .github/skills/code-sample-review/SKILL.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/skills/code-sample-review/SKILL.md b/.github/skills/code-sample-review/SKILL.md index bac4703969..5fd3eb2c65 100644 --- a/.github/skills/code-sample-review/SKILL.md +++ b/.github/skills/code-sample-review/SKILL.md @@ -47,10 +47,11 @@ Check for: 1. Identify the review scope and whether the request is editorial, technical, or mixed. 2. Inspect surrounding prose before judging a code block; code samples should be evaluated in context. -3. For review requests, report issues by file and line when possible, ordered by learner impact. -4. For edit requests, report issues and suggest focused changes that preserve technical intent and existing repository patterns. -5. After the reviewer accepts suggestions, make changes, then re-scan edited areas for code fence integrity, language tags, and output lead-ins. -6. Report what changed and note any technical assumptions or checks not performed. +3. Depending on the type of review, suggest fixes as follows: + - For review requests, report issues by file and line when possible, ordered by learner impact. + - For edit requests, report issues and suggest focused changes that preserve technical intent and existing repository patterns. +4. After the reviewer accepts suggestions, make changes, then re-scan edited areas for code fence integrity, language tags, and output lead-ins. +5. Report what changed and note any technical assumptions or checks not performed. ## Validation rules From 6279885087a9a96ff78c350dddec15ee890added Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 11:48:28 -0500 Subject: [PATCH 055/137] restructuring steps for link-text-review --- .github/skills/link-text-review/SKILL.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/skills/link-text-review/SKILL.md b/.github/skills/link-text-review/SKILL.md index 99cfae1c9e..f874ff9a19 100644 --- a/.github/skills/link-text-review/SKILL.md +++ b/.github/skills/link-text-review/SKILL.md @@ -19,24 +19,20 @@ This skill focuses on anchor text and link clarity. For tables, notices, tab pan ## Workflow 1. Identify the target file, directory, section, or selected text. -2. Read surrounding context before changing link text. -3. Find vague anchors such as `here`, `click here`, `this page`, `read more`, `link`, bare URLs, or repeated generic text. -4. Verify internal links before editing when practical. -5. Rewrite anchor text to describe the destination, action, or resource. -6. Preserve the URL unless it is broken or the user asks to change it. -7. Keep anchor text concise and natural in the sentence. -8. Re-open or search changed lines to verify the Markdown link syntax is valid. -9. Report changed links and any links not verified. +2. Read surrounding context before suggesting any changes. +3. After understanding the context of the URL, suggest concise and natural rewrites to the anchor text based on `Quality rules`. +4. After the user accepts suggestions, make changes, then re-open or search changed lines to verify the Markdown link syntax is valid. +5. After you make changes, report changed links and any links not verified. ## Quality rules - Link text should make sense without nearby words when possible. - Prefer destination-specific anchors such as `Docker install guide`, `Arm Developer resources`, or `Google Cloud firewall rules`. -- Avoid anchors that only describe the mechanic, such as `click here`, `this link`, or `website`. +- Avoid anchors that only describe the mechanic, such as `here`, `click here`, `this page`, `read more`, `link`, or `website`, as well as bare URLs or repeated generic text. - Avoid overlong anchors that wrap a whole sentence. - Follow `.github/skills/arm-content-editor/references/writing-style.md` for URL path format. - Don't change product names, tool names, URLs, or technical meaning to satisfy prose preferences. -- Don't add speculative links. Verify internal targets or state when verification was not possible. +- Don't add speculative links. Verify internal targets or state when verification was not possible. Preserve the URL unless it's broken or the user asks for a change. ## Examples From f269a3d632df480dcc2b74932cac2fb88948a9bf Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 11:54:15 -0500 Subject: [PATCH 056/137] updating link examples --- .github/skills/link-text-review/SKILL.md | 4 ++-- .github/skills/markdown-component-edit/SKILL.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/skills/link-text-review/SKILL.md b/.github/skills/link-text-review/SKILL.md index f874ff9a19..b4b0c699c3 100644 --- a/.github/skills/link-text-review/SKILL.md +++ b/.github/skills/link-text-review/SKILL.md @@ -45,7 +45,7 @@ See [here](/install-guides/docker/) for setup. Better: ```md -See the [Docker install guide](/install-guides/docker/) for setup. +For setup instructions, see the [Docker install guide](/install-guides/docker/). ``` Poor: @@ -57,5 +57,5 @@ A list of all AWS instance types can be [viewed here](https://aws.amazon.com/ec2 Better: ```md -See the [Amazon EC2 instance types](https://aws.amazon.com/ec2/instance-types/) for a complete list. +For a complete list, see [Amazon EC2 instance types](https://aws.amazon.com/ec2/instance-types/). ``` diff --git a/.github/skills/markdown-component-edit/SKILL.md b/.github/skills/markdown-component-edit/SKILL.md index 9bcead8cbc..66ced2e3be 100644 --- a/.github/skills/markdown-component-edit/SKILL.md +++ b/.github/skills/markdown-component-edit/SKILL.md @@ -23,7 +23,7 @@ This skill is best when the user highlights text, names a section, or asks for a 3. Verify internal links before adding or changing them when practical. 4. Do one of the following: - If the target isn't a good fit for the provided component, push back with justification. Rely on component rules. - - If it's a good fit, or if the reviewer has a justifiable reason to request an unusual update, make the update. + - If it's a good fit, or if the reviewer voluntarily requests an unusual update, make the update. 4. After making an update, re-open or search the edited area to verify shortcode pairs, table rows, links, and code fences are well formed. 5. Report the component added or changed and note any links or syntax that could not be verified. From 30ea8c2df09466a59496644c5a381125b442b58f Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 11:54:59 -0500 Subject: [PATCH 057/137] removing links from structured component reference --- .../references/component-patterns.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/skills/markdown-component-edit/references/component-patterns.md b/.github/skills/markdown-component-edit/references/component-patterns.md index 00dfef2d2b..653089fe18 100644 --- a/.github/skills/markdown-component-edit/references/component-patterns.md +++ b/.github/skills/markdown-component-edit/references/component-patterns.md @@ -1,4 +1,4 @@ -# Component patterns +# Structured component patterns Use these patterns when adding or editing structured Markdown and Hugo components. @@ -86,16 +86,4 @@ Rules: - Keep each tab roughly comparable in length and detail. - Avoid hiding critical sequential instructions inside tabs unless the user chooses one path. -## Links -Use inline Markdown links for a single destination-specific reference. For broader anchor-text cleanup, use `.github/skills/link-text-review/SKILL.md`. - -```md -See the [Docker install guide](/install-guides/docker/) to set up a container runtime. -``` - -Rules: - -- Keep link text descriptive and natural in the sentence. -- Verify internal links when practical. -- Follow `.github/skills/arm-content-editor/references/writing-style.md` for URL path format. From 710d47601e7bb6e0fd0d8a8c65080c9b941fe755 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 12:02:36 -0500 Subject: [PATCH 058/137] removing some guidance that's not relevant --- .../code-sample-review/references/code-sample-guidance.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/skills/code-sample-review/references/code-sample-guidance.md b/.github/skills/code-sample-review/references/code-sample-guidance.md index 330621f7bf..d5b4d48319 100644 --- a/.github/skills/code-sample-review/references/code-sample-guidance.md +++ b/.github/skills/code-sample-review/references/code-sample-guidance.md @@ -29,8 +29,6 @@ - Use *italics* for emphasis and new terms. - Use `code formatting` for file names, commands, code elements, package names, flags, paths, and environment variables. - In code blocks, CLI flags, package names, file paths, outputs, and tool messages, keep the exact casing used by the tool. -- Use `arm64` or `aarch64` for CPU architecture. Prefer whichever term a tool, package, or operating system uses natively. -- `ARM64` is acceptable when specifically referring to Windows on Arm or Microsoft documentation. ## Code fence integrity From 95f38bc61af4aad7a8ababd5d583db4799104b90 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 12:15:13 -0500 Subject: [PATCH 059/137] edits --- .github/skills/markdown-component-edit/SKILL.md | 2 +- AGENTS.md | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/skills/markdown-component-edit/SKILL.md b/.github/skills/markdown-component-edit/SKILL.md index 66ced2e3be..5ee44ce6c7 100644 --- a/.github/skills/markdown-component-edit/SKILL.md +++ b/.github/skills/markdown-component-edit/SKILL.md @@ -21,7 +21,7 @@ This skill is best when the user highlights text, names a section, or asks for a 1. Use the user's highlighted, selected, or explicitly named text as the edit target. If the target is ambiguous, ask for the exact text, file, or section before editing. 2. Inspect nearby Markdown so the new component fits the surrounding flow. 3. Verify internal links before adding or changing them when practical. -4. Do one of the following: +4. Use `component rules` and the `component-patterns` reference and do one of the following: - If the target isn't a good fit for the provided component, push back with justification. Rely on component rules. - If it's a good fit, or if the reviewer voluntarily requests an unusual update, make the update. 4. After making an update, re-open or search the edited area to verify shortcode pairs, table rows, links, and code fences are well formed. diff --git a/AGENTS.md b/AGENTS.md index ddeb94e3b2..753c01fc51 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,15 +8,14 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - `content/learning-paths/` contains task-led, end-to-end tutorials. - `content/install-guides/` contains installation and verification guides. -- `.github/instructions/` contains scoped content guidance. - `.github/skills/` contains reusable reviewer workflows and task-specific capabilities. ## Source of truth - Repository router: `AGENTS.md` - General Arm content editing: `.github/skills/arm-content-editor/SKILL.md` -- Learning Paths: `.github/skills/arm-content-editor/references/learning-path-guidance.md` -- Install guides: `.github/skills/arm-content-editor/references/install-guide-guidance.md` +- Learning Paths-specific guidance: `.github/skills/arm-content-editor/references/learning-path-guidance.md` +- Install guides-specific guidance: `.github/skills/arm-content-editor/references/install-guide-guidance.md` - Shared content quality: `.github/skills/arm-content-editor/references/content-quality.md` - Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` - SEO, GEO, AEO, and AI-agent discoverability: `.github/skills/seo-geo-aeo-review/SKILL.md` From 95848bba2ae4bbe7315ef9ff9249a72791c465e9 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 16 Jun 2026 14:50:52 -0500 Subject: [PATCH 060/137] updating steps for metadata description skill --- .github/skills/metadata-description-update/SKILL.md | 11 +++++------ .github/skills/seo-geo-aeo-review/SKILL.md | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/skills/metadata-description-update/SKILL.md b/.github/skills/metadata-description-update/SKILL.md index b2e8f76391..37e14af97b 100644 --- a/.github/skills/metadata-description-update/SKILL.md +++ b/.github/skills/metadata-description-update/SKILL.md @@ -26,16 +26,15 @@ This skill is for search and discovery metadata. For draft visibility metadata, - Multi-page install guide directory: update the main entry page and public sub-pages that need descriptions. - Preserve existing front matter order when practical. If adding a missing description, place it near `title`. - Preserve body content, shortcodes, links, commands, code blocks, and expected output. Don't edit anything that isn't metadata. +- Skip `_next-steps.md` and any file without front matter unless the user explicitly asks how to handle it. ## Workflow 1. Identify whether the target is an install guide content page, a Learning Path `_index.md`, or a Learning Path content page. -2. Find target Markdown files from the scope rules. -3. Skip `_next-steps.md` and any file without front matter unless the user explicitly asks how to handle it. -4. Read the title, existing description, headings, introduction, task flow, code or command context, and validation or conclusion. -5. Add or revise the `description` field in front matter based on quality rules. -6. Re-open or search the edited files to verify each changed target has one `description` field. -7. Report files changed and note any skipped files. +2. Read the title, existing description, headings, introduction, task flow, code or command context, and validation or conclusion. +3. Add or revise the `description` field in front matter based on quality rules. +4. After editing, re-open or search the files to verify each changed target has one `description` field. +5. Report files changed and note any skipped files. ## Description quality rules diff --git a/.github/skills/seo-geo-aeo-review/SKILL.md b/.github/skills/seo-geo-aeo-review/SKILL.md index 7f5fd69030..05f2385597 100644 --- a/.github/skills/seo-geo-aeo-review/SKILL.md +++ b/.github/skills/seo-geo-aeo-review/SKILL.md @@ -22,7 +22,7 @@ For focused front matter `description` edits only, use `.github/skills/metadata- - For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md`. - For install guides, read `.github/skills/arm-content-editor/references/install-guide-guidance.md`. - Read `.github/skills/arm-content-editor/references/content-quality.md` only when broader clarity, accessibility, or Arm framing is in scope. -- For Learning Paths discovery guidance, review `.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md`. +- For additional Learning Paths discovery guidance, review `.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md`. ## Workflow From adb51c0446a73acf81f524d359114259f0c4451a Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 17 Jun 2026 09:21:13 -0500 Subject: [PATCH 061/137] updates to minimize loaded content --- .github/skills/arm-content-editor/SKILL.md | 38 +++++++++++--------- .github/skills/stale-content-review/SKILL.md | 12 +++---- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md index 5cb2a23e96..4d09c5f029 100644 --- a/.github/skills/arm-content-editor/SKILL.md +++ b/.github/skills/arm-content-editor/SKILL.md @@ -5,34 +5,39 @@ description: Review and edit Arm Learning Paths and install guides. Use when aud # Arm content editor -Use this skill to review or edit Arm Learning Paths and install guides with focused, high-signal feedback and minimal necessary changes. You'll be performing a second pass after an initial human editorial review. +Use this skill as a second-pass reviewer for Arm Learning Paths and install guides. Focus on high-impact issues a human reviewer might miss. Targets are usually selected or referenced Learning Path or install guide files. If the request names a directory, review the files in that content unit together so metadata, terminology, headings, links, and task flow stay consistent. ## Load guidance -Start with `AGENTS.md` at the repository root to identify the right source files. +Use `AGENTS.md` as the router. Load only the narrowest guidance needed. -Read only the guidance needed for the task. Don't load files that aren't necessary for the task: +For routine second-pass review, start with only the target's content-type guidance: +- Learning Path: `references/learning-path-guidance.md` +- Install guide: `references/install-guide-guidance.md` +- Mixed or unclear scope: `references/repository-guidance.md` -- Repository structure and content model: `references/repository-guidance.md` -- Writing style, headings, links, terminology, and prose cleanup: `references/writing-style.md` -- Shared content quality and discoverability: `references/content-quality.md` -- Learning Paths: `references/learning-path-guidance.md` -- Install guides: `references/install-guide-guidance.md` +Add general guidance only when the review scope calls for it: +- Prose/style/accessibility: `references/writing-style.md` +- Shared quality/discoverability: `references/content-quality.md` + +Add focused guidance only when the task or content requires it: - Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` -- SEO, GEO, AEO, and AI-agent discoverability: `.github/skills/seo-geo-aeo-review/SKILL.md` +- SEO/GEO/AEO: `.github/skills/seo-geo-aeo-review/SKILL.md` +- Links: `.github/skills/link-text-review/SKILL.md` +- Images: `.github/skills/audit-images/SKILL.md` +- Code samples: `.github/skills/code-sample-review/SKILL.md` +- Staleness: `.github/skills/stale-content-review/SKILL.md` - Markdown components: `.github/skills/markdown-component-edit/SKILL.md` -- Accessible link text: `.github/skills/link-text-review/SKILL.md` -- Stale content risk scans: `.github/skills/stale-content-review/SKILL.md` -- Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` -- Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` + +Do not load all guidance files for routine review. ## Review workflow -1. Identify whether the target is a Learning Path, install guide, or mixed content. -2. Load the matching scoped guidance. -3. Use repository search when cross-file consistency, links, terminology, or metadata depends on surrounding content. +1. Identify whether the target is a Learning Path or an install guide. +2. Depending on what type of content it is, load the minimum guidance and review against those guidelines. +3. If the initial review finds a likely issue covered by a focused skill, load only that skill before making the finding. 4. Suggest updates in the format specified under `Response format`. Don't comment on content that is already clear, correct, and fit for purpose. 5. When the reviewer accepts all or part of your submissions and asks you to proceed, go ahead and make updates. @@ -48,6 +53,7 @@ Don't recommend splitting content only because a file is long. Prefer semantic b - Verify internal links before changing them, or state when link verification was not possible. - Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. - Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. +- Use repository search when cross-file consistency, links, terminology, or metadata depends on surrounding content. ## Response format diff --git a/.github/skills/stale-content-review/SKILL.md b/.github/skills/stale-content-review/SKILL.md index 5547bf49ef..ec22056506 100644 --- a/.github/skills/stale-content-review/SKILL.md +++ b/.github/skills/stale-content-review/SKILL.md @@ -5,7 +5,7 @@ description: Scan Arm Learning Paths and install guides for stale-content risk. # Stale content review -Use this skill to find Learning Paths and install guides that may need human maintenance review. This skill is report-only by default: flag risk, provide evidence, and leave fixes to the relevant owner unless the user explicitly asks for edits. +Use this skill to find Learning Paths and install guides that might need human maintenance review. This skill is report-only by default: flag risk, provide evidence, and leave fixes to the relevant owner unless the user explicitly asks for edits. ## Prerequisites @@ -19,11 +19,6 @@ Use this skill to find Learning Paths and install guides that may need human mai 2. Run `scripts/stale_content_scan.py` for a deterministic first pass. 3. Review the highest-scoring files and sample lines before drawing conclusions. 4. Summarize what each selected guide or page does, the dependencies or moving parts it relies on, and the review flags a human should consider. -5. Use related skills for focused follow-up: - - `audit-images` for screenshot, image, alt text, and caption review. - - `code-sample-review` for commands, package installs, outputs, and code fence integrity. - - `arm-content-editor` for Arm terminology, product naming, and broader content judgment. - - `link-text-review` for stale or vague external links that also need accessible anchor text. ## Validation rules @@ -34,6 +29,11 @@ Use this skill to find Learning Paths and install guides that may need human mai - Be explicit when a flag is uncertain or only a heuristic signal. - Keep periodic scan output lightweight enough for a reviewer to act on. - Prefer questions and maintenance prompts over direct edits. +- Use related skills for focused follow-up: + - `audit-images` for screenshot, image, alt text, and caption review. + - `code-sample-review` for commands, package installs, outputs, and code fence integrity. + - `arm-content-editor` for Arm terminology, product naming, and broader content judgment. + - `link-text-review` for stale or vague external links that also need accessible anchor text. ## Script usage From 884c0af2b019c92d134cd7f53782083fba711797 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 17 Jun 2026 09:32:43 -0500 Subject: [PATCH 062/137] completing intake metadata skill --- .github/skills/intake-metadata-update/SKILL.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/skills/intake-metadata-update/SKILL.md b/.github/skills/intake-metadata-update/SKILL.md index 04c5783602..6067ea40d8 100644 --- a/.github/skills/intake-metadata-update/SKILL.md +++ b/.github/skills/intake-metadata-update/SKILL.md @@ -7,7 +7,7 @@ description: Add or verify draft metadata for new Arm Learning Paths and install Use this skill when new Learning Path or install guide content needs to remain unpublished until technical and editorial review is complete. -Work from the repository root and preserve existing front matter values. Preserve existing front matter order where possible. +Work from the repository root and preserve existing front matter values and order where possible. Don't edit anything else in the file. ## Workflow @@ -28,4 +28,8 @@ Work from the repository root and preserve existing front matter values. Preserv ```yaml draft: true - ``` \ No newline at end of file + ``` + +## Response format + +List the file(s) that were updated. \ No newline at end of file From fefa640682f5213b1a3546abd34543fd42c2bc36 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 17 Jun 2026 10:23:57 -0500 Subject: [PATCH 063/137] splitting content-editor into multiple separate skills --- .../content-quality.instructions.md | 10 +- .../install-guides.instructions.md | 7 +- .../learning-paths.instructions.md | 7 +- .github/skills/arm-content-editor/SKILL.md | 62 -------- .../references/content-quality.md | 26 --- .../references/install-guide-guidance.md | 99 ------------ .../references/learning-path-guidance.md | 144 ----------------- .../references/repository-guidance.md | 48 ------ .../references/writing-style.md | 150 ------------------ .github/skills/frontmatter-audit/SKILL.md | 70 ++++++++ .../install-guide-structure-review/SKILL.md | 56 +++++++ .../learning-path-structure-review/SKILL.md | 67 ++++++++ .github/skills/link-text-review/SKILL.md | 6 +- .../metadata-description-update/SKILL.md | 6 +- .github/skills/seo-geo-aeo-review/SKILL.md | 5 +- .github/skills/stale-content-review/SKILL.md | 5 +- .github/skills/writing-style-review/SKILL.md | 135 ++++++++++++++++ AGENTS.md | 13 +- 18 files changed, 360 insertions(+), 556 deletions(-) delete mode 100644 .github/skills/arm-content-editor/SKILL.md delete mode 100644 .github/skills/arm-content-editor/references/content-quality.md delete mode 100644 .github/skills/arm-content-editor/references/install-guide-guidance.md delete mode 100644 .github/skills/arm-content-editor/references/learning-path-guidance.md delete mode 100644 .github/skills/arm-content-editor/references/repository-guidance.md delete mode 100644 .github/skills/arm-content-editor/references/writing-style.md create mode 100644 .github/skills/frontmatter-audit/SKILL.md create mode 100644 .github/skills/install-guide-structure-review/SKILL.md create mode 100644 .github/skills/learning-path-structure-review/SKILL.md create mode 100644 .github/skills/writing-style-review/SKILL.md diff --git a/.github/instructions/content-quality.instructions.md b/.github/instructions/content-quality.instructions.md index 9772dc739c..e0384278f9 100644 --- a/.github/instructions/content-quality.instructions.md +++ b/.github/instructions/content-quality.instructions.md @@ -1,10 +1,12 @@ --- name: Content quality and discoverability guidelines -description: Use the Arm content editor skill for clarity, Arm-specific framing, accessibility, and link quality. Use the SEO/GEO/AEO review skill for search discoverability and AI-readable structure. +description: Use focused skills for Learning Path structure, install guide structure, writing style, front matter, link quality, accessibility, and SEO/GEO/AEO discoverability. applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" --- -Content quality guidance now lives in `.github/skills/arm-content-editor/references/content-quality.md`. - -For review and editing workflows, use `.github/skills/arm-content-editor/SKILL.md`. +For Learning Path task flow and structural readiness, use `.github/skills/learning-path-structure-review/SKILL.md`. +For install guide scope, verification, and structural readiness, use `.github/skills/install-guide-structure-review/SKILL.md`. +For prose clarity, Arm terminology, accessibility language, and AI-sounding text, use `.github/skills/writing-style-review/SKILL.md`. +For metadata and front matter, use `.github/skills/frontmatter-audit/SKILL.md`. +For accessible link text, use `.github/skills/link-text-review/SKILL.md`. For focused SEO, GEO, AEO, and AI-agent discoverability review, use `.github/skills/seo-geo-aeo-review/SKILL.md`. diff --git a/.github/instructions/install-guides.instructions.md b/.github/instructions/install-guides.instructions.md index 6f0dc29cad..2ad47f950b 100644 --- a/.github/instructions/install-guides.instructions.md +++ b/.github/instructions/install-guides.instructions.md @@ -1,9 +1,10 @@ --- name: Install guides general guidance -description: Use the Arm content editor skill for install guide review, editing, metadata, scope, structure, and verification guidance. +description: Use the install guide structure review skill for install guide scope, structure, verification, troubleshooting, version notes, and multi-page guide guidance. applyTo: "content/install-guides/**/*.md" --- -Install guide guidance now lives in `.github/skills/arm-content-editor/references/install-guide-guidance.md`. +Install guide structure guidance now lives in `.github/skills/install-guide-structure-review/SKILL.md`. -For review and editing workflows, use `.github/skills/arm-content-editor/SKILL.md`. +For front matter and metadata checks, use `.github/skills/frontmatter-audit/SKILL.md`. +For writing style and voice checks, use `.github/skills/writing-style-review/SKILL.md`. diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md index d64ad5e271..a5330f6bdf 100644 --- a/.github/instructions/learning-paths.instructions.md +++ b/.github/instructions/learning-paths.instructions.md @@ -1,9 +1,10 @@ --- name: Learning Paths general guidance -description: Use the Arm content editor skill for Learning Path review, editing, metadata, task ownership, structure, and scope guidance. +description: Use the Learning Path structure review skill for Learning Path task ownership, structure, scope, validation, further reading, and recap guidance. applyTo: "content/learning-paths/**/*.md" --- -Learning Path guidance now lives in `.github/skills/arm-content-editor/references/learning-path-guidance.md`. +Learning Path structure guidance now lives in `.github/skills/learning-path-structure-review/SKILL.md`. -For review and editing workflows, use `.github/skills/arm-content-editor/SKILL.md`. +For front matter and metadata checks, use `.github/skills/frontmatter-audit/SKILL.md`. +For writing style and voice checks, use `.github/skills/writing-style-review/SKILL.md`. diff --git a/.github/skills/arm-content-editor/SKILL.md b/.github/skills/arm-content-editor/SKILL.md deleted file mode 100644 index 4d09c5f029..0000000000 --- a/.github/skills/arm-content-editor/SKILL.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -name: arm-content-editor -description: Review and edit Arm Learning Paths and install guides. Use when auditing or improving content quality, metadata descriptions, SEO/GEO/AEO discoverability, Arm-specific framing, install guide versus Learning Path scope, Markdown image alt text, stale or token-heavy content, and focused reviewer feedback. ---- - -# Arm content editor - -Use this skill as a second-pass reviewer for Arm Learning Paths and install guides. Focus on high-impact issues a human reviewer might miss. - -Targets are usually selected or referenced Learning Path or install guide files. If the request names a directory, review the files in that content unit together so metadata, terminology, headings, links, and task flow stay consistent. - -## Load guidance - -Use `AGENTS.md` as the router. Load only the narrowest guidance needed. - -For routine second-pass review, start with only the target's content-type guidance: -- Learning Path: `references/learning-path-guidance.md` -- Install guide: `references/install-guide-guidance.md` -- Mixed or unclear scope: `references/repository-guidance.md` - -Add general guidance only when the review scope calls for it: -- Prose/style/accessibility: `references/writing-style.md` -- Shared quality/discoverability: `references/content-quality.md` - -Add focused guidance only when the task or content requires it: -- Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` -- SEO/GEO/AEO: `.github/skills/seo-geo-aeo-review/SKILL.md` -- Links: `.github/skills/link-text-review/SKILL.md` -- Images: `.github/skills/audit-images/SKILL.md` -- Code samples: `.github/skills/code-sample-review/SKILL.md` -- Staleness: `.github/skills/stale-content-review/SKILL.md` -- Markdown components: `.github/skills/markdown-component-edit/SKILL.md` - -Do not load all guidance files for routine review. - -## Review workflow - -1. Identify whether the target is a Learning Path or an install guide. -2. Depending on what type of content it is, load the minimum guidance and review against those guidelines. -3. If the initial review finds a likely issue covered by a focused skill, load only that skill before making the finding. -4. Suggest updates in the format specified under `Response format`. Don't comment on content that is already clear, correct, and fit for purpose. -5. When the reviewer accepts all or part of your submissions and asks you to proceed, go ahead and make updates. - -Don't recommend splitting content only because a file is long. Prefer semantic boundaries based on headings, task transitions, or conceptual changes. - -## Editing workflow - -- Make focused edits that preserve the author's intent. -- Preserve front matter, Hugo shortcodes, code fences, command syntax, file structure, and existing technical flow. -- Prefer Arm-native framing and flag x86 assumptions. -- Preserve content-type boundaries: install guides stay limited to installation and verification, while Learning Paths own one concrete developer task. -- Keep tone natural and developer-focused. Avoid hype, generic praise, and unnecessary rewrites. -- Verify internal links before changing them, or state when link verification was not possible. -- Prioritize learner-blocking issues, incorrect technical guidance, scope drift, missing metadata, broken links, weak Arm framing, image issues, and unclear validation steps. -- Classify substantial files as prose-heavy, mixed, or code-heavy before judging length or density. -- Use repository search when cross-file consistency, links, terminology, or metadata depends on surrounding content. - -## Response format - -For review requests, lead with findings in an ordered list by severity and type. Include file and line references when available. Then add open questions, followed by a brief summary. - -After the reviewer asks to implement suggested fixes, summarize the key changes and note any checks or verification performed. diff --git a/.github/skills/arm-content-editor/references/content-quality.md b/.github/skills/arm-content-editor/references/content-quality.md deleted file mode 100644 index 9d0b666902..0000000000 --- a/.github/skills/arm-content-editor/references/content-quality.md +++ /dev/null @@ -1,26 +0,0 @@ -# Content quality and discoverability - -Use this guidance when creating, editing, or reviewing Arm Learning Paths or install guides for clarity, Arm-specific framing, accessibility, link quality, search discoverability, and AI-readable structure. - -For focused SEO, GEO, AEO, search intent, or AI-agent selection review, use `.github/skills/seo-geo-aeo-review/SKILL.md`. - -## Quality rules - -- Default to Arm-native solutions, Arm terminology, and Arm platform assumptions. -- Flag x86 assumptions and suggest Arm alternatives when available. -- Match technical depth to the stated audience, prerequisites, and skill level. -- Use clear headings, descriptive link text, tagged code blocks, and problem-solution troubleshooting. -- Verify internal links before adding or changing them. -- Use Arm-specific keywords naturally; avoid keyword stuffing, hype, and marketing language. -- Prefer prose for explanations and lists for steps, checks, options, and troubleshooting. -- Keep content accessible for screen readers, use clear alt and link text, and avoid assumptions about a reader's physical setup or environment. -- Structure content so each major section has a clear purpose, useful context, and an explicit outcome. Use semantic HTML structure in Markdown when possible. - -## Trade-off priorities - -When content trade-offs are required, prioritize the following in order: - -1. Alignment with the stated purpose and positioning of the content. -2. Clarity and readability for the intended skill level. -3. Consistency with existing Learning Paths and install guides. -4. Completeness within the stated scope. diff --git a/.github/skills/arm-content-editor/references/install-guide-guidance.md b/.github/skills/arm-content-editor/references/install-guide-guidance.md deleted file mode 100644 index 86ba8f1c57..0000000000 --- a/.github/skills/arm-content-editor/references/install-guide-guidance.md +++ /dev/null @@ -1,99 +0,0 @@ -# Install guide-specific guidance - -Use this guidance when creating, editing, or reviewing content in `content/install-guides/**/*.md`. - -## Install guide requirements - -Install guides focus on installing and verifying one tool on Arm platforms. They do not teach workflows or applied usage. - -## Front matter requirements - -Install guides must include: - -- `title` -- `minutes_to_complete` -- `official_docs` -- `author` -- `weight: 1` -- `layout: installtoolsall` - -Fixed fields: - -- `weight: 1` always. -- `tool_install: true`, set to false only if intentionally hidden. -- `layout: installtoolsall` always. -- `multi_install` and `multitool_install_part`, set based on whether the install guide is multi-page. - -Do not modify fixed template fields. - -If `multi_install` is set to true, the first page must act as an overview for the series. Sub-pages must set `multitool_install_part: true`. - -## Required content structure - -Install guides should include: - -1. Overview - - What the tool is. - - Supported Arm platforms, such as `aarch64`, Windows on Arm, and macOS on Arm where applicable. - -2. Install steps - - Clear OS-specific sections when necessary. - - Commands grouped logically. - - Explanation before each code block. - -3. Verify installation - - One or two commands. - - Expected output shown. - -4. Troubleshooting - - Common failure cases. - - Clear fixes. - -Uninstall and troubleshooting instructions are optional. - -## Scope boundaries - -Install guides must not include: - -- End-to-end workflows. -- Performance benchmarking. -- Deep architectural explanation. -- Comparative marketing claims. - -Learning Paths can link to install guides for setup steps. Install guides should not duplicate workflow content. - -## Tool versions - -When providing commands for downloading or installing software, use a specific version in the example. This ensures that the instructions are accurate and verifiable. - -Also include a note before the commands that tells readers the same commands work with other versions. Provide a link to where the latest version can be found. - -Use this pattern: - -```md -{{% notice Note %}} -The following commands use version . The same commands work with other versions. Replace the file used in these steps with the file for your version of choice. To find the latest version, see [Link to page with release info](URL). -{{% /notice %}} -``` - -## Metadata description requirements - -Every install guide front matter must include a `description` field. - -For description wording, examples, and update workflow, use `.github/skills/metadata-description-update/SKILL.md`. - -## Recap section - -Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module. - -Use this pattern: - -```md -## Next steps - -In this section, briefly summarize what the user has learned or completed. Suggest and link to a couple relevant Learning Paths if they exist. - -Keep this concise and encouraging. Do not repeat earlier content verbatim. -``` - -This helps learners feel a sense of progress. diff --git a/.github/skills/arm-content-editor/references/learning-path-guidance.md b/.github/skills/arm-content-editor/references/learning-path-guidance.md deleted file mode 100644 index 9db93d5905..0000000000 --- a/.github/skills/arm-content-editor/references/learning-path-guidance.md +++ /dev/null @@ -1,144 +0,0 @@ -# Learning Path guidance - -Use this guidance when creating, editing, or reviewing content in `content/learning-paths/**/*.md`. - -## Content structure - -Each Learning Path must have an `_index.md` file and a `_next-steps.md` file. The `_index.md` file contains the main content of the Learning Path. The `_next-steps.md` file contains links to related content and is included at the end of the Learning Path. - -Additional resources and next steps content should be placed in the `further_reading` section of `_index.md`, not in `_next-steps.md`. The `_next-steps.md` file should remain minimal and unmodified as indicated by `FIXED, DO NOT MODIFY` comments in the template. - -## Front matter - -The `_index.md` file should contain the following front matter and content sections: - -- `title`: Imperative heading following the `[verb] + [technology] + [outcome]` format. -- `description`: One-sentence metadata summary used for search snippets and page previews. Describe the task, main technology or platform, and expected outcome in plain language. -- `weight`: Numerical ordering for display sequence. `weight` is 1 for `_index.md`, and each page is ordered by weight. No Markdown files should have the same weight in a directory. -- `layout`: Template type, usually `learningpathall`. -- `minutes_to_complete`: Realistic time estimate for completion. -- `prerequisites`: List of required knowledge, tools, or prior Learning Paths. -- `author`: Main contributor's name. Multiple authors can be listed with `-` on new lines. -- `subjects`: Technology categories for filtering and search. This is a closed list and must match the subjects in `content/learning-paths/cross-platform/_example-learning-path/write-2-metadata/`. -- `armips`: Relevant Arm IP. Stick to Neoverse, Cortex-A, Cortex-M, and similar values. Do not list specific CPU models or Arm architecture versions. -- `tools_software_languages`: Open category listing programming languages, frameworks, and development tools used. -- `skilllevels`: Allowed values are only `Introductory` and `Advanced`. -- `operatingsystems`: Operating systems used. This is a closed list and must match `content/learning-paths/cross-platform/_example-learning-path/write-2-metadata/`. - -## Further reading curation - -Limit `further_reading` resources to four to six essential links. Prioritize: - -- Direct relevance to the topic. -- Arm-specific Learning Paths over generic external resources. -- Foundation knowledge for the target audience. -- Required tools, such as install guides. -- Logical progression from basic to advanced. - -Avoid overwhelming readers with too many links, which can cause them to leave the platform. - -Put additional links in `further_reading` in `_index.md`, not `_next-steps.md`. - -## Expected Learning Path shape - -Learning Paths should generally include: - -- Title: `[Imperative verb] + [technology/tool] + [outcome]`. -- Introduction paragraph: Context, user goal, and value proposition. -- Prerequisites section with explicit requirements and links. -- Learning objectives: three to four bulleted, measurable outcomes with action verbs. -- Step-by-step sections with logical progression. -- Clear next steps or conclusion. - -For title formatting: - -- Use imperative voice, such as `Deploy`, `Configure`, `Build`, or `Create`. -- Include the main technology names and tools naturally. -- Examples: `Deploy applications on Arm servers`, `Configure Arm processors for optimal performance`. - -## Metadata description requirements - -Every Learning Path `_index.md` must include a `description` field. - -For description wording, examples, and update workflow, use `.github/skills/metadata-description-update/SKILL.md`. - -## Recap sections - -Include a short recap paragraph and forward-looking transition at the end of each major instructional section or module. - -Use this pattern: - -```md -## What you've learned and what's next - -In this section: -- Briefly summarize what the user has learned or completed. -- Briefly describe what the user should expect in the next section or suggest further exploration. - -Keep this concise and encouraging. Do not repeat earlier content verbatim. -``` - -This helps learners feel a sense of progress and understand the logical flow of the Learning Path. - -Use `what you've learned` for conceptual sections and `what you've accomplished` for task sections. - -## Hyperlinks - -When creating Learning Path content: - -- Verify internal links exist before adding them. -- Use semantic search or website browsing to confirm Learning Path availability. -- Prefer verified external authoritative sources over speculative internal links. -- Test link formats against existing Learning Path examples. -- Never assume Learning Paths exist without verification. - -## Purpose and agentic selection - -Learning Paths should own one clear developer task and stay distinct from blog posts, reference articles, and install guides. - -For SEO, GEO, AEO, and AI-agent selection guidance, use `.github/skills/seo-geo-aeo-review/SKILL.md`. - -## Performance and Arm acceleration integrity - -For Learning Paths that demonstrate Arm-specific performance features, such as SME2, SVE2, I8MM, DotProd, or optimized microkernels, apply these standards. - -### Observable outcome first - -- Clearly state what measurable improvement the learner will observe. -- Show performance results before introducing deep architectural explanation. -- Avoid introducing internal call stacks or microkernel details before the developer sees observable value. - -### Reproducibility requirements - -If performance numbers are included, specify: - -- Toolchain or software version. -- Device or platform used. -- Thread count and CPU affinity configuration. -- Runtime feature flags. -- Model or workload configuration. - -Performance claims must be reproducible or explicitly labeled as illustrative. - -### Compile-time versus runtime clarity - -Clearly distinguish between: - -- Compile-time feature enablement. -- Runtime feature activation. -- Automatic fallback behavior. - -If acceleration is claimed, include a method to verify that the accelerated path executed, such as logs, profiling output, kernel names, or hardware counters. - -### Controlled benchmarking - -When comparing performance: - -- Change only one meaningful variable at a time. -- Control thread count and CPU binding intentionally. -- Quantify percentage improvement explicitly. -- Avoid presenting raw numbers without context. - -Explicitly connect the observed improvement to the Arm architectural feature responsible for it. Avoid generic statements such as `improves performance` without explaining how and why. - -Performance-focused Learning Paths are strategic content. Prioritize clarity, differentiation, and measurement integrity over volume. diff --git a/.github/skills/arm-content-editor/references/repository-guidance.md b/.github/skills/arm-content-editor/references/repository-guidance.md deleted file mode 100644 index 76437b4594..0000000000 --- a/.github/skills/arm-content-editor/references/repository-guidance.md +++ /dev/null @@ -1,48 +0,0 @@ -# Repository guidance - -## Project overview - -This project is a collection of Learning Paths and install guides for learn.arm.com. The content explains how to develop software on Arm for software developers targeting Arm platforms. - -Assume the audience is made up of Arm software developers. Bias information toward Arm platforms. For Linux, assume systems are `aarch64` unless context says otherwise. Readers also use macOS and Windows on Arm systems. - -## Guidance boundaries - -Use this file for repository-wide orientation only. For task-specific rules, load the narrowest relevant guidance: - -- Learning Path structure and scope: `learning-path-guidance.md` -- Install guide structure and scope: `install-guide-guidance.md` -- Shared content quality: `content-quality.md` -- Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` -- SEO, GEO, AEO, and AI-agent discoverability: `.github/skills/seo-geo-aeo-review/SKILL.md` -- Images and alt text: `.github/skills/audit-images/SKILL.md` - -## Project structure - -Top-level directories: - -- `/content`: Main directory containing Learning Paths and install guides as Markdown files. -- `/themes`: HTML templates and styling elements that render the final website. -- `/tools`: Python scripts for automated website integrity checking. -- `config.toml`: High-level Hugo configuration settings. - -Content directories: - -- `content/learning-paths/`: Core learning content organized by category. -- `content/install-guides/`: Tool installation guides with supporting subdirectories and shared images. - -Special content directories: - -- `content/migration/`: Migration guides and resources for `https://learn.arm.com/migration`. -- `content/lists/`: Content listing and organization files for `https://learn.arm.com/lists`. -- `content/stats/`: Website statistics and analytics for `https://learn.arm.com/stats`. - -## Content type boundaries - -- Learning Paths are end-to-end tasks with prepare, configure, use, and validate stages. -- Install guides are for installation and verification only. -- Learning Paths can link to install guides for setup. Do not duplicate install-guide content inside Learning Paths. - -## Reference examples - -Use `content/learning-paths/cross-platform/_example-learning-path` when creating or checking Learning Path structure. diff --git a/.github/skills/arm-content-editor/references/writing-style.md b/.github/skills/arm-content-editor/references/writing-style.md deleted file mode 100644 index 839c1130d2..0000000000 --- a/.github/skills/arm-content-editor/references/writing-style.md +++ /dev/null @@ -1,150 +0,0 @@ -# Writing style - -## Voice and tone - -- Use second person: `you` and `your`. -- Avoid first person: `I` and `we`. -- Use active voice. -- Use present tense for descriptions. -- Use imperative mood for commands. -- Keep the tone confident, developer-friendly, and natural. -- Use encouraging language for complex tasks without sounding generic or inflated. - -## Inclusive language - -- Use `primary/subordinate` instead of `master/slave`. -- Do not use gendered examples or assumptions. -- Be mindful of cultural references that might not translate globally. -- Focus on clear, accessible language for all developers. - -## Sentence structure and clarity - -- Aim for an average of 15 to 20 words per sentence. -- Split complex sentences for clarity. -- Use plain English and avoid jargon overload. -- Use US spellings such as `organize`, `optimize`, and `realize`. -- Use `Arm` capitalization in prose, such as `Arm processors`, `Arm servers`, and `Neoverse`. -- Define acronyms on first use. -- Use parallel structure in lists. - -## Readability and section flow - -- Flag any section over 700 words and suggest natural split points. -- Identify paragraphs with sentences averaging over 20 words. -- Note sections introducing more than two new concepts. -- Flag pages over 3500 words total. -- Note sections that might benefit from encouragement or progress markers. -- Identify missing celebration of progress or milestones. -- Recap what learners have accomplished at section ends. -- Provide check-your-understanding moments that are not intimidating. -- Use visual breaks to prevent walls of text. -- If you explain three or more things in one section, split it into separate sections. - -## Word choice - -Use these preferred terms and phrases for consistency: - -- Spell out numbers one through five. After that, use numerals. -- Use proper spacing for units: `1 GB`, `23 MB/day`. -- Use `K` for thousands: `64K`. -- Use abbreviations for data rates: `Gbps`. -- Use `To [action]` instead of `Follow the steps below to [action]`. -- Use `for example` instead of `e.g.`. -- Use `that is` instead of `i.e.`. -- Use `because` instead of `since`. -- Use `also` instead of `in addition`. -- Use `to` instead of `in order to`. -- Use `see` instead of `refer to`. -- Use `use` instead of `utilize` or `leverage`. -- Use `need` instead of `require`. -- Use `can` or `might` instead of `may`. -- Use `set up` as a verb and `setup` as a noun. -- Use `therefore` instead of `ergo`. -- Use `namely` instead of `viz.`. -- Use `avoid` instead of `try not to`. -- Use `such as` instead of `like`. -- Use `after` instead of `once`. - -## Tone cleanup - -- Do not use `simply`, `just`, `obviously`, or `clearly`. -- Do not use `above`, `below`, `left`, `right`, `top`, or `bottom` when referring to content. -- Acknowledge difficulty naturally with phrases such as `this step can be confusing at first`. -- Normalize errors with phrases such as `if you see this error, here's how to fix it`. -- Use contractions such as `don't`, `isn't`, `it's`, `that's`, `you're`, and `you'll`. -- Remove unnecessary qualifiers such as `quite`, `very`, or `massive`. -- Use `an LLM`, not `a LLM`. -- Use `easy-to-use` as an adjective. -- Use `fixed-width`, not `fixed-length`. -- Use `read-to-write ratio`, not `read to write ratio`. - -## User interface terms - -- Use `select` or `tap` instead of `click` for touch interfaces. -- Use `keyboard shortcut` instead of `key combination`. -- Use `Ctrl key`. -- Use `double-tap` instead of `double-click` for touch interfaces. - -## Headings and formatting - -- Use sentence case for all headings and subheadings. -- Capitalize only the first word and proper nouns in headings. -- Keep heading wording consistent across related files in the same Learning Path. -- Prefer headings that clearly signal the user task or concept in that section. -- Check heading hierarchy across all files before finalizing content. -- Ensure headings follow a logical structure with no skipped levels unless the template requires it. -- Each Markdown file should begin with a section heading in the body content. -- Do not leave a file starting with body text, an image, or a code block without a heading. - -Heading examples: - -- `## Set up the environment` -- `## Run the benchmark` -- `### Check the output` -- `## What you've accomplished and what's next` - -Avoid: - -- `## Set Up The Environment` -- `## RUN THE BENCHMARK` -- Starting a file with plain paragraph text and no heading - -## Arm naming and architecture terms - -- Use `Arm` for the brand in prose. -- Use `arm64` or `aarch64` for the CPU architecture. Prefer whichever term a tool, package, or operating system uses natively. -- Always use `Arm` rather than `ARM` in prose unless a technical term requires the original casing. -- `ARM64` is acceptable when specifically referring to Windows on Arm or Microsoft documentation. -- The term `Learning Path` should always be capitalized. - -## Non-Arm naming terms - -- `Azure Cobalt` is the processor, not the VM. -- `Google Axion` is the processor, not the VM. -- `AWS Graviton` is the processor, not the VM. - -## Product name emphasis - -- Product names and technologies such as LiteRT, XNNPACK, KleidiAI, and SME2 should appear in regular text. -- Avoid italics or bold for product and technology names unless they are part of a heading or UI label. - -## Hyperlinks - -- Use the full path format for internal links: `/learning-paths/category/path-name/`. -- Do not use relative paths such as `../path-name/`. -- Use the full URL for external links that are not on `learn.arm.com`. -- Include only necessary links in content. - -## Avoid looking AI-generated - -- Avoid more than three consecutive sections using bullet lists. -- Avoid bullet points that could be combined into narrative paragraphs. -- Make list items parallel. -- Use flowing narrative instead of excessive bullets. -- Vary sentence length. -- Use transitional phrases. -- Include contextual explanations and relevant examples. -- Connect ideas logically. -- Avoid robotic encouragement such as `Great job - let's get started!` or `Great job - your environment is ready!`. -- Use calm, natural transitions that focus on what happens next. -- Avoid multiple consecutive sentences starting with `This`. diff --git a/.github/skills/frontmatter-audit/SKILL.md b/.github/skills/frontmatter-audit/SKILL.md new file mode 100644 index 0000000000..b765880b47 --- /dev/null +++ b/.github/skills/frontmatter-audit/SKILL.md @@ -0,0 +1,70 @@ +--- +name: frontmatter-audit +description: Audit YAML front matter and metadata for Arm Learning Paths and install guides. Use when checking required fields, fixed layout fields, duplicate weights, draft visibility metadata, closed-list metadata values, description presence or quality, YAML validity, and front matter consistency. +--- + +# Front matter audit + +Use this skill to audit front matter and metadata without rewriting body content. It can report issues or make metadata-only edits when requested. + +For description rewriting, use `.github/skills/metadata-description-update/SKILL.md`. For draft intake metadata, use `.github/skills/intake-metadata-update/SKILL.md`. + +## Workflow + +1. Identify whether the target is a Learning Path, single-page install guide, multi-page install guide, or mixed content directory. +2. Read the front matter and enough body context to understand the page task, platform, and outcome. +3. Check YAML validity and preserve front matter order when editing. +4. Check required and fixed fields for the content type. +5. Check metadata consistency across files in a content unit, including duplicate or missing `weight` values. +6. Check whether `description` is present and fit for purpose. If it is missing or weak, either report it or use `.github/skills/metadata-description-update/SKILL.md` when the user asked for edits. +7. After completing all checks, report findings by severity with file and line references when available. + +## Learning Path checks + +For a Learning Path directory: + +- `_index.md` should use `weight: 1`. +- Public pages should have unique `weight` values within the directory. +- `_index.md` must include `description`. +- Required `_index.md` fields include `title`, `description`, `weight`, `layout`, `minutes_to_complete`, `prerequisites`, `author`, `subjects`, `armips`, `tools_software_languages`, `skilllevels`, and `operatingsystems`. +- `layout` is usually `learningpathall`. +- `title` should be task-led and use an imperative structure: verb + technology/tool + outcome. +- `skilllevels` values are only `Introductory` or `Advanced`. +- `subjects` and `operatingsystems` must match the closed lists in `content/learning-paths/cross-platform/_example-learning-path/write-2-metadata/`. +- `armips` should use Arm IP families such as Neoverse, Cortex-A, or Cortex-M, not specific CPU models or Arm architecture versions. +- `author` can list multiple authors with YAML list syntax. +- Skip `_next-steps.md` for description updates unless the user explicitly asks how to handle it. + +## Install guide checks + +For an install guide: + +- Required fields include `title`, `minutes_to_complete`, `official_docs`, `author`, `weight`, and `layout`. +- Fixed fields should usually be `weight: 1`, `tool_install: true`, and `layout: installtoolsall`. +- Set `tool_install: false` only when the guide is intentionally hidden. +- Set `multi_install` and `multitool_install_part` based on whether the guide is multi-page. +- If `multi_install` is true, the first page should act as the series overview. +- Sub-pages in a multi-page guide should set `multitool_install_part: true`. +- Install guide descriptions should describe the tool, supported Arm platform or operating system context, and what the setup enables. + +## Description quality checks + +- The description should be one sentence. +- It should state what the reader will do, the main tool or platform, and the useful outcome. +- It should be concise, developer-focused, and suitable as a search snippet. +- It should not repeat the title verbatim. +- It should not use vague summaries, hype, keyword stuffing, unsupported claims, or invented capabilities. +- Quote the value only when needed for YAML syntax. + +## Validation rules + +- Preserve body content, Hugo shortcodes, links, commands, code blocks, and expected output unless the user explicitly asks for broader edits. +- Do not invent metadata values. Use nearby content, repository examples, or the closed-list metadata reference. +- If a closed-list value cannot be verified, state the limitation instead of guessing. +- For broad audits, report before editing unless the user explicitly requested changes. + +## Response format + +For audits, lead with metadata findings ordered by severity and include file and line references. Then add skipped files, assumptions, and a short summary. + +For edits, summarize changed fields and note any metadata checks performed. diff --git a/.github/skills/install-guide-structure-review/SKILL.md b/.github/skills/install-guide-structure-review/SKILL.md new file mode 100644 index 0000000000..ea08c14b70 --- /dev/null +++ b/.github/skills/install-guide-structure-review/SKILL.md @@ -0,0 +1,56 @@ +--- +name: install-guide-structure-review +description: Review Arm install guides for structural soundness, installation-only scope, verification quality, OS-specific sections, troubleshooting, multi-page guide behavior, and version-note placement. Use when asked to review, create, reorganize, or assess content under content/install-guides. +--- + +# Install guide structure review + +Use this skill when an install guide needs a structural review. Focus on whether the guide installs and verifies one tool on Arm platforms without drifting into applied workflows. + +For metadata-only checks, use `.github/skills/frontmatter-audit/SKILL.md`. For command and output accuracy, use `.github/skills/code-sample-review/SKILL.md`. + +## Workflow + +1. Identify whether the target is a single-page guide, multi-page guide, or install guide directory. +2. State the installation target and supported Arm platform context in one sentence. +3. Check the required guide shape: + - Overview: explains what the tool is and which Arm platforms are supported, such as `aarch64`, Windows on Arm, or macOS on Arm. + - Install steps: grouped logically, with clear OS-specific sections when necessary. + - Verification: includes at least one or two commands and expected output. + - Troubleshooting: covers common failure cases and fixes when appropriate. + - Optional uninstall steps stay secondary. +4. Check version handling: + - Download and install examples use a specific version when practical. + - A note before versioned commands tells readers they can use other versions. + - The note links to a release or download page where readers can find the latest version. +5. Check scope boundaries: + - No end-to-end workflows. + - No performance benchmarking. + - No deep architectural explanation. + - No comparative marketing claims. + - No duplicated Learning Path workflow content. +6. For multi-page guides, check that the first page acts as the overview and sub-pages behave as install parts. +7. Report findings by learner impact, with file and line references when available. Do not comment on content that is already structurally sound. + +## Version note pattern + +Use this pattern before commands that pin a downloadable tool version: + +```md +{{% notice Note %}} +The following commands use version . The same commands work with other versions. Replace the file used in these steps with the file for your version of choice. To find the latest version, see [Link to page with release info](URL). +{{% /notice %}} +``` + +## Validation rules + +- Preserve front matter, Hugo shortcodes, code fences, command syntax, expected output, links, and the author's technical intent when editing. +- Use `.github/skills/frontmatter-audit/SKILL.md` for required front matter, fixed fields, and metadata validity. +- Use `.github/skills/code-sample-review/SKILL.md` when commands, outputs, language tags, or technical accuracy need a deeper pass. +- Verify internal links before changing them, or state when verification was not possible. + +## Response format + +For reviews, lead with findings ordered by severity and include file and line references. Then add open questions or assumptions, followed by a short summary. + +For edits, summarize the structural changes and note any checks performed. diff --git a/.github/skills/learning-path-structure-review/SKILL.md b/.github/skills/learning-path-structure-review/SKILL.md new file mode 100644 index 0000000000..c38dadc411 --- /dev/null +++ b/.github/skills/learning-path-structure-review/SKILL.md @@ -0,0 +1,67 @@ +--- +name: learning-path-structure-review +description: Review Arm Learning Paths for structural soundness, task ownership, scope discipline, progression, validation, further reading placement, recap sections, and performance-learning integrity. Use when asked to review, create, reorganize, or assess the structure of content under content/learning-paths. +--- + +# Learning Path structure review + +Use this skill when a Learning Path needs a structural review. Focus on whether the content is organized to help a developer complete one clear task from preparation through validation. + +For metadata-only checks, use `.github/skills/frontmatter-audit/SKILL.md`. For prose style, use `.github/skills/writing-style-review/SKILL.md`. + +## Workflow + +1. Identify the Learning Path directory and read the relevant Markdown files together. +2. State the owned developer task in one sentence. If the task is unclear, too broad, or split across unrelated goals, flag it. +3. Check the required file shape: + - The Learning Path has an `_index.md` file. + - The Learning Path has an `_next-steps.md` file. + - Additional resources and next steps live in `_index.md` `further_reading`, not in `_next-steps.md`. + - `_next-steps.md` remains minimal and respects `FIXED, DO NOT MODIFY` template comments. +4. Review the instructional shape: + - The title and opening frame one developer task. + - The introduction gives context, user goal, and practical value. + - Prerequisites are explicit and linked when useful. + - Learning objectives are measurable, action-oriented, and limited to three or four bullets. + - Sections progress logically through prepare, configure, use, and validate phases. + - Validation steps prove the learner reached the promised outcome. + - The conclusion or next-step guidance names what the learner can do next. +5. Review `further_reading`: + - Keep four to six essential resources. + - Prefer direct relevance, Arm Learning Paths, required tools, foundation knowledge, and logical next steps. + - Avoid link piles that pull readers away from the task. +6. Review recap and transition sections: + - Include concise recap and forward-looking transition at major instructional boundaries. + - Use `what you've learned` for conceptual sections and `what you've accomplished` for task sections. + - Avoid repeating earlier content verbatim. +7. If the Learning Path demonstrates Arm-specific performance features, apply the performance integrity checks. +8. Report findings by learner impact, with file and line references when available. Do not comment on content that is already structurally sound. + +## Scope rules + +- Learning Paths are not blog posts, reference articles, or install guides. +- A Learning Path should own one concrete developer task. +- Link to install guides for setup instead of duplicating install guide content. +- Preserve Hugo shortcodes, code fences, commands, links, front matter, and the author's technical intent when editing. +- Use repository search when structure, terminology, links, or task flow depends on related files. + +## Performance integrity checks + +For Learning Paths that demonstrate Arm-specific performance features, such as SME2, SVE2, I8MM, DotProd, or optimized microkernels: + +- State the measurable improvement the learner will observe before deep architectural explanation. +- Show performance results before internal call stacks or microkernel details. +- Include toolchain or software version, device or platform, thread count, CPU affinity, runtime feature flags, and workload configuration when performance numbers are included. +- Label illustrative numbers clearly. +- Distinguish compile-time feature enablement, runtime feature activation, and automatic fallback behavior. +- Include a way to verify the accelerated path executed, such as logs, profiling output, kernel names, or hardware counters. +- Change only one meaningful benchmark variable at a time. +- Control thread count and CPU binding intentionally. +- Quantify percentage improvement explicitly. +- Connect observed improvement to the Arm architectural feature responsible for it. + +## Response format + +For reviews, lead with findings ordered by severity and include file and line references. Then add open questions or assumptions, followed by a short summary. + +For edits, summarize the structural changes and note any checks performed. diff --git a/.github/skills/link-text-review/SKILL.md b/.github/skills/link-text-review/SKILL.md index b4b0c699c3..8b11bc495f 100644 --- a/.github/skills/link-text-review/SKILL.md +++ b/.github/skills/link-text-review/SKILL.md @@ -13,8 +13,8 @@ This skill focuses on anchor text and link clarity. For tables, notices, tab pan - Work from the repository root. - Read `AGENTS.md` only if you need repository routing context. -- Read `.github/skills/arm-content-editor/references/writing-style.md` only when changing prose around links. -- For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md` when link placement or `further_reading` is involved. +- Read `.github/skills/writing-style-review/SKILL.md` only when changing prose around links. +- For Learning Paths, read `.github/skills/learning-path-structure-review/SKILL.md` when link placement or `further_reading` is involved. ## Workflow @@ -30,7 +30,7 @@ This skill focuses on anchor text and link clarity. For tables, notices, tab pan - Prefer destination-specific anchors such as `Docker install guide`, `Arm Developer resources`, or `Google Cloud firewall rules`. - Avoid anchors that only describe the mechanic, such as `here`, `click here`, `this page`, `read more`, `link`, or `website`, as well as bare URLs or repeated generic text. - Avoid overlong anchors that wrap a whole sentence. -- Follow `.github/skills/arm-content-editor/references/writing-style.md` for URL path format. +- Follow `.github/skills/writing-style-review/SKILL.md` for URL path format and surrounding prose style. - Don't change product names, tool names, URLs, or technical meaning to satisfy prose preferences. - Don't add speculative links. Verify internal targets or state when verification was not possible. Preserve the URL unless it's broken or the user asks for a change. diff --git a/.github/skills/metadata-description-update/SKILL.md b/.github/skills/metadata-description-update/SKILL.md index 37e14af97b..6f345070fd 100644 --- a/.github/skills/metadata-description-update/SKILL.md +++ b/.github/skills/metadata-description-update/SKILL.md @@ -13,9 +13,9 @@ This skill is for search and discovery metadata. For draft visibility metadata, - Work from the repository root. - Read `AGENTS.md` to locate shared guidance. -- Read `.github/skills/arm-content-editor/references/content-quality.md` for general project content quality guidance. -- For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md`. -- For install guides, read `.github/skills/arm-content-editor/references/install-guide-guidance.md`. +- For Learning Paths, read `.github/skills/learning-path-structure-review/SKILL.md` if the page task or outcome is unclear. +- For install guides, read `.github/skills/install-guide-structure-review/SKILL.md` if the tool, platform, or verification outcome is unclear. +- Use `.github/skills/frontmatter-audit/SKILL.md` when the request is broader than description edits. ## Scope rules diff --git a/.github/skills/seo-geo-aeo-review/SKILL.md b/.github/skills/seo-geo-aeo-review/SKILL.md index 05f2385597..4e2f883c19 100644 --- a/.github/skills/seo-geo-aeo-review/SKILL.md +++ b/.github/skills/seo-geo-aeo-review/SKILL.md @@ -18,10 +18,7 @@ For focused front matter `description` edits only, use `.github/skills/metadata- ## Prerequisites - Work from the repository root. -- Read `AGENTS.md` to locate the narrowest applicable guidance. -- For Learning Paths, read `.github/skills/arm-content-editor/references/learning-path-guidance.md`. -- For install guides, read `.github/skills/arm-content-editor/references/install-guide-guidance.md`. -- Read `.github/skills/arm-content-editor/references/content-quality.md` only when broader clarity, accessibility, or Arm framing is in scope. +- Read `AGENTS.md` only if you need repository routing context. - For additional Learning Paths discovery guidance, review `.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md`. ## Workflow diff --git a/.github/skills/stale-content-review/SKILL.md b/.github/skills/stale-content-review/SKILL.md index ec22056506..e358cffc37 100644 --- a/.github/skills/stale-content-review/SKILL.md +++ b/.github/skills/stale-content-review/SKILL.md @@ -29,10 +29,11 @@ Use this skill to find Learning Paths and install guides that might need human m - Be explicit when a flag is uncertain or only a heuristic signal. - Keep periodic scan output lightweight enough for a reviewer to act on. - Prefer questions and maintenance prompts over direct edits. -- Use related skills for focused follow-up: +- Propose using related skills for focused follow-up: - `audit-images` for screenshot, image, alt text, and caption review. - `code-sample-review` for commands, package installs, outputs, and code fence integrity. - - `arm-content-editor` for Arm terminology, product naming, and broader content judgment. + - `writing-style-review` for Arm terminology, product naming, and prose quality. + - `learning-path-structure-review` or `install-guide-structure-review` for broader content judgment. - `link-text-review` for stale or vague external links that also need accessible anchor text. ## Script usage diff --git a/.github/skills/writing-style-review/SKILL.md b/.github/skills/writing-style-review/SKILL.md new file mode 100644 index 0000000000..645c0ee841 --- /dev/null +++ b/.github/skills/writing-style-review/SKILL.md @@ -0,0 +1,135 @@ +--- +name: writing-style-review +description: Review and improve writing style, voice, tone, readability, inclusive language, Arm terminology, heading style, word choice, and AI-sounding prose in Arm Learning Paths and install guides. Use when asked to polish prose, make content less AI-generated, improve clarity, or align with Arm editorial style. +--- + +# Writing style review + +Use this skill for granular prose, voice, readability, terminology, and style reviews. Keep edits focused and preserve technical meaning. + +For structural readiness, use `.github/skills/learning-path-structure-review/SKILL.md` or `.github/skills/install-guide-structure-review/SKILL.md`. For metadata-only checks, use `.github/skills/frontmatter-audit/SKILL.md`. + +## Workflow + +1. Identify the target file, section, or selected text. +2. Read surrounding context so style edits preserve the author's intent and the technical flow. +3. Review only the style dimensions that match the request against the guidelines defined in this skill. +4. Depending on request type, do the following: + - For review requests, report high-impact style issues by file and line when possible. + - For edit requests, make focused rewrites, then re-open changed sections to check Markdown, shortcodes, links, and code fences. + +## Voice and tone + +- Use second person: `you` and `your`. +- Avoid first person: `I` and `we`. +- Use active voice. +- Use present tense for descriptions. +- Use imperative mood for commands. +- Keep the tone confident, developer-friendly, and natural. +- Encourage readers through complex tasks without generic praise or hype. + +## Inclusive language + +- Use `primary/subordinate` instead of `master/slave`. +- Do not use gendered examples or assumptions. +- Be mindful of cultural references that might not translate globally. +- Avoid assumptions about a reader's physical capabilities or setup. + +## Sentence structure and readability + +- Aim for an average of 15 to 20 words per sentence. +- Split complex sentences for clarity. +- Use plain English and avoid jargon overload. +- Define acronyms on first use. +- Use parallel structure in lists. +- Flag sections over 700 words and suggest natural split points. +- Identify paragraphs with sentences averaging over 20 words. +- Note sections that introduce more than two new concepts. +- Flag pages over 3500 words total when prose density hurts review or learning. +- Use visual breaks to prevent walls of text. Code blocks count as visual breaks. +- If a section explains three or more things, suggest splitting it. + +## Arm framing and technical depth + +- Default to Arm-native solutions, Arm terminology, and Arm platform assumptions. +- Flag x86 assumptions and suggest Arm alternatives when available. +- Match technical depth to the stated audience, prerequisites, and skill level. +- Keep the level of formality and technical detail consistent across related sections. +- Avoid generic advice that could apply to any architecture when the page needs Arm-specific guidance. +- Keep content accessible for screen readers with clear wording and descriptive references. + +## Word choice + +- Spell out numbers one through five. After that, use numerals. +- Use proper spacing for units: `1 GB`, `23 MB/day`. +- Use `K` for thousands and data-rate abbreviations such as `Gbps`. +- Use `To [action]` instead of `Follow the steps below to [action]`. +- Use `for example` instead of `e.g.`. +- Use `that is` instead of `i.e.`. +- Use `because` instead of `since`. +- Use `also` instead of `in addition`. +- Use `to` instead of `in order to`. +- Use `see` instead of `refer to`. +- Use `use` instead of `utilize` or `leverage`. +- Use `need` instead of `require`. +- Use `can` or `might` instead of `may`. +- Use `set up` as a verb and `setup` as a noun. +- Use `avoid` instead of `try not to`. +- Use `such as` instead of `like`. +- Use `after` instead of `once`. + +## Tone cleanup + +- Avoid `simply`, `just`, `obviously`, and `clearly`. +- Avoid `above`, `below`, `left`, `right`, `top`, and `bottom` when referring to content. +- Acknowledge difficulty naturally, such as `this step can be confusing at first`. +- Normalize errors, such as `if you see this error, here's how to fix it`. +- Use contractions such as `don't`, `isn't`, `it's`, `that's`, `you're`, and `you'll`. +- Remove unnecessary qualifiers such as `quite`, `very`, and `massive`. +- Use `an LLM`, not `a LLM`. +- Use `easy-to-use` as an adjective. +- Use `fixed-width`, not `fixed-length`. +- Use `read-to-write ratio`, not `read to write ratio`. + +## UI and formatting terms + +- Use `select` or `tap` instead of `click` for touch interfaces. +- Use `keyboard shortcut` instead of `key combination`. +- Use `Ctrl key`. +- Use `double-tap` instead of `double-click` for touch interfaces. +- Use **bold** for UI elements. +- Use *italics* for emphasis and new terms. +- Use `code formatting` for file names, commands, package names, flags, paths, and environment variables. + +## Headings and terminology + +- Use sentence case for headings and subheadings. +- Capitalize only the first word and proper nouns in headings. +- Keep heading wording consistent across related files. +- Prefer headings that signal the user task or concept. +- Ensure heading hierarchy has no skipped levels unless the template requires it. +- Each Markdown file should begin with a section heading in body content. +- Use `Arm` for the brand in prose. +- Use `arm64` or `aarch64` for CPU architecture based on tool, package, or OS convention. +- Use `ARM64` only when referring to Windows on Arm or Microsoft documentation. +- Capitalize `Learning Path`. +- Use `Azure Cobalt`, `Google Axion`, and `AWS Graviton` as processor names, not VM names. +- Do not use bold or italics for product names such as LiteRT, XNNPACK, KleidiAI, and SME2 unless they are headings or UI labels. + +## Avoid AI-sounding prose + +- Avoid more than three consecutive sections using bullet lists. +- Avoid bullets that would read more naturally as narrative paragraphs. +- Make list items parallel. +- Use flowing narrative where it improves readability. +- Vary sentence length. +- Use transitional phrases and relevant examples. +- Connect ideas logically. +- Avoid robotic encouragement such as `Great job - let's get started!`. +- Avoid multiple consecutive sentences starting with `This`. + +## Response format + +For reviews, lead with findings ordered by severity and include file and line references. Then add open questions or assumptions, followed by a short summary. + +For edits, summarize the style changes and note any checks performed. diff --git a/AGENTS.md b/AGENTS.md index 753c01fc51..7fa3e52c87 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -13,10 +13,10 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent ## Source of truth - Repository router: `AGENTS.md` -- General Arm content editing: `.github/skills/arm-content-editor/SKILL.md` -- Learning Paths-specific guidance: `.github/skills/arm-content-editor/references/learning-path-guidance.md` -- Install guides-specific guidance: `.github/skills/arm-content-editor/references/install-guide-guidance.md` -- Shared content quality: `.github/skills/arm-content-editor/references/content-quality.md` +- Learning Path structure review: `.github/skills/learning-path-structure-review/SKILL.md` +- Install guide structure review: `.github/skills/install-guide-structure-review/SKILL.md` +- Writing style and voice review: `.github/skills/writing-style-review/SKILL.md` +- Front matter and metadata audits: `.github/skills/frontmatter-audit/SKILL.md` - Metadata descriptions: `.github/skills/metadata-description-update/SKILL.md` - SEO, GEO, AEO, and AI-agent discoverability: `.github/skills/seo-geo-aeo-review/SKILL.md` - Markdown components: `.github/skills/markdown-component-edit/SKILL.md` @@ -38,7 +38,10 @@ Use skills for repeatable workflows such as image audits, metadata description u Current shared skills: -- `.github/skills/arm-content-editor/SKILL.md` for reviewing and editing Arm Learning Paths and install guides. +- `.github/skills/learning-path-structure-review/SKILL.md` for reviewing Learning Path task ownership, structure, scope, validation, further reading, recap sections, and performance-learning integrity. +- `.github/skills/install-guide-structure-review/SKILL.md` for reviewing install guide structure, install-only scope, version notes, verification, troubleshooting, and multi-page guide behavior. +- `.github/skills/writing-style-review/SKILL.md` for reviewing prose style, voice, tone, readability, inclusive language, Arm terminology, headings, and AI-sounding text. +- `.github/skills/frontmatter-audit/SKILL.md` for auditing YAML front matter, required fields, fixed fields, duplicate weights, closed-list metadata, draft metadata, and description quality. - `.github/skills/metadata-description-update/SKILL.md` for adding or improving front matter `description` fields for Learning Paths and install guides. - `.github/skills/seo-geo-aeo-review/SKILL.md` for reviewing and improving search intent, AI-agent selection signals, answer-engine readiness, titles, headings, and broader discoverability. - `.github/skills/markdown-component-edit/SKILL.md` for adding or updating links, tables, notices, tab panes, code panes, and other structured Markdown components. From 5c75e7fd22169e3aa52edfa182c01dbe4d6e1c3b Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 17 Jun 2026 10:37:15 -0500 Subject: [PATCH 064/137] updates --- .github/skills/audit-images/SKILL.md | 1 - .github/skills/install-guide-structure-review/SKILL.md | 2 -- .github/skills/learning-path-structure-review/SKILL.md | 2 -- .github/skills/link-text-review/SKILL.md | 3 ++- .github/skills/metadata-description-update/SKILL.md | 8 ++++---- .github/skills/seo-geo-aeo-review/SKILL.md | 2 +- 6 files changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/skills/audit-images/SKILL.md b/.github/skills/audit-images/SKILL.md index 06092c09cc..0e0fcf7c77 100644 --- a/.github/skills/audit-images/SKILL.md +++ b/.github/skills/audit-images/SKILL.md @@ -16,7 +16,6 @@ Use the script for repeatable inventory and counting. Use assistant judgment for - Work from the repository root. - Read `AGENTS.md` to locate shared guidance. - Read `references/image-guidance.md` before editing image alt text, captions, or image syntax. -- When auditing a Learning Path or install guide, also read the matching scoped content guidance. ## Trigger diff --git a/.github/skills/install-guide-structure-review/SKILL.md b/.github/skills/install-guide-structure-review/SKILL.md index ea08c14b70..722b0a1dd6 100644 --- a/.github/skills/install-guide-structure-review/SKILL.md +++ b/.github/skills/install-guide-structure-review/SKILL.md @@ -7,8 +7,6 @@ description: Review Arm install guides for structural soundness, installation-on Use this skill when an install guide needs a structural review. Focus on whether the guide installs and verifies one tool on Arm platforms without drifting into applied workflows. -For metadata-only checks, use `.github/skills/frontmatter-audit/SKILL.md`. For command and output accuracy, use `.github/skills/code-sample-review/SKILL.md`. - ## Workflow 1. Identify whether the target is a single-page guide, multi-page guide, or install guide directory. diff --git a/.github/skills/learning-path-structure-review/SKILL.md b/.github/skills/learning-path-structure-review/SKILL.md index c38dadc411..a152c79db0 100644 --- a/.github/skills/learning-path-structure-review/SKILL.md +++ b/.github/skills/learning-path-structure-review/SKILL.md @@ -7,8 +7,6 @@ description: Review Arm Learning Paths for structural soundness, task ownership, Use this skill when a Learning Path needs a structural review. Focus on whether the content is organized to help a developer complete one clear task from preparation through validation. -For metadata-only checks, use `.github/skills/frontmatter-audit/SKILL.md`. For prose style, use `.github/skills/writing-style-review/SKILL.md`. - ## Workflow 1. Identify the Learning Path directory and read the relevant Markdown files together. diff --git a/.github/skills/link-text-review/SKILL.md b/.github/skills/link-text-review/SKILL.md index 8b11bc495f..4ad35b179c 100644 --- a/.github/skills/link-text-review/SKILL.md +++ b/.github/skills/link-text-review/SKILL.md @@ -30,12 +30,13 @@ This skill focuses on anchor text and link clarity. For tables, notices, tab pan - Prefer destination-specific anchors such as `Docker install guide`, `Arm Developer resources`, or `Google Cloud firewall rules`. - Avoid anchors that only describe the mechanic, such as `here`, `click here`, `this page`, `read more`, `link`, or `website`, as well as bare URLs or repeated generic text. - Avoid overlong anchors that wrap a whole sentence. -- Follow `.github/skills/writing-style-review/SKILL.md` for URL path format and surrounding prose style. - Don't change product names, tool names, URLs, or technical meaning to satisfy prose preferences. - Don't add speculative links. Verify internal targets or state when verification was not possible. Preserve the URL unless it's broken or the user asks for a change. ## Examples +Use these examples for both link format and link text guidance. + Poor: ```md diff --git a/.github/skills/metadata-description-update/SKILL.md b/.github/skills/metadata-description-update/SKILL.md index 6f345070fd..35b21c5a02 100644 --- a/.github/skills/metadata-description-update/SKILL.md +++ b/.github/skills/metadata-description-update/SKILL.md @@ -12,10 +12,10 @@ This skill is for search and discovery metadata. For draft visibility metadata, ## Prerequisites - Work from the repository root. -- Read `AGENTS.md` to locate shared guidance. -- For Learning Paths, read `.github/skills/learning-path-structure-review/SKILL.md` if the page task or outcome is unclear. -- For install guides, read `.github/skills/install-guide-structure-review/SKILL.md` if the tool, platform, or verification outcome is unclear. -- Use `.github/skills/frontmatter-audit/SKILL.md` when the request is broader than description edits. +- Read `AGENTS.md` only if you need to locate shared guidance. +- For Learning Paths, read `.github/skills/learning-path-structure-review/SKILL.md` only if the page task or outcome is unclear. +- For install guides, read `.github/skills/install-guide-structure-review/SKILL.md` only if the tool, platform, or verification outcome is unclear. +- Use `.github/skills/frontmatter-audit/SKILL.md` only when the request is broader than description edits. ## Scope rules diff --git a/.github/skills/seo-geo-aeo-review/SKILL.md b/.github/skills/seo-geo-aeo-review/SKILL.md index 4e2f883c19..52e0ee1a8a 100644 --- a/.github/skills/seo-geo-aeo-review/SKILL.md +++ b/.github/skills/seo-geo-aeo-review/SKILL.md @@ -19,7 +19,7 @@ For focused front matter `description` edits only, use `.github/skills/metadata- - Work from the repository root. - Read `AGENTS.md` only if you need repository routing context. -- For additional Learning Paths discovery guidance, review `.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md`. +- Review `.github/skills/seo-geo-aeo-review/references/learning-paths-discoverability.md` only if you're reviewing a Learning Path. ## Workflow From 778fa58c24b15a37dfcf8f76ed7e37453b3931bb Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 17 Jun 2026 11:07:30 -0500 Subject: [PATCH 065/137] post-testing alterations --- .github/skills/frontmatter-audit/SKILL.md | 3 +-- .github/skills/seo-geo-aeo-review/SKILL.md | 2 +- .github/skills/writing-style-review/SKILL.md | 4 +--- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/skills/frontmatter-audit/SKILL.md b/.github/skills/frontmatter-audit/SKILL.md index b765880b47..b62b68678d 100644 --- a/.github/skills/frontmatter-audit/SKILL.md +++ b/.github/skills/frontmatter-audit/SKILL.md @@ -7,8 +7,6 @@ description: Audit YAML front matter and metadata for Arm Learning Paths and ins Use this skill to audit front matter and metadata without rewriting body content. It can report issues or make metadata-only edits when requested. -For description rewriting, use `.github/skills/metadata-description-update/SKILL.md`. For draft intake metadata, use `.github/skills/intake-metadata-update/SKILL.md`. - ## Workflow 1. Identify whether the target is a Learning Path, single-page install guide, multi-page install guide, or mixed content directory. @@ -25,6 +23,7 @@ For a Learning Path directory: - `_index.md` should use `weight: 1`. - Public pages should have unique `weight` values within the directory. +- Every page except for `_next-steps.md` must include a description. - `_index.md` must include `description`. - Required `_index.md` fields include `title`, `description`, `weight`, `layout`, `minutes_to_complete`, `prerequisites`, `author`, `subjects`, `armips`, `tools_software_languages`, `skilllevels`, and `operatingsystems`. - `layout` is usually `learningpathall`. diff --git a/.github/skills/seo-geo-aeo-review/SKILL.md b/.github/skills/seo-geo-aeo-review/SKILL.md index 52e0ee1a8a..32bc9ec909 100644 --- a/.github/skills/seo-geo-aeo-review/SKILL.md +++ b/.github/skills/seo-geo-aeo-review/SKILL.md @@ -48,7 +48,7 @@ For focused front matter `description` edits only, use `.github/skills/metadata- ## Review rules - Optimize for selection and usefulness, not ranking alone. -- Prefer verb-led titles such as `Install`, `Deploy`, `Configure`, `Analyze`, `Optimize`, or `Verify`. +- For Learning Paths, prefer verb-led titles such as `Install`, `Deploy`, `Configure`, `Analyze`, `Optimize`, or `Verify`. Install guides are named after the tool being installed and don't feature a verb because install is implied. - Preserve content-type boundaries: install guides cover installation and verification; Learning Paths cover applied end-to-end tasks. - Use Arm-specific terminology naturally when it is supported by the content. - Don't add speculative keywords, unsupported performance claims, or marketing language. diff --git a/.github/skills/writing-style-review/SKILL.md b/.github/skills/writing-style-review/SKILL.md index 645c0ee841..a980254b01 100644 --- a/.github/skills/writing-style-review/SKILL.md +++ b/.github/skills/writing-style-review/SKILL.md @@ -7,13 +7,11 @@ description: Review and improve writing style, voice, tone, readability, inclusi Use this skill for granular prose, voice, readability, terminology, and style reviews. Keep edits focused and preserve technical meaning. -For structural readiness, use `.github/skills/learning-path-structure-review/SKILL.md` or `.github/skills/install-guide-structure-review/SKILL.md`. For metadata-only checks, use `.github/skills/frontmatter-audit/SKILL.md`. - ## Workflow 1. Identify the target file, section, or selected text. 2. Read surrounding context so style edits preserve the author's intent and the technical flow. -3. Review only the style dimensions that match the request against the guidelines defined in this skill. +3. Review the target against the guidelines defined in this skill. 4. Depending on request type, do the following: - For review requests, report high-impact style issues by file and line when possible. - For edit requests, make focused rewrites, then re-open changed sections to check Markdown, shortcodes, links, and code fences. From 9682fee061ed2202da92f356fd165383eb08dc37 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 17 Jun 2026 12:01:25 -0500 Subject: [PATCH 066/137] removing .instructions files that shouldn't be needed anymore --- .github/instructions/content-quality.instructions.md | 12 ------------ .github/instructions/install-guides.instructions.md | 10 ---------- .github/instructions/learning-paths.instructions.md | 10 ---------- 3 files changed, 32 deletions(-) delete mode 100644 .github/instructions/content-quality.instructions.md delete mode 100644 .github/instructions/install-guides.instructions.md delete mode 100644 .github/instructions/learning-paths.instructions.md diff --git a/.github/instructions/content-quality.instructions.md b/.github/instructions/content-quality.instructions.md deleted file mode 100644 index e0384278f9..0000000000 --- a/.github/instructions/content-quality.instructions.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -name: Content quality and discoverability guidelines -description: Use focused skills for Learning Path structure, install guide structure, writing style, front matter, link quality, accessibility, and SEO/GEO/AEO discoverability. -applyTo: "content/learning-paths/**/*.md,content/install-guides/**/*.md" ---- - -For Learning Path task flow and structural readiness, use `.github/skills/learning-path-structure-review/SKILL.md`. -For install guide scope, verification, and structural readiness, use `.github/skills/install-guide-structure-review/SKILL.md`. -For prose clarity, Arm terminology, accessibility language, and AI-sounding text, use `.github/skills/writing-style-review/SKILL.md`. -For metadata and front matter, use `.github/skills/frontmatter-audit/SKILL.md`. -For accessible link text, use `.github/skills/link-text-review/SKILL.md`. -For focused SEO, GEO, AEO, and AI-agent discoverability review, use `.github/skills/seo-geo-aeo-review/SKILL.md`. diff --git a/.github/instructions/install-guides.instructions.md b/.github/instructions/install-guides.instructions.md deleted file mode 100644 index 2ad47f950b..0000000000 --- a/.github/instructions/install-guides.instructions.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Install guides general guidance -description: Use the install guide structure review skill for install guide scope, structure, verification, troubleshooting, version notes, and multi-page guide guidance. -applyTo: "content/install-guides/**/*.md" ---- - -Install guide structure guidance now lives in `.github/skills/install-guide-structure-review/SKILL.md`. - -For front matter and metadata checks, use `.github/skills/frontmatter-audit/SKILL.md`. -For writing style and voice checks, use `.github/skills/writing-style-review/SKILL.md`. diff --git a/.github/instructions/learning-paths.instructions.md b/.github/instructions/learning-paths.instructions.md deleted file mode 100644 index a5330f6bdf..0000000000 --- a/.github/instructions/learning-paths.instructions.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Learning Paths general guidance -description: Use the Learning Path structure review skill for Learning Path task ownership, structure, scope, validation, further reading, and recap guidance. -applyTo: "content/learning-paths/**/*.md" ---- - -Learning Path structure guidance now lives in `.github/skills/learning-path-structure-review/SKILL.md`. - -For front matter and metadata checks, use `.github/skills/frontmatter-audit/SKILL.md`. -For writing style and voice checks, use `.github/skills/writing-style-review/SKILL.md`. From da6ad0ac544b72a565ae5b9217026a7330fb240b Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 17 Jun 2026 12:10:25 -0500 Subject: [PATCH 067/137] removing redundant content in AGENTS.md --- AGENTS.md | 38 +++++++++++--------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 7fa3e52c87..2a1ce4277c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,9 +10,16 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - `content/install-guides/` contains installation and verification guides. - `.github/skills/` contains reusable reviewer workflows and task-specific capabilities. -## Source of truth +## Compatibility + +- `.github/copilot-instructions.md` is a short compatibility pointer for Github Copilot. It is not the source of truth. + +## Reviewer workflows + +Use skills for repeatable workflows such as image audits, metadata description updates, stale-content audits, or structured content-quality checks. + +Current shared skills: -- Repository router: `AGENTS.md` - Learning Path structure review: `.github/skills/learning-path-structure-review/SKILL.md` - Install guide structure review: `.github/skills/install-guide-structure-review/SKILL.md` - Writing style and voice review: `.github/skills/writing-style-review/SKILL.md` @@ -25,31 +32,8 @@ Use this file as a lightweight router for Codex, Copilot, and other coding agent - Images, alt text, captions, and `#center` syntax: `.github/skills/audit-images/SKILL.md` - Code samples, commands, outputs, and code fence integrity: `.github/skills/code-sample-review/SKILL.md` -Prefer the narrowest applicable file. Avoid loading every instruction file by default. +Keep deterministic scans in scripts when possible, and keep long reference material out of always-loaded instructions. -## Compatibility - -- `.github/copilot-instructions.md` is a short compatibility pointer for Github Copilot. It is not the source of truth. -- `.github/instructions/*.instructions.md` files are compatibility pointers. Skill references are the source of truth. - -## Reviewer workflows - -Use skills for repeatable workflows such as image audits, metadata description updates, stale-content audits, or structured content-quality checks. - -Current shared skills: - -- `.github/skills/learning-path-structure-review/SKILL.md` for reviewing Learning Path task ownership, structure, scope, validation, further reading, recap sections, and performance-learning integrity. -- `.github/skills/install-guide-structure-review/SKILL.md` for reviewing install guide structure, install-only scope, version notes, verification, troubleshooting, and multi-page guide behavior. -- `.github/skills/writing-style-review/SKILL.md` for reviewing prose style, voice, tone, readability, inclusive language, Arm terminology, headings, and AI-sounding text. -- `.github/skills/frontmatter-audit/SKILL.md` for auditing YAML front matter, required fields, fixed fields, duplicate weights, closed-list metadata, draft metadata, and description quality. -- `.github/skills/metadata-description-update/SKILL.md` for adding or improving front matter `description` fields for Learning Paths and install guides. -- `.github/skills/seo-geo-aeo-review/SKILL.md` for reviewing and improving search intent, AI-agent selection signals, answer-engine readiness, titles, headings, and broader discoverability. -- `.github/skills/markdown-component-edit/SKILL.md` for adding or updating links, tables, notices, tab panes, code panes, and other structured Markdown components. -- `.github/skills/link-text-review/SKILL.md` for reviewing and improving accessible, descriptive Markdown link text. -- `.github/skills/stale-content-review/SKILL.md` for periodic maintenance scans that flag stale-content risk, screenshots, mutable dependencies, temporal wording, old dates, and version-sensitive content. -- `.github/skills/audit-images/SKILL.md` for auditing Markdown image references, deficient alt text, captions, alignment syntax, and before/after image quality counts. -- `.github/skills/code-sample-review/SKILL.md` for reviewing code samples, commands, command output, language tags, and code fence integrity. - -Keep deterministic scans in scripts when possible, and keep long reference material out of always-loaded instructions. +Prefer the narrowest applicable file. Avoid loading every instruction file by default. When creating new skills, prefer a structured `SKILL.md` with concise sections such as description, prerequisites, trigger, workflow, validation rules, and error handling. Keep the workflow explicit enough to be repeatable without turning the skill into a full style guide. From f6ee7c7af33f8a2e083dedc0296ff7c238eae749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Gonz=C3=A1lez?= Date: Thu, 18 Jun 2026 09:49:40 +0100 Subject: [PATCH 068/137] Modify Topo Template walkthrough MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás González --- .../build-the-template.md | 314 ++++++++++-------- 1 file changed, 176 insertions(+), 138 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index bf1b9078fb..37bebfe641 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -6,17 +6,15 @@ weight: 4 layout: learningpathall --- -## Start from the application pieces +## What you will build -The `topo-imx93-npu-deployment` repository is a Compose project with Topo metadata at the root. The Topo-specific part is not a replacement for Compose. The services still describe container builds, dependencies, ports, volumes, and runtime settings. The `x-topo` block adds the metadata Topo uses to identify the Template, check target requirements, and prompt for configuration. +In this section, you will build the `topo-imx93-npu-deployment` Template starting from two baremetal +projects: -The project has three implementation areas: +- a Cortex-A web application that prepares images, writes model and tensor data into shared memory, and sends inference commands over `RPMsg` +- a Cortex-M33 ExecuTorch runner firmware project for the FRDM i.MX 93 -- `executorch-runner/`: builds the ExecuTorch `.pte` program and the Cortex-M33 firmware ELF. -- `webapp/`: builds the Flask application that stages memory and sends `RUN` commands over `RPMsg`. -- `compose.yaml`: connects the build artifacts, runtime services, Remoteproc Runtime settings, and Topo metadata. - -When bootstrapping this Template from scratch, first make the project work as a normal Compose build. Then add the `x-topo` metadata that lets Topo deploy it consistently to an Arm64 target. +You will first combine those sources into one repository, then make the repository a normal Compose project, and only then add the Topo metadata and Remoteproc Runtime services. ## Install the Topo Template authoring skills @@ -40,7 +38,7 @@ git clone https://github.com/arm/Topo-Template-Format.git Restart your agent after installing or updating the skills. -You can then use the skills as part of the Template authoring flow. From the root of any Compose project, ask your agent to use `topo-template-bootstrap`: +You can use the skills when you reach the Compose-to-Topo step in this walkthrough. From the root of the Compose project, ask your agent to use `topo-template-bootstrap`: ``` Use topo-template-bootstrap on this repository. @@ -52,56 +50,147 @@ Add x-topo metadata only where it reflects the actual services, hardware require After bootstrap, ask the agent to use `topo-template-lint`: ``` -Use topo-template-lint on topo-imx93-npu-deployment. +Use topo-template-lint on this repository. Validate compose.yaml against the Topo Template Format schema. -Check README alignment, deployment_success_message, Remoteproc Runtime metadata, and x-topo.args wiring. +Check README alignment, Remoteproc Runtime metadata, and x-topo.args wiring. +``` + +## Create the repository from the baremetal projects + +Clone the original Topo Template and start a new empty repository: + +```bash +git clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git +mkdir new-topo-npu-template +cd new-topo-npu-template +``` + +Create the project layout: + +```bash +mkdir -p webapp executorch-runner licenses +``` + +Copy over the relevant `webapp` files: + +```bash +cp -R ../topo-imx93-npu-deployment/webapp/src webapp +``` + +Copy the Cortex-M33 runner build inputs from the firmware project: + +```bash +cp ../topo-imx93-npu-deployment/executorch-runner/build-runner.sh executorch-runner/build-runner.sh +cp ../topo-imx93-npu-deployment/executorch-runner/export_mv2_imx93.py executorch-runner/export_mv2_imx93.py +cp -R ../topo-imx93-npu-deployment/executorch-runner/patches executorch-runner ``` -The lint pass should confirm that the Template has a root-level `x-topo.name`, that non-remoteproc services use `platform: linux/arm64`, that `cm33-runner` uses the Remoteproc Runtime annotation, and that every `x-topo.args` entry is carried into Compose or Docker build arguments where appropriate. +Add the licenses and ignore rules used by the source projects: + +```bash +cp ../topo-imx93-npu-deployment/LICENSE.md . +cp -R ../topo-imx93-npu-deployment/licenses . +cp ../topo-imx93-npu-deployment/.gitignore . +``` -## Create the runner build pipeline +At this point, the repository is only source code. It is not a Compose project and it is not a Topo Template. -The `executorch-runner/Dockerfile` is a multi-stage Dockerfile. It builds two artifacts from one build context: +## Turn the sources into a Compose project -- `mv2_ethosu65_256.pte`: the MobileNetV2 ExecuTorch program lowered for `ethos-u65-256`. -- `executorch_runner_cm33.elf`: the Cortex-M33 firmware image loaded by Linux `remoteproc`. +Before adding Topo metadata, make the project work as ordinary Compose. Start by containerizing the Cortex-A web application. -The first half of the Dockerfile builds the model artifact: +Create `webapp/Dockerfile`: ```Dockerfile -FROM build-base AS executorch-base -... -FROM executorch-base AS pte-builder -... -RUN source /workspace/executorch/examples/arm/arm-scratch/setup_path.sh && \ - python /usr/local/bin/export_mv2_imx93.py +FROM python:3.12-slim -FROM busybox:1.36 AS pte-artifacts -COPY --from=pte-builder /workspace/build/mv2-imx93/mv2_ethosu65_256.pte /artifacts/mv2_ethosu65_256.pte +WORKDIR /app + +ENV PYTHONUNBUFFERED=1 + +RUN python -m pip install --no-cache-dir flask==3.0.3 + +COPY src/data/imagenet_classes.txt /opt/mv2-imx93/imagenet_classes.txt +COPY src/app.py . +COPY src/templates/ templates/ +COPY src/static/ static/ + +EXPOSE 3000 + +CMD ["python", "app.py"] +``` + +Create `webapp/compose.yaml`: + +```yaml +services: + webapp: + platform: linux/arm64 + build: + context: . + dockerfile: Dockerfile + privileged: true + ports: + - "${WEBAPP_PORT:-3001}:3000" + volumes: + - /sys:/sys + - /dev:/dev + restart: unless-stopped +``` + +Create the root `compose.yaml`: + +```yaml +services: + webapp: + platform: linux/arm64 + extends: + file: webapp/compose.yaml + service: webapp +``` + +Check that Compose can read the project: + +```bash +docker compose config +``` + +## Add the ExecuTorch artifact pipeline + +The web application needs an ExecuTorch `.pte` model, and the target needs a Cortex-M33 ELF image. Both artifacts are built by `executorch-runner/Dockerfile`: + +```bash +cp ../topo-imx93-npu-deployment/executorch-runner/Dockerfile executorch-runner/ ``` -The second half builds and packages the firmware: +For this multi-stage Dockerfile: + +- `build-base`: installs the common Ubuntu build tools. +- `executorch-base`: clones ExecuTorch, installs the Arm backend dependencies, and copies `export_mv2_imx93.py`. +- `pte-builder`: exports `mv2_ethosu65_256.pte`. +- `pte-artifacts`: packages the `.pte` file as a BuildKit artifact context. +- `runner-base`: installs the Arm GNU toolchain, MCUX SDK, RPMsg-Lite dependencies, runner sources, and local patches. +- `runner-builder`: builds `executorch_runner_cm33.elf`. +- `runner-artifacts`: packages the ELF for inspection or reuse. +- `runner-runtime`: produces a `scratch` image whose entrypoint is the ELF file. + +The important artifact stages look like this: ```Dockerfile -FROM build-base AS runner-base -ARG MCUXSDK_MANIFEST_URL=https://github.com/nxp-mcuxpresso/mcuxsdk-manifests.git -ARG MCUXSDK_MANIFEST_REV=v25.09.00 -... -FROM runner-base AS runner-builder -RUN /usr/local/bin/build-runner.sh /artifacts +FROM busybox:1.36 AS pte-artifacts +COPY --from=pte-builder /workspace/build/mv2-imx93/mv2_ethosu65_256.pte /artifacts/mv2_ethosu65_256.pte + +FROM busybox:1.36 AS runner-artifacts +COPY --from=runner-builder /artifacts/executorch_runner_cm33.elf /artifacts/executorch_runner_cm33.elf FROM scratch AS runner-runtime COPY --from=runner-builder /artifacts/executorch_runner_cm33.elf /executorch_runner_cm33.elf ENTRYPOINT ["/executorch_runner_cm33.elf"] ``` -The `runner-runtime` stage is intentionally a `scratch` image. The only payload is the ELF file. When the service starts with `runtime: io.containerd.remoteproc.v1`, containerd uses Remoteproc Runtime instead of a normal Linux process runtime. Remoteproc Runtime passes the ELF entrypoint to the Linux `remoteproc` driver, and the `imx-rproc` driver loads and releases the Cortex-M33. - -The project also applies patches before building the runner. One patch changes the MCUX SDK RAM linker and startup behavior so initialized data is loaded in-place by `remoteproc` rather than copied from a flash-style load address. The runner patches add RPMsg stability fixes and trace output used by the web application. +## Connect the artifact services -## Add artifact-only Compose services - -At the root of the Template, create normal Compose services for the build outputs: +Add artifact-only services to the root `compose.yaml`: ```yaml services: @@ -112,6 +201,8 @@ services: context: executorch-runner dockerfile: Dockerfile target: pte-artifacts + cache_from: + - ${EXECUTORCH_BASE_CACHE_IMAGE:-ghcr.io/arm-examples/topo-imx93-npu-deployment/executorch-base:et-v1.2.0-ubuntu24.04} runner-artifacts: platform: linux/arm64 @@ -120,11 +211,13 @@ services: context: executorch-runner dockerfile: Dockerfile target: runner-artifacts + cache_from: + - ${IMX93_RUNNER_BUILD_CACHE_IMAGE:-ghcr.io/arm-examples/topo-imx93-npu-deployment/imx93-runner-build:mcux-v25.09.00-armgcc14.2-ubuntu24.04} ``` -These services are not runtime application containers. `scale: 0` keeps them out of the running deployment while still making their build targets available to the rest of the Compose project. +These services are build targets, not runtime containers. `scale: 0` keeps them out of the running deployment while still making their artifacts available to other builds. -The web application imports the PTE artifact as a BuildKit additional context: +Update `webapp/compose.yaml` so the Flask image imports the `.pte` artifact: ```yaml services: @@ -135,19 +228,24 @@ services: dockerfile: Dockerfile additional_contexts: pte_artifacts: service:pte-artifacts + privileged: true + ports: + - "${WEBAPP_PORT:-3001}:3000" + volumes: + - /sys:/sys + - /dev:/dev + restart: unless-stopped ``` -The webapp Dockerfile then copies from that context: +Then update `webapp/Dockerfile` to copy the model from that BuildKit context: ```Dockerfile COPY --from=pte_artifacts /artifacts/mv2_ethosu65_256.pte /opt/mv2-imx93/mv2_ethosu65_256.pte ``` -This keeps the model export pipeline separate from the Flask app while still producing one deployable webapp image. - -## Add the remote processor service +## Add the Remoteproc Runtime service -The Cortex-M33 firmware is represented as another Compose service: +Add the Cortex-M33 runner as a Compose service: ```yaml services: @@ -157,18 +255,17 @@ services: context: executorch-runner dockerfile: Dockerfile target: runner-runtime + cache_from: + - ${IMX93_RUNNER_BUILD_CACHE_IMAGE:-ghcr.io/arm-examples/topo-imx93-npu-deployment/imx93-runner-build:mcux-v25.09.00-armgcc14.2-ubuntu24.04} runtime: io.containerd.remoteproc.v1 annotations: remoteproc.name: imx-rproc ``` -This is the key heterogeneous deployment hook. The service is still built by Docker, but it is not launched as a Linux userspace process. The `runtime` selects the containerd Remoteproc Runtime shim, and `remoteproc.name: imx-rproc` selects the i.MX 93 remote processor driver. - -After this service starts, Linux exposes the RPMsg device used by the Cortex-A web app. The Flask code waits for `/dev/ttyRPMSG*`, writes the `.pte` file to `0xC0000000`, writes the input tensor to `0xC036D000`, sends `RUN\n` over RPMsg, and parses the `CM33:` response lines into top-1 and top-5 ImageNet results. - -## Add the web application service +This is the heterogeneous deployment hook. Docker still builds an image, but the service is not started as a Linux userspace process. The runtime `io.containerd.remoteproc.v1` selects Remoteproc Runtime, and the `remoteproc.name` annotation tells the shim to use the i.MX remote processor +driver. -The web application service extends `webapp/compose.yaml` from the root Compose file: +Make the web application depend on the CM33 runner: ```yaml services: @@ -181,24 +278,12 @@ services: - cm33-runner ``` -The extended service is privileged and mounts `/sys` and `/dev`: +The web app is privileged and mounts `/sys` and `/dev` because it checks the device tree, reads remoteproc state through `/sys/class/remoteproc`, talks to `/dev/ttyRPMSG*`, writes shared memory through `/dev/mem`, and checks for `/dev/ethosu0`. -```yaml -services: - webapp: - privileged: true - ports: - - "${WEBAPP_PORT:-3001}:3000" - volumes: - - /sys:/sys - - /dev:/dev -``` - -Those mounts are required because the app checks `/proc/device-tree`, reads remoteproc state through `/sys/class/remoteproc`, talks to `/dev/ttyRPMSG*`, writes model and tensor data through `/dev/mem`, and checks for `/dev/ethosu0`. - -## Add Topo metadata +## Add Topo metadata and arguments -After the Compose services are in place, add the root-level `x-topo` block: +After the Compose services are complete, add the root-level `x-topo` block. +Keep it at the root of `compose.yaml`, not under `services`. ```yaml x-topo: @@ -206,33 +291,6 @@ x-topo: description: "Runs a Cortex-A web application that sends image inference commands to a resident CM33 ExecuTorch runner over RPMsg." features: - "remoteproc-runtime" -``` - -Keep `x-topo` at the root of `compose.yaml`, not under `services`. The `features` entry is what tells Topo this Template needs a target with Remoteproc Runtime support. That is why `topo health` checks for: - -```output -Remoteproc Runtime: ✅ (remoteproc-runtime) -Remoteproc Shim: ✅ (containerd-shim-remoteproc-v1) -Subsystem Driver (remoteproc): ✅ (imx-rproc) -``` - -You can also add a deployment success message so users know exactly what to do after deployment: - -```yaml -x-topo: - deployment_success_message: | - The i.MX93 ExecuTorch runner is deployed. - Open http://:3001 and classify an ImageNet image. -``` - -## Expose project configuration - -Topo arguments are metadata for project parameters. Compose still carries the values into the build. - -The current Template exposes optional cache image parameters: - -```yaml -x-topo: args: EXECUTORCH_BASE_CACHE_IMAGE: description: Optional GHCR image used as a BuildKit cache source for the ExecuTorch PTE build. @@ -244,49 +302,26 @@ x-topo: default: ghcr.io/arm-examples/topo-imx93-npu-deployment/imx93-runner-build:mcux-v25.09.00-armgcc14.2-ubuntu24.04 ``` -Those values are used by Compose interpolation in `build.cache_from`: +The `features` value tells Topo that this Template requires `remoteproc-runtime` support on the target. This is useful when checking for project compatibility with the `topo templates --target ` command. + +The `args` entries describe configurable build inputs. Compose consumes those values through the `cache_from` interpolation you added earlier: ```yaml cache_from: - ${EXECUTORCH_BASE_CACHE_IMAGE:-ghcr.io/arm-examples/topo-imx93-npu-deployment/executorch-base:et-v1.2.0-ubuntu24.04} ``` -For build-time configuration, wire Topo arguments into standard Compose `build.args`. The runner Dockerfile already declares project-specific arguments for the MCUX SDK manifest: +Keep runtime settings such as `WEBAPP_PORT` as normal Compose interpolation unless you intentionally want Topo to collect them as Template setup arguments. -```Dockerfile -ARG MCUXSDK_MANIFEST_URL=https://github.com/nxp-mcuxpresso/mcuxsdk-manifests.git -ARG MCUXSDK_MANIFEST_REV=v25.09.00 -``` +## Validate the final Template -To expose the SDK revision through Topo, add matching Compose build args to the services that build `runner-base` descendants: +Check the Compose model and check that the Topo metadata is present: -```yaml -services: - runner-artifacts: - build: - args: - MCUXSDK_MANIFEST_REV: ${MCUXSDK_MANIFEST_REV:-v25.09.00} - - cm33-runner: - build: - args: - MCUXSDK_MANIFEST_REV: ${MCUXSDK_MANIFEST_REV:-v25.09.00} - -x-topo: - args: - MCUXSDK_MANIFEST_REV: - description: MCUX SDK manifest revision used to build the Cortex-M33 runner. - required: false - default: v25.09.00 +```bash +docker compose config ``` -With that wiring, Topo can prompt for the value when the Template is cloned or extended, Compose passes the value into Docker BuildKit, and the Dockerfile consumes it through `ARG MCUXSDK_MANIFEST_REV`. - -Use this only for configuration that should be chosen at Template setup time. Runtime-only settings, such as `WEBAPP_PORT`, should remain normal Compose environment interpolation unless you intentionally want Topo to collect them as build-time parameters. - -## Lint the Template - -Before publishing the Template, validate the root Compose file: +If you have the Topo Template Format schema locally, validate the root Compose file: ```bash check-jsonschema \ @@ -294,17 +329,20 @@ check-jsonschema \ compose.yaml ``` -Then review the Template the same way Topo Template linting does: +Review these points: -- The Template root contains `compose.yaml`. -- `compose.yaml` contains a root-level `x-topo.name`. -- Non-remoteproc services set `platform: linux/arm64`. -- The `cm33-runner` service uses `runtime: io.containerd.remoteproc.v1` and `remoteproc.name: imx-rproc`. -- `x-topo.description` matches the README and the actual Cortex-A to Cortex-M33 RPMsg flow. +- `compose.yaml` contains root-level `x-topo` metadata. - `x-topo.features` includes `remoteproc-runtime`. -- `x-topo.args` entries are either consumed through Compose interpolation, such as the cache image values, or wired into `services..build.args` and declared as Dockerfile `ARG` instructions. -- `deployment_success_message` tells the user to open the web app on the configured target port. - -## What you've accomplished - -You now understand how the `topo-imx93-npu-deployment` Template is built from ordinary Compose services plus Topo metadata: artifact-only build stages produce the model and firmware, Remoteproc Runtime starts the Cortex-M33 ELF, RPMsg connects the processors at runtime, and `x-topo.args` provides a path for setup-time configuration without replacing Docker or Compose. +- non-remoteproc services set `platform: linux/arm64`. +- `pte-artifacts` and `runner-artifacts` use `scale: 0`. +- `cm33-runner` uses `runtime: io.containerd.remoteproc.v1`. +- `cm33-runner` has `remoteproc.name: imx-rproc`. +- `webapp` depends on `cm33-runner`. +- `webapp` imports the `.pte` file through `additional_contexts`. +- every `x-topo.args` entry is consumed by Compose interpolation. + +## What you have built + +You started with two baremetal projects, made them a standard Compose project, and then converted that Compose project into a Topo Template. +The final Template builds the ExecuTorch model, packages the Cortex-M33 firmware as a Remoteproc Runtime service, runs the Cortex-A Flask web app, and +exposes the build cache inputs as Topo arguments. From 933ee8274f5764e0dc16df730d166d91e825a591 Mon Sep 17 00:00:00 2001 From: Matt Cossins Date: Fri, 19 Jun 2026 20:36:37 +0100 Subject: [PATCH 069/137] Final tech review - Topo Ethos-U --- .../_index.md | 6 +- .../build-the-template.md | 192 ++++++++++++------ .../deploy.md | 26 +-- .../what-are-the-toolchains.md | 4 +- 4 files changed, 143 insertions(+), 85 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index 2aa46987ca..5220dbf12b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,10 +1,6 @@ --- title: Deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo -draft: true -cascade: - draft: true - description: Use Topo to deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. minutes_to_complete: 60 @@ -14,7 +10,7 @@ who_is_this_for: This is an introductory topic for embedded/edge software develo learning_objectives: - Explain how Topo deploys an application that spans Cortex-A, Cortex-M, and Ethos-U - Deploy the topo-imx93-npu-deployment Template, which operates across Cortex-A, Cortex-M, and Ethos-U, to perform image classification using an ExecuTorch MobileNetV2 model - - Describe how the Template is bootstrapped from Compose services, Remoteproc Runtime metadata, and Topo arguments + - Describe how the Template is bootstrapped from Compose services, Remoteproc Runtime metadata, and Topo arguments and follow this process yourself - Understand how to take similar projects and create Topo Templates, including using Agent Skills prerequisites: diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index 37bebfe641..537d1c8c46 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -8,58 +8,19 @@ layout: learningpathall ## What you will build -In this section, you will build the `topo-imx93-npu-deployment` Template starting from two baremetal -projects: +In this section, you will build the `topo-imx93-npu-deployment` Template starting from two non-Topo, non-Compose projects: - a Cortex-A web application that prepares images, writes model and tensor data into shared memory, and sends inference commands over `RPMsg` - a Cortex-M33 ExecuTorch runner firmware project for the FRDM i.MX 93 -You will first combine those sources into one repository, then make the repository a normal Compose project, and only then add the Topo metadata and Remoteproc Runtime services. +You will combine those sources into one repository, then make the repository a normal Compose project, and only then add the Topo metadata and Remoteproc Runtime services. -## Install the Topo Template authoring skills +## Create the repository from the base projects -The [Topo Template Format](https://github.com/arm/Topo-Template-Format) repository includes public authoring skills for agents that support skill installation: - -- `topo-template-context`: provides Topo and Topo Template reference context for `x-topo` metadata, schema, docs, and CLI Template behavior. -- `topo-template-bootstrap`: converts a Compose repository into a Topo Template by adding or improving `compose.yaml` and `x-topo` metadata. -- `topo-template-lint`: reviews a Topo Template for schema correctness, metadata consistency, deployment success messages, and build argument wiring. - -Install the skills with `npx skills`: - -```bash -npx skills add arm/topo-template-format -``` - -If your agent does not use `npx skills`, clone the Template Format repository and manually copy or symlink the directories under `skills/` into your agent's skills directory: - -```bash -git clone https://github.com/arm/Topo-Template-Format.git -``` - -Restart your agent after installing or updating the skills. - -You can use the skills when you reach the Compose-to-Topo step in this walkthrough. From the root of the Compose project, ask your agent to use `topo-template-bootstrap`: - -``` -Use topo-template-bootstrap on this repository. -Treat the root compose.yaml as the Template root. -Preserve plain docker compose behavior. -Add x-topo metadata only where it reflects the actual services, hardware requirements, and build arguments. -``` - -After bootstrap, ask the agent to use `topo-template-lint`: - -``` -Use topo-template-lint on this repository. -Validate compose.yaml against the Topo Template Format schema. -Check README alignment, Remoteproc Runtime metadata, and x-topo.args wiring. -``` - -## Create the repository from the baremetal projects - -Clone the original Topo Template and start a new empty repository: +We will copy the original base projects from the Topo Template. Clone the Topo Template Format repository for the validation schema, clone the original Topo Template for the source files, and start a new empty repository: ```bash +git clone https://github.com/arm/topo-template-format.git git clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git mkdir new-topo-npu-template cd new-topo-npu-template @@ -82,6 +43,7 @@ Copy the Cortex-M33 runner build inputs from the firmware project: ```bash cp ../topo-imx93-npu-deployment/executorch-runner/build-runner.sh executorch-runner/build-runner.sh cp ../topo-imx93-npu-deployment/executorch-runner/export_mv2_imx93.py executorch-runner/export_mv2_imx93.py +cp ../topo-imx93-npu-deployment/executorch-runner/docker-entrypoint.sh executorch-runner/docker-entrypoint.sh cp -R ../topo-imx93-npu-deployment/executorch-runner/patches executorch-runner ``` @@ -93,13 +55,24 @@ cp -R ../topo-imx93-npu-deployment/licenses . cp ../topo-imx93-npu-deployment/.gitignore . ``` -At this point, the repository is only source code. It is not a Compose project and it is not a Topo Template. +We have now obtained a typical starting point. We have two sets of source code, combined into one repository. It is not a Compose project and it is not a Topo Template. We will now create a Compose project and Topo Template around the source code. + +The Compose project provides the container build and runtime structure. A Dockerfile describes how to build one image. A Compose file describes the services that use those images, their build contexts, ports, volumes, dependencies, and runtime settings. In this Template: + +- `webapp/Dockerfile` builds the Flask image. +- `webapp/compose.yaml` keeps the web app's build context and Linux runtime settings close to the web app source. +- `executorch-runner/Dockerfile` builds the ExecuTorch `.pte` model and Cortex-M33 runner ELF through multi-stage Docker builds. +- the root `compose.yaml` is the Template entry point. It combines the web app, artifact build services, the Remoteproc Runtime service, and the root-level `x-topo` metadata. + +For a general introduction to Compose projects, services, and the `compose.yaml` file, see Docker's [How Compose works](https://docs.docker.com/compose/intro/compose-application-model/) documentation. + +When a step below says to create a file, paste the complete file contents shown. When a step says to add or update part of an existing Compose file, merge the YAML into the existing top-level key shown by the snippet. For example, if a snippet starts with `services:`, add the named service under the existing top-level `services:` map. Do not create a second `services:` block in the same file. ## Turn the sources into a Compose project Before adding Topo metadata, make the project work as ordinary Compose. Start by containerizing the Cortex-A web application. -Create `webapp/Dockerfile`: +Create `webapp/Dockerfile` with the following complete contents: ```Dockerfile FROM python:3.12-slim @@ -120,7 +93,7 @@ EXPOSE 3000 CMD ["python", "app.py"] ``` -Create `webapp/compose.yaml`: +Create `webapp/compose.yaml` with the following complete contents: ```yaml services: @@ -138,7 +111,7 @@ services: restart: unless-stopped ``` -Create the root `compose.yaml`: +Create the root `compose.yaml` with the following complete contents: ```yaml services: @@ -155,9 +128,27 @@ Check that Compose can read the project: docker compose config ``` +You should see output that includes the resolved `webapp` service: + +```output +services: + webapp: + build: + context: /path/to/new-topo-npu-template/webapp + dockerfile: Dockerfile + ports: + - mode: ingress + target: 3000 + published: "3001" +``` + +At this point, Compose can build and run the Cortex-A web application as a normal Linux container. The image runs `webapp/src/app.py`, packages the Jinja templates from `webapp/src/templates/`, the static assets from `webapp/src/static/`, and the ImageNet labels from `webapp/src/data/imagenet_classes.txt`. The container listens on port `3000`, and Compose publishes it on host port `3001` unless you set `WEBAPP_PORT` to another value. + ## Add the ExecuTorch artifact pipeline -The web application needs an ExecuTorch `.pte` model, and the target needs a Cortex-M33 ELF image. Both artifacts are built by `executorch-runner/Dockerfile`: +The web application needs an ExecuTorch `.pte` model, and the target needs a Cortex-M33 ELF image. Both artifacts are built by `executorch-runner/Dockerfile`. + +Copy the Dockerfile into the runner build context: ```bash cp ../topo-imx93-npu-deployment/executorch-runner/Dockerfile executorch-runner/ @@ -166,7 +157,7 @@ cp ../topo-imx93-npu-deployment/executorch-runner/Dockerfile executorch-runner/ For this multi-stage Dockerfile: - `build-base`: installs the common Ubuntu build tools. -- `executorch-base`: clones ExecuTorch, installs the Arm backend dependencies, and copies `export_mv2_imx93.py`. +- `executorch-base`: clones ExecuTorch, installs the Arm backend dependencies, and copies `export_mv2_imx93.py` and `docker-entrypoint.sh`. - `pte-builder`: exports `mv2_ethosu65_256.pte`. - `pte-artifacts`: packages the `.pte` file as a BuildKit artifact context. - `runner-base`: installs the Arm GNU toolchain, MCUX SDK, RPMsg-Lite dependencies, runner sources, and local patches. @@ -190,7 +181,7 @@ ENTRYPOINT ["/executorch_runner_cm33.elf"] ## Connect the artifact services -Add artifact-only services to the root `compose.yaml`: +Add `pte-artifacts` and `runner-artifacts` as siblings of the existing `webapp` service in the root `compose.yaml`: ```yaml services: @@ -215,9 +206,11 @@ services: - ${IMX93_RUNNER_BUILD_CACHE_IMAGE:-ghcr.io/arm-examples/topo-imx93-npu-deployment/imx93-runner-build:mcux-v25.09.00-armgcc14.2-ubuntu24.04} ``` -These services are build targets, not runtime containers. `scale: 0` keeps them out of the running deployment while still making their artifacts available to other builds. +Do not replace the existing root `webapp` service with the snippet above. The root file should now have three service names under the same top-level `services:` map: `webapp`, `pte-artifacts`, and `runner-artifacts`. + +These services are used only to build artifacts. They do not run as part of the deployed application. `scale: 0` tells Compose not to start containers for them, while still allowing other services to copy files from their build outputs. -Update `webapp/compose.yaml` so the Flask image imports the `.pte` artifact: +Replace `webapp/compose.yaml` with the following version so the Flask image imports the `.pte` artifact: ```yaml services: @@ -237,15 +230,17 @@ services: restart: unless-stopped ``` -Then update `webapp/Dockerfile` to copy the model from that BuildKit context: +Then add the `.pte` copy line to `webapp/Dockerfile` with the other `COPY` commands: ```Dockerfile COPY --from=pte_artifacts /artifacts/mv2_ethosu65_256.pte /opt/mv2-imx93/mv2_ethosu65_256.pte ``` +The `/opt/mv2-imx93/` path is the location the Flask application expects for its MobileNetV2 support files. At run time, the app reads the `.pte` file from this path before copying it into reserved memory for the Cortex-M33 runner. + ## Add the Remoteproc Runtime service -Add the Cortex-M33 runner as a Compose service: +Add the Cortex-M33 runner as another sibling under the top-level `services:` map in the root `compose.yaml`: ```yaml services: @@ -262,10 +257,11 @@ services: remoteproc.name: imx-rproc ``` -This is the heterogeneous deployment hook. Docker still builds an image, but the service is not started as a Linux userspace process. The runtime `io.containerd.remoteproc.v1` selects Remoteproc Runtime, and the `remoteproc.name` annotation tells the shim to use the i.MX remote processor -driver. +Keep the existing `webapp`, `pte-artifacts`, and `runner-artifacts` services in the same file. This step adds one more service; it does not replace any of the previous services. + +This is the heterogeneous deployment hook. Docker still builds an image, but the service is not started as a Linux userspace process. The runtime `io.containerd.remoteproc.v1` selects Remoteproc Runtime, and the `remoteproc.name` annotation tells the shim to use the i.MX remote processor driver. -Make the web application depend on the CM33 runner: +Update the existing root `webapp` service so it depends on the CM33 runner and passes the cache image values into the build. Keep the existing `extends` block, then add `depends_on` and `build.args` as shown: ```yaml services: @@ -276,14 +272,22 @@ services: service: webapp depends_on: - cm33-runner + build: + args: + EXECUTORCH_BASE_CACHE_IMAGE: ghcr.io/arm-examples/topo-imx93-npu-deployment/executorch-base:et-v1.2.0-ubuntu24.04 + IMX93_RUNNER_BUILD_CACHE_IMAGE: ghcr.io/arm-examples/topo-imx93-npu-deployment/imx93-runner-build:mcux-v25.09.00-armgcc14.2-ubuntu24.04 ``` The web app is privileged and mounts `/sys` and `/dev` because it checks the device tree, reads remoteproc state through `/sys/class/remoteproc`, talks to `/dev/ttyRPMSG*`, writes shared memory through `/dev/mem`, and checks for `/dev/ethosu0`. +Keep the web app build context in `webapp/compose.yaml`. The root `webapp.build.args` block above only supplies Topo-collected build arguments; it should not replace the extended build context and Dockerfile from `webapp/compose.yaml`. + ## Add Topo metadata and arguments After the Compose services are complete, add the root-level `x-topo` block. -Keep it at the root of `compose.yaml`, not under `services`. +Keep it at the root of `compose.yaml`, as a sibling of `services`, not under `services`. + +If you want to use an agent skill to perform this step, skip to the optional step below. ```yaml x-topo: @@ -306,13 +310,50 @@ The `features` value tells Topo that this Template requires `remoteproc-runtime` The `args` entries describe configurable build inputs. Compose consumes those values through the `cache_from` interpolation you added earlier: -```yaml +```output cache_from: - ${EXECUTORCH_BASE_CACHE_IMAGE:-ghcr.io/arm-examples/topo-imx93-npu-deployment/executorch-base:et-v1.2.0-ubuntu24.04} ``` +The root `webapp.build.args` block also makes the Topo-provided values visible in the Compose build model while preserving the `webapp/` build context inherited through `extends`. + Keep runtime settings such as `WEBAPP_PORT` as normal Compose interpolation unless you intentionally want Topo to collect them as Template setup arguments. +## (Optional) Use an Agent Skill to add the Topo metadata + +The [Topo Template Format](https://github.com/arm/topo-template-format) repository includes public authoring skills for agents that support skill installation: + +- `topo-template-context`: provides Topo and Topo Template reference context for `x-topo` metadata, schema, docs, and CLI Template behavior. +- `topo-template-bootstrap`: converts a Compose repository into a Topo Template by adding or improving `compose.yaml` and `x-topo` metadata. +- `topo-template-lint`: reviews a Topo Template for schema correctness, metadata consistency, deployment success messages, and build argument wiring. + +Install the skills with `npx skills`: + +```bash +npx skills add arm/topo-template-format +``` + +If your agent does not use `npx skills`, manually copy or symlink the directories under `../topo-template-format/skills/` into your agent's skills directory. + +Restart your agent after installing or updating the skills. + +From the root of the Compose project, ask your agent to use `topo-template-bootstrap`: + +``` +Use topo-template-bootstrap on this repository. +Treat the root compose.yaml as the Template root. +Preserve plain docker compose behavior. +Add x-topo metadata only where it reflects the actual services, hardware requirements, and build arguments. +``` + +After bootstrap, ask the agent to use `topo-template-lint`: + +``` +Use topo-template-lint on this repository. +Validate compose.yaml against the Topo Template Format schema. +Check README alignment, Remoteproc Runtime metadata, and x-topo.args wiring. +``` + ## Validate the final Template Check the Compose model and check that the Topo metadata is present: @@ -321,7 +362,28 @@ Check the Compose model and check that the Topo metadata is present: docker compose config ``` -If you have the Topo Template Format schema locally, validate the root Compose file: +In the `docker compose config` output, check that the resolved `webapp` service has: + +- `build.context` ending in `/webapp` +- `build.dockerfile` set to `Dockerfile` +- `build.additional_contexts.pte_artifacts` set to `service:pte-artifacts` + +Install `check-jsonschema` if it is not already available: + +{{< tabpane code=true >}} + {{< tab header="macOS" language="shell" >}} +brew install check-jsonschema + {{< /tab >}} + {{< tab header="Linux / WSL" language="shell" >}} +sudo apt update +sudo apt install -y pipx +pipx ensurepath +pipx install check-jsonschema +export PATH="$HOME/.local/bin:$PATH" + {{< /tab >}} +{{< /tabpane >}} + +Validate the root Compose file with the schema in the Topo Template Format: ```bash check-jsonschema \ @@ -341,8 +403,8 @@ Review these points: - `webapp` imports the `.pte` file through `additional_contexts`. - every `x-topo.args` entry is consumed by Compose interpolation. -## What you have built +## What you've accomplished and what's next + +You started with two non-Topo, non-Compose projects, made them a standard Compose project, and then converted that Compose project into a Topo Template. You created the web app image, added artifact builds for the ExecuTorch `.pte` model and Cortex-M33 ELF, packaged the firmware as a Remoteproc Runtime service, and exposed the build cache inputs as Topo arguments. -You started with two baremetal projects, made them a standard Compose project, and then converted that Compose project into a Topo Template. -The final Template builds the ExecuTorch model, packages the Cortex-M33 firmware as a Remoteproc Runtime service, runs the Cortex-A Flask web app, and -exposes the build cache inputs as Topo arguments. +Next, you will prepare the FRDM i.MX 93 target, deploy the Template with Topo, and run the image classification application. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index 71b4206f8f..49c147de7b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -58,7 +58,7 @@ The web application and Cortex-M33 firmware exchange data through reserved physi {{% notice Warning %}} Back up the board's original device tree before modifying it. The exact boot partition can differ between Linux images, so check the paths on your board before copying files. -{{< /notice >}} +{{% /notice %}} On your host, create a working directory and dump the live device tree from the target: @@ -132,33 +132,33 @@ After the board reboots, run the Topo health check again from the host and verif topo health --target @ ``` -## Clone the Template +## Deploy to the board -Clone the Template onto your host: +You can choose to deploy from the original Template, or from the Template you built from scratch. If you have not already cloned the original Template, clone it now: ```bash -topo clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git +git clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git ``` -Topo prompts for optional build cache image arguments: +Then `cd` into the correct directory: -```output -EXECUTORCH_BASE_CACHE_IMAGE -IMX93_RUNNER_BUILD_CACHE_IMAGE +```bash +cd topo-imx93-npu-deployment ``` -Accept the defaults unless you have your own cache images. +Or: -## Deploy to the board +```bash +cd new-topo-npu-template +``` {{% notice Note %}} If not pulling from the cache, the first build can take a long time and requires about 25 GB of free disk space. It downloads and builds ExecuTorch, the Arm GNU toolchain, MCUX SDK components, RPMsg-Lite, and the Cortex-M33 runner sources. Later builds are faster when Docker can reuse local cache layers or import the configured GHCR cache layers. -{{< /notice >}} +{{% /notice %}} Deploy the project to your target: ```bash -cd topo-imx93-npu-deployment topo deploy --target @ ``` @@ -198,7 +198,7 @@ Then open: ```output http://:3002 ``` -{{< /notice >}} +{{% /notice %}} The application shows: diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md index 55634bbc7b..d5b9d40f0e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md @@ -81,10 +81,10 @@ The web application checks these ranges at startup through `/proc/device-tree`. The `webapp` service is a Python Flask application. It serves the browser UI, preprocesses selected images, stages the .pte program and input tensor in reserved memory, sends inference commands over `RPMsg`, and renders the ImageNet top-1 and top-5 results. -By default, the service maps target port `3001` to container port `3000`. +By default, the service publishes port `3001` on the target and forwards it to container port `3000`. ## What you've accomplished and what's next You now understand the major toolchains and runtime interfaces used by the Template: ExecuTorch, the Cortex-M33 firmware runner, remoteproc-runtime, RPMsg, reserved memory, and the Flask web application. You have also seen how the web application stages the `.pte` program and input data in reserved memory before sending inference commands to the Cortex-M33 firmware. -Next, you will review how the project is structured as a Topo Template, including the Compose services, build artifacts, Remoteproc Runtime metadata, and Topo arguments. +Next, you will build the Template from the base projects by adding the Compose services, build artifacts, Remoteproc Runtime metadata, and Topo arguments. From 649ec29c43ec9976a9f09b03bbdec840938c10fb Mon Sep 17 00:00:00 2001 From: Matt Cossins Date: Fri, 19 Jun 2026 20:42:04 +0100 Subject: [PATCH 070/137] Solve merge conflicts --- .../deploy-ml-model-to-npu-with-topo/_index.md | 8 ++++++++ .../deploy-ml-model-to-npu-with-topo/deploy.md | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index 5220dbf12b..f92d5bfdb6 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,6 +1,10 @@ --- title: Deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo +draft: true +cascade: + draft: true + description: Use Topo to deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. minutes_to_complete: 60 @@ -26,6 +30,10 @@ prerequisites: author: Tomas Agustin Gonzalez Orlando +generate_summary_faq: true +rerun_summary: false +rerun_faqs: false + ### Tags skilllevels: Introductory subjects: Containers and Virtualization diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index 49c147de7b..e9470d222d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -137,9 +137,11 @@ topo health --target @ You can choose to deploy from the original Template, or from the Template you built from scratch. If you have not already cloned the original Template, clone it now: ```bash -git clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git +topo clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git ``` +Topo prompts for optional build cache image arguments. Accept the defaults unless you have your own cache images. + Then `cd` into the correct directory: ```bash From b9b83029618f6f170d366a1c10f5322a009b988b Mon Sep 17 00:00:00 2001 From: Doug Anson Date: Mon, 22 Jun 2026 11:22:57 -0500 Subject: [PATCH 071/137] draft content checked in --- .../gerrit-on-gcp/_index.md | 54 +++++++ .../gerrit-on-gcp/_next-steps.md | 8 + .../gerrit-on-gcp/background.md | 23 +++ .../gerrit-on-gcp/benchmarking.md | 149 ++++++++++++++++++ .../gerrit-on-gcp/firewall_setup.md | 52 ++++++ .../gerrit-on-gcp/images/analysis.png | Bin 0 -> 40711 bytes .../gerrit-on-gcp/images/client-summary.png | Bin 0 -> 22707 bytes .../gerrit-on-gcp/images/cpu-pressure.png | Bin 0 -> 47863 bytes .../gerrit-on-gcp/images/firewall-rule.png | Bin 0 -> 77051 bytes .../gerrit-on-gcp/images/gcp-pubip-ssh.png | Bin 0 -> 24032 bytes .../gerrit-on-gcp/images/gcp-shell.png | Bin 0 -> 22858 bytes .../gerrit-on-gcp/images/gcp-vm.png | Bin 0 -> 266877 bytes .../images/gerrit-correlation.png | Bin 0 -> 61584 bytes .../gerrit-on-gcp/images/gerrit-dashboard.png | Bin 0 -> 141826 bytes .../gerrit-on-gcp/images/network-config.png | Bin 0 -> 222400 bytes .../gerrit-on-gcp/images/network-port.png | Bin 0 -> 219019 bytes .../gerrit-on-gcp/images/network-rule.png | Bin 0 -> 198124 bytes .../gerrit-on-gcp/images/server-metrics.png | Bin 0 -> 32120 bytes .../gerrit-on-gcp/images/stepwise-summary.png | Bin 0 -> 150424 bytes .../gerrit-on-gcp/installation.md | 77 +++++++++ .../gerrit-on-gcp/instance.md | 49 ++++++ 21 files changed, 412 insertions(+) create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_next-steps.md create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/analysis.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/client-summary.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/cpu-pressure.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/firewall-rule.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gcp-pubip-ssh.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gcp-shell.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gcp-vm.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gerrit-correlation.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gerrit-dashboard.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-config.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-port.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-rule.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/server-metrics.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/stepwise-summary.png create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md create mode 100644 content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md new file mode 100644 index 0000000000..56aab8f164 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md @@ -0,0 +1,54 @@ +--- +title: Deploy Gerrit on Google Cloud C4A +description: Learn how to install and configure Gerrit on Google Cloud Axion C4A Arm64 instances and benchmark its performance + + +minutes_to_complete: 30 + +who_is_this_for: This is an introductory topic for developers deploying Gerrit in Arm Linux environments, specifically using Google Cloud C4A virtual machines (VM) powered by Axion processors. + +learning_objectives: + - Provision an Arm-based Ubuntu 24.04 LTS virtual machine on Google Cloud (C4A with Axion processors) + - Install Gerrit Server on the Ubuntu arm64 (C4A) instance + - Verify Gerrit deployment by accessing the web console + - Benchmark Gerrit by measuring operations per second (ops/sec), memory utilization, and disk performance on the Arm platform + +prerequisites: + - A [Google Cloud Platform (GCP)](https://cloud.google.com/free) account with billing enabled + - Basic familiarity with [Gerrit](https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough-github.html) + +author: Doug Anson + +##### Tags +skilllevels: Introductory +subjects: Databases +cloud_service_providers: + - Google Cloud + +armips: + - Neoverse + +tools_software_languages: + - Gerrit + +operatingsystems: + - Linux + +# ================================================================================ +# FIXED, DO NOT MODIFY +# ================================================================================ +further_reading: + - resource: + title: Google Cloud documentation + link: https://cloud.google.com/docs + type: documentation + + - resource: + title: Gerrit documentation + link: https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough-github.html + type: documentation + +weight: 1 +layout: "learningpathall" +learning_path_main_page: "yes" +--- diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md new file mode 100644 index 0000000000..398b02946c --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md @@ -0,0 +1,23 @@ +--- +title: Get started with Gerrit on Google Axion C4A + +weight: 2 + +layout: "learningpathall" +--- + +## Google Axion C4A Arm instances in Google Cloud + +Google Axion C4A is a family of Arm-based virtual machines built on Google’s custom Axion CPU, which is based on Arm Neoverse-V2 cores. Designed for high-performance and energy-efficient computing, these virtual machines offer strong performance for modern cloud workloads such as CI/CD pipelines, microservices, media processing, and general-purpose applications. + +The C4A series provides a cost-effective alternative to x86 virtual machines while leveraging the scalability and performance benefits of the Arm architecture in Google Cloud. + +To learn more about Google Axion, refer to the [Introducing Google Axion Processors, our new Arm-based CPUs](https://cloud.google.com/blog/products/compute/introducing-googles-new-arm-based-cpu) blog. + +## Gerrit + +Gerrit is an open-source, web-based code review system for Git repositories that lets teams review proposed commits before they are merged into a codebase. It is especially useful for projects that want patchset-based reviews, inline comments, approval labels, fine-grained permissions, and integration with CI/CD systems before changes land. + +To learn more, start with the official Gerrit site and documentation, especially the product overview and user guide, which explain how Gerrit fits into a development workflow and how to review, upload, and manage changes. + +For more information on [Gerrit](https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough-github.html) diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md new file mode 100644 index 0000000000..1b322afeb9 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md @@ -0,0 +1,149 @@ +--- +title: Benchmark Gerrit +weight: 6 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + + +## Overview +This section guides you through benchmarking basic Gerrit performance on our Axiom VM. The benchmark consists of a custom script that will exercise and time key Gerrit features/functions. + +## Download and Install the benchmarking script + +Clone the following repo into your VM: + +```bash +cd $HOME +git clone https://github.com/DougAnsonAustinTx/gerrit_test +``` + +## Run Benchmark + +Run the benchmark: + +```bash +cd $HOME/gerrit_test +chmod 755 *.sh +sudo SYNTH_PROFILE=production_like REQUIRE_GERRIT_METRICS=true ./gerrit_perf_test.sh +``` + +The benchmark script will run through some sample exercises that Gerrit supports and will capture performance data from those exercises and place them into a specified JSON file similar to this (partial omitted for brevity): + +```json +{ + "run": { + "run_id": "20260622T152549Z", + "timestamp_utc": "2026-06-22T15:35:19Z", + "host": "douans01-gerrit-arm-6.c.arm-deveco-stedvsl-prd.internal", + "os": "Debian GNU/Linux 13 (trixie)" + }, + "software": { + "java_version": "openjdk version \"21.0.11\" 2026-04-21 OpenJDK Runtime Environment (build 21.0.11+10-1-deb13u2-Debian) OpenJDK 64-Bit Server VM (build 21.0.11+10-1-deb13u2-Debian, mixed mode, sharing) ", + "gerrit_version": "gerrit version 3.11.2", + "gerrit_base_url": "http://127.0.0.1:8080", + "gerrit_test_http_user": "admin", + "prometheus_url": "http://127.0.0.1:9090", + "gerrit_metrics_url": "http://127.0.0.1:8080/plugins/metrics-reporter-prometheus/metrics", + "gerrit_metrics_probe_status": "ok", + "gerrit_metrics_auth_mode": "bearer" + }, + "workload": { + "test_duration_seconds_per_step": 120, + "concurrency_steps": "2,1,1 4,2,1 6,3,2 8,4,2", + "legacy_single_step_defaults": { + "rest_concurrency": 6, + "git_clone_concurrency": 3, + "git_push_concurrency": 2 + }, + "synthetic_profile": "production_like", + "synthetic_projects": 8, + "synthetic_initial_files_per_project": 300, + "synthetic_initial_commits_per_project": 50, + "synthetic_review_changes_per_project": 40, + "synthetic_large_files_per_project": 8, + "synthetic_large_file_kb": 1024 + }, + "startup_state": { + "initial_gerrit_was_running": "true" + }, + "operation_summary": [ + { + "type": "git_clone", + "count": 4301, + "ok_count": 4301, + "fail_count": 0, + "min_ms": 105, + "avg_ms": 244.42269239711695, + "p50_ms": 220, + "p90_ms": 418, + "p95_ms": 456, + "p99_ms": 521, + "max_ms": 611 + }, + { + "type": "git_push_refs_for", + "count": 570, + "ok_count": 570, + "fail_count": 0, + "min_ms": 75, + "avg_ms": 157.13333333333333, + "p50_ms": 155, + "p90_ms": 222, + "p95_ms": 239, + "p99_ms": 288, + "max_ms": 344 + }, + { + "type": "rest_change_query", + "count": 42992, + "ok_count": 42992, + "fail_count": 0, + "min_ms": 12, + "avg_ms": 31.553265723855603, + "p50_ms": 30, + "p90_ms": 50, + "p95_ms": 56, + "p99_ms": 69, + "max_ms": 105 + } + ] + // rest of file omitted for brevity... +} +``` + +This JSON file can be processed to create a summary of the performance of Gerrit on our Axion C4A VM. + +## Performance summary + +The benchmark run completed successfully on the production-like profile with Gerrit metrics enabled. It +recorded 47,863 measured client operations over four 120-second steps, with 47,863 successes and zero failures. +The benchmark gives a high-quality performance view: client latency, stepwise concurrency behavior, node +CPU/memory/disk, and Gerrit-side JVM, GC, Jetty, cache, queue, Git, REST, NoteDB, and receive-commits metrics +are all present: + +![Gerrit Benchmark Summary alt-text #center](images/analysis.png "Gerrit Benchmark Summary") + +Client-visible correctness is excellent: all 47,863 measured operations succeeded. REST query latency remains low +with p99 69 ms. Clone is the dominant pressure point at p99 521 ms, and push remains sub-second at p99 288 ms: + +![Client-side Operation Summary alt-text #center](images/client-summary.png "Client-side Operation Summary") + +The useful capacity signal is the flattening throughput curve after step 2. CPU is already near saturation in step 2, then +stays around 99% in steps 3 and 4. Latency continues rising: clone p99 increases from 221 ms in step 2 to 550 ms in +step 4, while aggregate throughput only rises from 103.3 to 108.4 ops/sec: + +![Stepwise Concurrency Behavior Summary alt-text #center](images/stepwise-summary.png "Stepwise Concurrency Behavior Summary") + +Host CPU pressure: + +![CPU Pressure Summary alt-text #center](images/cpu-pressure.png "CPU Pressure Summary") + +Gerrit server-side correlation observations: + +![Gerrit Server-side Correlation Findings alt-text #center](images/gerrit-correlation.png "Gerrit Server-side Correlation Findings") + +Basic Server Metrics: + +![Basic Additional Server Metrics alt-text #center](images/server-metrics.png "Basic Additional Server Metrics") \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md new file mode 100644 index 0000000000..4b30438519 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md @@ -0,0 +1,52 @@ +--- +title: Create a firewall rule on GCP +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Overview + +In this section you'll learn how to create a firewall rule in Google Cloud Console to allow traffic on TCP port 8080. This step is required for the Learning Path to ensure your Gerrit deployment is accessible. + +{{% notice Note %}} +If you need help setting up Google Cloud Platform (GCP), see the Learning Path [Getting started with Google Cloud Platform](/learning-paths/servers-and-cloud-computing/csp/google/). +{{% /notice %}} + +## Create a firewall rule in GCP +To expose TCP port 8080 for Gerrit, start by creating a new firewall rule in Google Cloud Console: + +- Open the [Google Cloud Console](https://console.cloud.google.com/). +- In the navigation menu, select **VPC network** > **Firewall**. +- Select **Create firewall rule**. + +You'll use this rule to allow incoming traffic on TCP port 8080, which is required for Gerrit access on your Arm-based VM. + +![Google Cloud Console showing the Create firewall rule page with fields for Name set to allow-tcp-8080, Network dropdown, Direction set to Ingress, Action set to Allow, Targets set to Specified target tags with allow-tcp-8080 entered, and Source IPv4 ranges set to 0.0.0.0/0. The interface is clean and organized, focusing on configuring firewall settings for a virtual machine. The overall tone is neutral and instructional. alt-text#center](images/firewall-rule.png "Create a firewall rule") + +- Set **Name** to `allow-tcp-8080`. +- Select the network you want to use for your VM. The default is `autoscaling-net`, but your organization might use a different network. +- Set **Direction of traffic** to **Ingress**. +- Set **Action on match** to **Allow**. +- For **Targets**, select **Specified target tags** and enter `allow-tcp-8080` in the **Target tags** field. +- In **Source IPv4 ranges**, enter `0.0.0.0/0`. + +This configuration allows incoming TCP traffic on port 8080 from any IPv4 address. + +![Google Cloud Console interface displaying the Create firewall rule page. The main section shows fields for Name set to allow-tcp-8080, Network dropdown, Direction set to Ingress, Action set to Allow, Targets set to Specified target tags with allow-tcp-8080 entered, and Source IPv4 ranges set to 0.0.0.0/0. The environment is a clean, organized web dashboard focused on configuring firewall settings for a virtual machine. The tone is neutral and instructional. All visible text is transcribed in the description. alt-text #center](images/network-rule.png "Creating the TCP/8080 firewall rule") + +## Specify protocols and ports + +Next, configure the protocols and ports for your firewall rule: + +- Under **Protocols and ports**, select **Specified protocols and ports**. +- Check the **TCP** box. +- In the **Ports** field, enter `8080`. +- Select **Create** to finish adding the firewall rule. + +This step ensures that only TCP traffic on port 8080 is allowed through the firewall. + +![Google Cloud Console showing the Protocols and ports section of the Create firewall rule page. The TCP checkbox is selected and the Ports field contains 8080. The interface is part of a clean, organized web dashboard for configuring firewall settings. Visible text includes Protocols and ports, Specified protocols and ports, TCP, and Ports 8080. The tone is neutral and instructional. alt-text#center](images/network-port.png "Specifying the TCP port to expose") + +Your network firewall rule has now been created. You're ready to continue with VM creation. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/analysis.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/analysis.png new file mode 100644 index 0000000000000000000000000000000000000000..ce708f0a8f4f462e5a1cde70e82c02ddb0666844 GIT binary patch literal 40711 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%0DI{ZRRj4^y6>{SD7&9WSW&SB0S z@C)4g3X~LLu*Fm4;~Ydq6!#;d49$5HuViDF*U*B?z-vU{k+1TB;F&iWG zp9zVWrFs9!J%rwcj(K0GKOuAIxyxqew|fTd1QV~nLZ{@jwV`vou^@t@OMt3t z1$mFpLKzJyB^vT5FF25F`*|6)hawhPi1&oK`$9R39zfjpcm%U65a%fkN*i`giHE$3I@H(Cq9u!rsgLw z?78c&%%pudP@M>XU&8X}U7V>43C&n&D_-&!;_iiNSzN4N*%5sZvM1tJE0zCq)ILRM ztSVkmgxoB*ugHG{TU~kI)($hpa!{3j8LB{TK&e4=B(&8o@c-Zb;Bgo3EBR%}0$6R+ zKJb8uBOsgodU}Ut|Mepv!jwdg(&r$+vZ%NDT;AdMBt@Hlnfh@OfX>&E>Wg()8=D)a zLx_X1ZUqwpEU;fdw%(-LK40`9&`ObyzW@OIdd%C~6Lcy66zBITK&6s*NSFC}h>(^l zWlqTYACf2qg7!C&8YrmrR0R02#fE609z>s60BA^i&N3pAS$E-n?X|SgE&E7X;oYjr z*B=V55o$Y~f2klW=m!Y&E~tg^qAUQud<7^gngdWS9*Nb!0?Y++x^AZ5(v`MBMqYN! zWla?IpX31x8xo>Vd;(R4b}S~X;UDcLC6FPLF^`q}Z9NnmV~|}+P{=H=Xz2MfWVoJMe-HET1^1AG6s<8h^sg6_nJAsdpekRqxY)5 zA2N66e9rWm4cdYeNYF$goL-QHFkL99MM1!z!UNQS2?h^ z98z=ytHFR%qcEtLl|xDhmHunMo}2^9&Tjk#$i>ft((VKxeYXRP(b>5Ql-_ElN+Nvs zKwB~)2?tP~*){;MvU&__*UUVhRJ##P&jv>(O<+cThRsNJ1d_Lehut^6_}2r?ao4Q` zNVJr!r+{wVse5)d7a=qejm_Yt4xY}!+4B5q9H<;p{1SW3D} z(Gq?A)VA)-b=*$$>-EQ_)~&9CD&YAd;c|8#RFiT}kTHuqgrUd&YW64tdVJTuX zQo2;eHqXeY*Syy2D4gJGeYCSDfln#g5&vuSp=Gi zLP~^yJic=o)^p_3T(n*Eu$WgOzBwY}Ld(_!)Z+&L%`8h;DO-B4ORCJ$ohLeawdEB}D8MHCXh0 z-q2%;c8hMhs?80jU=UipdNLq?=-NeGgpSuror~JD0J<$dvP1+t@Ii1;o#!w@(t0uR zoJ;NPt?ArgtBp7{iLHF6zf%a*1M;hE_wJvv-9sAgvT@fp#q=mz=vaO$7^2Mcpdx=H zrr5~jQL9ZEJ?5HyRVAnhD9L{GIp-ygd3CCcor3e{@IB{5Ky-3r90B(@i4051BAUhW zoBh#Ct{0SshK@`fRoaRR{p?d<7?>}A;lDK_UI-psGcXJj;`2Usw&{qJeRDA3sg_V< z2h%sq6Go8q)p)v@h*LkcZ@A^3+K(;M;351Sj_4lDoy|FtNZLZCjmBN48!_*JbQGW6 zM0Lk92zxkH_WY!`ct|PK`@^HotMx9MI2Hl5>75sBX+b2^MHTqRdT?QjCa@uGLWUgd_%vw92ud5HKV<3X$1uDX?Z-}Cu!AAU=m~iA?+i` zbrCc;#@i^|0r|M~2Q3~P&Obat`LEzH>JZO){GaCDJRHjXj~izi%vi_1g|TNTRF-6? zB1=kykR?&}eaUVtWlgpU(T410580w3B-yivvMWhhe($?e&iC{@|NQ=Y&UMapxttnf z=AO^}dcU@Jn*3FRloh5S*E;eY(|Vuv&+j!=U%XBfx<78$Tf8dvXig_Ezn?li{3>@3 zB|Td|t$nUpZFTs?bOrxGFKWz-Mm6Gw=CaF2<1Aw|9O$iU*AO)!KY!-r9pzL`Z{S?t z_1W)}M_OsBtBUIacYcnpf_(Dhvn%%oZM{Us!+A_p!a^)aXe-MG&47?XWG7wU}Q(|FZsd@^X?kfoA zy?#@xuaKpE>l6{Ah=KbH^zkTqC&!4PX$7nE9Z6nydndW!OzDvcoQgtx65=JquI8IB zhO$&Uh$typIO5^lFzcjkdwHq>P4?0!xB+(swP&hMM)?l#1HJlAwNSBeZ4Fmtc{?I# zD^;rjCQR|Ry{?%P_ivlIQE9@Fe4d`?)Ez%%@8~bCv zJcEKWr^sZ7`(uU9-_WI|34QbI#?i$}UPC>Lfkk;SZ?X9JXtj@lo0D9YUmOn~Inotu zZ+iWO9tD z<%|x41iymMu@Q`-SNm!mu2!@@N?WhN34|K8by9e3g&lNrx|4 zg%AfD)pW5o+h3FtGMgumbi*TN{;2-8jJ;3BxmQbb2uz;o4((SJ_Jy+c;mk-omd`eb zT>N5Q+y<{gkWMNG)tbZ|)~}^i$H3&c72qG^GJac-=oI&*!lorIPB}tYgL6bQfcESY z<@DM)C*Dp6eR7(<9nna?ThxZpz=u(FVlwv8J-M=+j`6962w*64Fuc0@kwGq*dXtflWo@reFgonN0ds2|}= zzUFAPJ|AYNNe*|@1TW5W>^bC3~7@qRIk76?6=^pKYZXty~@1{JL zpqn2PF9v3t#bJbOdt-^FjC07UX||~in?WDy{1jO5O6@Chr0;k^OQ~~pY`7ab)X_Pm zOk~!qgqmcrh~H%ti0Pcs351o2MD4}9FPDU_Gz~ZMr;0Wxq#RSNC@k0Zc8ot1ij&;E zxBo)ge0;%tv{K3OMEz2~+yRl={f3Pk>Hiv+A>8>p2#XDpBmFO54Sh?1h0E5{SEK)f zg~x95DNTO7y=m-oX7|&Kd;!rT;J3FRa;19rj_bns1S??c<}lEEQxlGMxur~WQ@8CJ z2h_xNjoyb?8#mHY)EmZJ;Kwv-24R1We|&`mcYgzKyoKVK#^Mt78`H=i_}_mg5CXnt zx#Vx3_XEV3&TyGC;y-^{9dCw^;uKsWfBCl6u7iEy|JTDKSRE#%hY;hdI|sD$$Gbb5 z+4di**B*CnK-l-u7L_UJQp$!&ZRfc}ltAC30*7r>oS10q>`kexa= zFI;>!0ly3}?$_*2HMFXIaDKl8+3+IZC%RV~lUDm0{^XbNFe4#7e84uYB0vwE18eW| zjSd-=+TMWPFjWxny!4$B#{ncTYads;6hI%31jN*|P4Y@=B9s7KqKoow040WaqCY|d z+Bv;+k9+a;5X|M<&6Gp#e~&^oxF$3dx5>S*zbxXiX@>d5D;( zmjHkP@yKw2!#QXq9vWKO;MFZ`^BVEVRtkIxE{e79GAS^Et3!K{`?Gb2h7b~j)-4*yhX7@3#6zdURhDlAHx3_(^03Kx!L6{-V9koGesJz@0y#IJ*Q) z{6UuqHOa%^wG)7!*jEk#QT|-LouzDMbs7fB=1~u4K~OmSe|}2>$^PfpNtJG1qEPhn zERgNLC$^3q2bAAKA8Kc}zWBj6W(nx-lgXl=L|RF953Gyo^`4xK2c*!Vws*?kIl?PI zXSD>${I50~>=*`Mftpna#;53XCQD^X1@iMS|8+=>-V&lOCkJcG0O3oWAO9L&ZnrV2GH;uIlLfKo&KIL%T2bpj5qK@%<+);dZ$adqRmVtWk? zq0{#Wp6w+cT1N6{N&GX5)*@|JXcWHJ_ZLf=ZbL5@6{SSv+L=_i?o<2Bu4?yLc-L&M zwpCN|5``1iwo~EMxOK;=ZlHfJ^@j)@`RD`cV4wJ9_iht^V*a%OzX7rC_d&N6{Hqs3 zm96A8tLOby2X0H+{g7&iEanuWzfK>GOXKQzcOmVcQNrW*C}Ab9eWk{GZv1Dn0?U0| zDaD@m;h0bBVP7a8o)F&_cXru3ckP|$2Ga+$3ac0dWP3+{z9iAdZIpvKzY0?AT2N(9$8J-GX zybHan{kZ)Q=eMRLoz+rB%ycCd0@cwq6nkkrC>Vtww2;WIytF8}UmLP{8>CcQqb2re zIuG(Py{EN4Y)$9!ct|kej$^e( zptQI_{7kqqN_28P)b2Xeh5o}t#@Arg{K`v|D$|+wa3DQpwjoE3U%Js1+fhZ8awe2G z-6y)Yu`Ng^HqeH24$-azChs4RRaN(kU`C^8Na$+EF9)xah11rM2G>x6LYL%JU_<(@ ztWh=OfhAvUL;^VZPR9`!(b6rXGYg&N@a6-#CMTTbQn$*94y+*rzD(#RB(j329-b+p z>>wlMJpR~WJJ$C>eEVK?n03s<53|sT|L|R3EEraCA@7Ox0=vUxB1av&7HJm*OqU!@ z!{3G(P3={5KVxy&auqF@Raa!b=|G)m(CQSH;Et`23R%Ksoc5dWqKV^A9`|W5-$Tl5 zo&%1;vw=;AO>Qo(Yrpw3&)B2qb1wDspB=ul&|{Wd9OuV$RfSaJ8E%NR*Mr^6+Fo!7 zPdajKt$el)WVR~pmhhXmz&Lrf??!!G8f#A(x8UvU338t2=vHNR+-yiqqEbj2Bj472 zIRVn*ag!Ebg~QCvA1gCC>BdU9ENyzbCoNG#b1_|hjI&Sd`VQ=W3WmJ>5z^8cM6RCp z>bDD3ZJM`uv78~pOh?b(nqDz13OjIKEOAkFn?m4FF(-Z0pT z+b4Ggva4X|AF0O1LDlKFWvW4+r`bdg1GtS21xJ+CWl3uLD^_t9y5m)NI1D>BbR6`tZ;+| zi|cmL`Kl_PXd@L>#>c2s*%N04f|j^OZ>AUXbX;$ABk$x~w5IO&BB6l-+);Y{W!Vi(-V&_)_h^6S{#AW#eyAMnq4n10((UK{*kaT2$b{dA}f1joa;LuhVF|Id`BgnFw2Q&XuQeb3*XAwGD<+$+w13b205 zitr=A|Gs||z4rTY|9FWo8t^#ka>E*bj>vxwO5A=lc!1oYGzBUXn$#3`{%=jFvdHHw z08)5rePUS*hF}LNbsF7%d}s8TSJ7U1->;A7p7LP5u}Co=Qf>xOkiCKD%*6kt3o+`D zbfu8(1YMXvK9--|fu}q^9P>NTKOb;NdkX zlaj?Q9DsSEJN6xzz#sfG2|Z@9E_U7C^tmPH^W?MM@4nOIjsGdq$$R?_JRq+?Hi-T) zRN<5Y7Dr7O>!$LG>Jos}A(!2jp}~9$gofB^Kag2YLT=WBHC!1G{zY)f0`WtE;6le% z_73U)Gn&d#Yz7Wr{dE{-PC}W)1E^F=khC*+b?ZgL}7uk}ShKtD{! zhTjehS2*28dR|wdzD5J22LA;pDxWxM4i20j?0}-H4fbECtMN5A^BxbYlzOqcdp*7) zC^gHAWmS&2v~tKk4uk;cf<4kEX}ozqP9Xt2)2|Shb-E3UAmjv|A;!e*jn2T6V5Iqo z$ih#chot+7_+Df}&4vDH@Y=|>SgeECGLpo5A{LV@@p+ExHK|n&NIfC3Jush^-dsam zHAi9oHQ0g*ay(*AISdYk<3A0d^5t5+bBIM~S1M94hulg(j`@SulK?}|2?eN@ulksL zehLurTYqHS=`mDd83JdK`<<(y6_^?M%iVmEInb^y2KF9GL&Oa5nAb1>rYK)IXC-wL z7}iR4_Q{*uD$g9U>9F0{-ug)qt(iYbKM$3pTqyBb3zNwojYKaXQ;ZnrS1u=b?4D7D z9w-6gi%4nfd0>gte4t`eY{)4FV^zDS#aGh(?t%=vUE=I2V#u~POgZAS`k-(qwyYrl zX+qKlb-KNYM$w*{L-t~Rc8k^>Ded)i8JEVXwvNAMiS554p#>35hN?}751`M*&u*E;ew{h7gfz*?4X%jjH{8|v8Ee9+RiwA8)V-ZL!%| ztC;1W7a(mpoG3(sN?_8KZo%=J8THI^(rjA~gXYi8koOep3XiSpqOPZPdXxtO=#cIL}KlLctY#9BiPIqQYVnBGyyYbA?U! z$mu@oJy0Jvu=1-Gm#|m!98Z%;dNvqiI#=qbnVn|dWFmhWUo8@PHTEjTs4crO5_adYTK+DM7j3GI_7 z4qzxr1A|YXu5G|wp1Cx%*>5UVDSp|msnGon)hWGDA`V9uY8OU!&WG1l#8F*LtM>6H zP`tS=lP$NsLI}RzK3%U)a7I3_H&>D`CFaE(KLy7yiGx))5nuOYm>dURYwPj&;b;xg z0N~^#(@Z#HDh@;|YB7jI$#(inq9dxvz|miP$f+dL7vIbc#q%H$|=W32zKl+E^(P{n*{NX7E#rS*_?)FEq& z!%X2Znu8~@2e1iKv`p4+rp?o_IW{CCDEp@y`&Yr#pF>QT@+3T}f4R);bhYbM!87Om zV2`os&g6|_t;2+s`G^*=t`&dA*O}o{+BeHXW=vg;b(;h+q2Rc6fuc<>ooKG_A%4 zq{ScC_e|q9zCPVhuyjlQdh~1g3v0Sa5n`=G;wF+l+D9T04fbxG6N8j(yT36X?>`lq zUta9n0Xdpw=2F&m?eA}8ytQsbzcpl`n0;`S0gBp!)XJ`B4BEdd2kUm;r&;z))hPLRQ`T^7 z0MAGwC+K}~UhBN24L1_*nLC?@;dMh zhgp2^m3RX*@pGK$a-+H-^Mqa_xoHOfzDI*$-uS=<-p3y&NN!=Se`6w#{Jhrw2eSTi zS9j6Cn^ncU;K%erttRdZnrBjq=}XxYwO!b*ONV(l)W36YOm#rDch_kD$L({PPidV0 zdVOm8A6nKEPJyDbw$#7paNLI&9qKAbMcw@Z4X3 zKJqXzx!8^4FQRwh%b(vks8Q3T+vdYx-@hRMze;yb>W#mi@&PRTDw;p?|K3&5jow$I z#>NQyw*JuUzrJYZ500l016sb)4;XNl0h>I;pqv1J@B%c(aU=EBH2|4BH-pJI<#f{Px}p?UW`Il&jIpczjNz@k6x-g_|P~`DZE|O`kb}8c`nO?{{0uK^Q1u?7MJrX1861 z1%DB(a-as;Z2*3qx_A$9-D61Zt5&WEEJO*4fdQ}XNEca~*7}yE$++-zS>I5|kgz&l zHz&|tnktb?7lc1(UQYxi+RiL!oB-I#1(CxRS%qU<;kdu!2>VmSPY-kgQWX6FaY_R- z7FP8QNc7|#0E^^q!$V+jkK2TN|45-$n#}18zf}!-r0Spdndd?R+C9bTTpS*Xv>fMNpBa(1vmi0B|-&(CLm43u#YGd!AdtE^LfN`KGmeo z&xq4+SvmOQMF6`* zBUV7ZE8`o4CK1<{8?W*uTjv{I0AwGP6o4=UGmL;%8H`nj=UxNy4tJNWD`a` zxjy9S5IIaq(+~0NgOQ{tFO&?5TpHLRP!? z$E0)Ul7q!#q?)?wNDB{vtA|+uV6YA(b}mI^y$t%e4tst(zJr#A=krQo;20;!S-SWfV~+mviu!Q@9%ZKIP@r(wdw-^wK5~Xk{T- z+q9kHatEETm$=fTaWzXVZG^|v}=n%T!m z8ZpC9VCjYBO&`O3<~NoTq;n(mr=fNj1)p8eVs*qVR#wfe@s+pm++3EH_im5Hh8U*8 zgAY8!UBsKzhrLj=phHK!M$*fe8RK=yMAd+_uc(wD?KJ9lzn-n_i?p%3|k! zYk8s_f}EMw#Zl4kEmmuHK?J;ghb1I{_D~4n6_rV) zGo{PE)Ee`U5d3J4K)x-(o5|MwG!qkX&@`h;LSV=pL)bm@Mt%X>Na7(hZnPN{$f*^b zNepFJ6%IUM*O&y($|0FUg^daLY&KyS(v9KJX>7D7FT>m6=WudAl%dBV~CgM9+ zjlr+z7v)S43;p+s&Em$nwowphw7##b&?h7y>Y59LMJn7T@(*iu2(EPhC6_!LAUZ2^7*Zb(KxJrtF5%oM3C??Ym5prD z$g5_xxR?mFJ^n3R;~Z^SyZL}VdWpBee;x$l5{IwvG?!mRB(oS_>^z9xFJT~U#S{EM zt)AU&+yA(@e9L}xK=hHCK9ZAE`vmau<}MUFgcYWNRED0J3xfIky&vHpy}3GqpC)ZWyD?@E?z+64967AC*;f5lia=8t)$mco?`Vx(*280W z#}AN-oIFd1E(2p}YD=G6@U_=#?V6~STSNwPAu2qk)$XSq1w^xp115~<%r4_THhL5P z0X9ncw2_O$in3JK&oydZJQ`%~XM5=`kT}6&n?UlkcaIlPGYq(>vBS~JbkFu% zecC-+B#z+|8#P~kXt6}m8L)+f?GY;?JYzB-xi>~ff6?f_CYI(4DC`;UU<$06;WZjS zi2sYNl)CXa!MqrLs?vG>zy6OFUFI^~&BI1ae|t8WSxUwJQ#D9aC# z33jZW7>W!&dBhxm+w?Fbv-&u8AmDfrpwt;q9gp4x^wZ|{@in7z6^jTE%}D?aHDE8& z{4mn11(>3YLHMjX(lAox`mwsugmag}jtoSrT=5YCI!*3tm+H5Ms5$ZRwQo**_U^M? z%78pPRYTzJT<+?WDiM511{xQzn3dcOq|*ZssPRo;rC)k&HfP_tNi+ymjQ*R~Lr}lWH=PPU zwMGJdItUpSLoJ8tORC+e$y*cuAUOqzSt_U_*7P*RKr`SonMgZeGT4UzIx8S}696fu zhBFKrnuKbc1Z;}fgdU}9-;pZl$vfA%8YZ-FxC5{blH+^=Yp<$27jDY|af^!CfA}fL zuNALudcA^;mDbSbftc(ugYnP`cr;9-7o4?k$kE!4@OUJ~Bk;Ps2ATgNxL=U%VV}Uz zf)uer>mxVZ!=Cz{u7?IOA;>tT0It1-Hvsn$vJ?|(KfKN?b|Cn(JfvaU(~tI*wg3YD zcH8H}I)eVd?UR9593*SNVHaLz$Ug&WNgHkn(pAumXumqmh&x@2Kt+SDO9;8$4Z88Q zoSneUm52{qe)nU*5OOZ{D(%}Xwc1LqN~b8M{Rb_cLX6Ur%bB{D-_Q|Zd$(I%Vuf62 zojb4u@=oKB5rFra;M5(P+b0U0M9?t2cr={K&_F;Z%@&2}fH}q#vE%?np8&5~8yIH_ z(hwU<#vz#WQ;}C=N~=`AMCBJwByt2-L26~)n*SX z#@=1Koa*-&>j6@PvoJ#?HG`*sv)!j`dIr__o@iJZxw+PuH^5L*-)+V@LT4 zna3yet8Z_0665CFpL|5U&+8S6D4)2m5+R}dvoRY+C?ihB%Hczua#sFl8@it4o{wI` z_Jy*tzmq}1O`U>Lsk-;p?Ext;Y>)f|Aj!t!*LQBJnw=d3CtcM6o&@-`l-)7^K`J| zs*`9?{sH1f`V|w0^97uR@ELXl5M0is<$XHPw{4H|v5)FA+O~&vS}dOA_wJ#m?g=s9 z5O)cQ54jd^%#&9AP^KpW9836Y1JWS_MZY^rxdQ#UYfV%@pl<>8UOe6yWo(;f930Xc zrIBRpmUbn&;J|y9A;O5~=6223ZcQC4RKD5X@a3%SEu8{>>P8B}0WsxDA0XdDd!yzW zFpZcq#oKvNaoS2ZIxj$vp(1w;VvetDMzWh|;WE!#N|DZmHEpS{d39 zrY)#)ub1v_8@4cl;x$Z*`TLPr#Ku^jBqqC&uQG2#u+oD&NXD?%Sx+@kzJjfYX8WT# zd*Q+5t@Y1gL#ZQI<0J}m%Qh!W)GpEqyfjnsAHP|xF~IGi zD4~o#8p*3XPaz-+zCgzJUvHa-R_-mkZWz$qjz5kTVS#)>+hAxp?*@gap#+tPtIw;v z&Y!V4BUpNYm$06JYl%+TUPBF=C$KRy1X?Rr?(?@x1KenD4apAzcyu1~R&f1PK?g(r zj#<_A=#8qo8A{WE9I$Xe@IGD5i^IWKf~E)W*Upv&v<{I9+A;_3B>Yz-B^yXkPGGjw ziagd%ZmB1JiS|6xX%))7g)0HPkzS`Y)3+RZZd;068^0AoAW_CyMT~Ak=Mx?wh>!*? z2xVPv>|nm&M|+x4?oUXM57!9;RvU%DE1ZhBMFX0HO%H=&TQ`3xeru)l5oY?u>Z8=2 zdf|{U|3Gf;>S%6E?$9lgIaPc^GluwQv6<4-s7zlEucu>P`G!;Pv38i!YD`VU`)Qa2 zr6feaKf3>5(6&;s@=@NC4WEx~8J;ETQ#~5v%X1P8a+&+FQ4g_IoY0RDvS9s6=QC z#G0JQdkqYYBB_sq!`rKb|4V{#JHX#u77O|a;Kg{ zU6G@QzH6kSvWmFaYn6@VTTAb<<2d@R#g|ciw0V{Af;)iJnrCE>i;zrsrpNc?tHG<) z2X8O%Dsd`*dc3tpG9Te&lj%!qbzkMi#&q7p=8$i^M5#KKHCX1c)ikyir?3#HN`|pSEG%xN}RbbCa%Cw`bIxkB7 z!dMtY71`3!>jI*mD58jm%QopvD$lBmdkIjjO1%-9I2Dhmr;aumcW&-@oc<7g6+4`a z^9oL76C-AfZ9?ry5j0d8^LMJQ#&EAeik>?u@zAY}#d^4VMp4y-&&{X=f;_8IF*tSsr*4NIN=TvQs0jkc- z&rSz!6-|0>@&=9GCw&8h{v+e{shg+BE!)hGs5LIpIX>{7_LjI{W?HOrk4m`aynT$< z-se7sm(6RjJ9pMrmv?z)yer!A(jr$C+jfe`2v%&zj;+G-dXQkvSXh7-AMPYdVtrs& zrl+C1$0YJaybQ4a8hh7o)b679Uk{{q3U6R(wtPk=U$!1(3@GavGYU#k`SINL;AMJ? zrQZ*ZU!naob}cX7oUNPTKg(ew506`N3jZkOWb78xQ_@{PkOS((+Ym>q)3rzc5;pj7 zfFEc?P3QLh`=s5Y;_wStqz2NLM3B|u=%QPI!mV*68 z|80bfS2~L&n0O=mnvkvbNIM|nen*BB*bR?+?52PU-S#Wpjs8`|lA};8B_dzy2Mzct$)IqDuT;UgLbek6pSxBf9VaTNezZ=$U1D)}a3*9Zy$nkMY!9-o>I0yS4#M83tHB=t%7|TnpEP@wt4*>4 zN=XLG9oXB-ioNO7E75Rx9zfQ`L&zZFQ!_Gw01$;Zz;ktQMIalKC(@qEK`CId6|y}H zim^_N1nz8!_xTSbHun#H^c2EWtI%w6z8nI~gXk$h@nx^bJFL2I0OUT3nCvtm zV#WsvyjAG#c?sZ&Yt2 zez4}qZ+~=EC&{m6b>EE5bfN$`8Tf?vUYUZwvf z>;#G4d*lpQVXc@sLd@Ix&i@_|)EL6>Dk9bduaT%=M(Sd|B4t9b1;G9pq&%KLMaNJJ*ZdOr zhmn0)kR3>X=QMDU6x9f_5sI@Fjo^V*cw^iCrS30?ctQFW#1ZBy*cpqgbOQjk_iJVP z=F(l@kY58WegK+VB)CZ<0BHy6+*NS+2-nL9nh_(3GZg}!^y&@|I| z26~wEVB9NKM(ULEn6J}TMwdB_a=thSl+8aEc(X*XOi2w=Oz-=3*5ZJb^9!ZnHeekD zSr1;sMD9VIfRSFiO9Sc^tNif>q`fhbvG6fk5V$kF!@B??A!ZOloK1unLyo<=6WPtf)a7hQ{qafbglqoXug zqW8YR&gK1D8^ga=9rh-J2Wbd8b{o5#qD`Ye!5jHqJQ3)6lb4wD*vX#=;9gDC6hx^1zwUaxM*)<(WM5 zd}C4>zXUpqfuPCDF;yC6QiHvQ&SSSx#Qa?@CQEn6ET@g^#ykxmdUHOAs9^)M9Tv9F zFQivS_v*eHLiUTT2U_TNH;4(p#A=;$ubn(Kx{x$nQ4A6)NY*Zpk1#h z{l(0;FVOt=CJ|2lahVfFH{(tlicn=0uy>AAy6T$sV*hcU1?za9rQnm z!HIS#r3?7=p{Ebvy#deD*{A*Cot^%>cc*?qTz4w7t$bFM-*^}^y6rxXvQmRHr}DMl(&wjFBi;Ak%r3 zTf>6g_vLW|koZv?>w~zr(!=`V4UIf#c&#hyFJMlpJ4Y$+r94yo&5(2(jIZLT;^@Q! zrh}-JmA&8{FifI!w1_;V+)kd)ec)E{=XudjTCR z?U$A6Oz*qw^VHeTSO{m=0brM@`)0{4bW${580YG2ji=WMwtS*{L>zZt+=JukCY$Eu zS*tmPpYw7?{|szGNo$wGTYCi zW2HNv){-fsAJl)u^l($|odK#ZxvNdNL{@#1M;=@!%O)oq_2|zzUs0&n7RRCb(<7LM zeX{ysmR`zJai6L`MJF2RO2t)yT2D2?QC7x|D#gDz`eH*-eaZ?dLw=mt#75aw<}n$+ zk*1#|lX51V@mvPfI}EcjqQcJ1dcm(kf@9nhO;iqFktT3oNyhhH|apfhtgv`jT4zT|nALU-@=;=ZDC>Kt3Hp%B*zCIdCuV z@u8%7Yxo`nJSq4MT>6g{yA;_Id$vb0IBZkw&^YT-|s6$0_wxk z+8X?Mjeb9vvm4;B;k}Axf9-9>@c<4}LEnDAi&g&lVt8+GqO_M!^Esm*7%0zo_LStm<)YR1wj8xWUBM+xE*spPMJm@t{FX!obVTo;F+#Lr#2 z!>4<9{R974Se)M>&+f1a(;r96?`Mr8N1mPXEswvS9pWmHj)^Dv>-&TdK##h*mpFd^ z{XY*UtsT_Zrpk8>V?xAXnm}aII?m?1bxfh<-A!b@+P3q7(L?Isn zuylp6+&gmK3(ynz0J;lz76x|ekcFBUM<2&bQGQuV~| zH$C3aJPS7ILk(mL-m_T|^S)ZE0K;tP74`;&BW2OO;Y!2vDqDMqN!jMXOMv)e_#vn! zbr}e&|B&xfaD|j>qTZ8G$s8U*)Q6QK!;*XFNSrhryjjWh0 zpXSWLmLhHJIeuwpi5r3Sg?^T{!DaAr%J^I5lu3g3X0fc#%nc@;iX@{- zXNx}Qe6kA!-%h^$4&uFXd;I}nwRH-_d!eKBpbX;!6OdO-0Z^nHTMom^Ss-TnjNC4{ z0t$0<1P?9VvdM4}E3*mh^0P)`zHsI|aHr_AO2$Qlqx_a=25*{Ty_6%gD6W+#xi#lOfM~~=J_NSh) zCTv}*orCbCZ6|SA(2v#dQQbbB2#IT>HfkCqbnG^WO|8kP0^S6v?Vb=@>ru!Ibg-*_ zKMn~9Xr4~hc0d9na2@om0R6e4P?61~aDAEonrWq$~j4%#Ekux;>2y;DMcO~L<+E2(& z*gqjSV8n2}HE0X$&7%*L8Ywy~8YNw))a~K**F`me5JBMvrWThgm)*TDDFr>Bj6G@} zt;(8Zz(UqQGWwnB>ZIU3@}FySGccxdz7@(&Hhad|Nza#f4Pdb(ff=(fBBQSvr6&^o z%=P1SA&pGGdZ|GfaM`h^z>49Laup$B60+BgK79L5^*rAD^$4-@OFi$g4T4RkvDdsW zg7*GlYt-@m!-|i7(z{laz-e!6z6dwJThA@#OkRxX z(hiw*(=mzz*6Ok)C7FJe@eTYUh9N)M=}exFJqZaT8aqICE)mY}p(B+qb6&ihIZj6E z`_3A!8PAa&n!(`GlU5O^HHw*WHUrrHWq;kcEZ=PCtzyOZK5mk^E#q=;>=xbWMio|X zDeulbauj2W7%#EP`wjZ-ZbK@ZiR&=7UME+ZCM~yp%fr6pT+!@})M=_QvP%^@+rxsr z>FqGP5*gCh&{pC~=)}sMAA9tvsyx@SaafV}igeuWq+)UkKh;QKdE~6BaHOhor{YMp-pa;oJNFCUM zbnHxYN+w^uLL$ZI@M*n5JT=XVXeD)td;f72GmPwG7rK3y@Xp);0$pyXM%Ib-9^XlQ zA!v4z`WRAOxDo5Jn^ePFqPR^RC`FvP)fw5e*J#)Mdpw%+_oWt_H%4cAYPDpge@$i! zCqWT^PTiN827bvC!@Tm39koN=*Wyy6I^ibiWT+r;vRJ3ouCL?pV+_kTfu+v|6X%5} ztySHwU&D#26?5jEAM`+lREHV;yjR`GLO2l9NgFdHLA9K7`hGhP3MiWpB_H&5lQD@1 zSO^`HxnJHz1cG87R;J_i=mNk3$wzffWv?b5+rYl-wLQuVRLZ-M^pbv0!abVH-)Mh@*dv!7vz75>e=wuPMb?(|g=0 z&4;eZScyj^-a*y*ufU*tg(BR%flBV~vS>&G(ImPtyye+I**-l}(PNYS$eJf{VhYr` z%o#L65Tl?wVNOhEct>KIdmeG8{DU;1`9 z_T#75sTJM7hwx^giEA*n`V=uF)4a>3f_&3R`9TJkm5nUrbbj#aG)YR7H;nJ8$rZBADcU0x$I(?iITA3 zJs!Qx81_P<*pS5X!r34f;o<%xWf_D0x>-Zt^fQZ<{Ll?#npaMj;eDcon&WGs!Z?{j zLhQ=>5*us_Ny~NS!0@p^If`OKvX*^J9bJrFek)Gi0-@hnnVQpZBS7` zIro|~PVGBaAenqO@V8`x&!WS?Ju7CLPc`dCyvw~r65}_sl}hzVs5TN+dhCAT;hM1n zArC{xZ--fj>1UR>vB`)TR?Bozd@`2|W@o6L*?)6yKG>sfFfVcy*VpS)XtFiE*A$ez zNBpCOsN}G^p#iIdu+ftT=@p^l+e(_0J3e2zA7k0fOoQrQpEzGbI0y;usV{F^SJ>Cu zo=I&=PuMSKP#K=@I#>DXdv@gK)sD%G`m&bi4kJebZU&todTzD3E$_8|sd7hJ^j74N z2AMCXiWAH!Q(!;)jKQZsg~vn1OpAkMZI(96L&ri$(3)jdLN3kq_{EmdkWiQB(7YC9 zh3z3Tytv%nbO@cy12gK8V4E0Wt#)mOMK`VA7&|^5tLC-Hm9Ee#GETD7HGUvOgJ|SP z2$6{v%UE}?24#r7{+-K?9M0_QQue7i@AWPmr1_6oW*KKY&J-UFy)FvfQ7*+JAsVNclQX8I~cp65X zmyT?hzZN9*?9VvnqKdC}+nFtuGBYx}_m0>MW>s7uw%MyqbCbU{`S*uSsgWCZvQ1O{ z9J{7WMbQ4g*Wx-Mx6c7x(n}|6X%;9YHisC*2r(5)XfdShfl+H-xB}x#OaVp z7yIK|$;$se6~1_PMBI^Gzb*ft*CiMYgRW*soxi=@e`o|T?(Xhxr9nbKx9r_wXW>wS*fnA1h1D(KJGELz8*qbnWs92yoDT_ zlKvI7{6_`6w?f@ySPoMt%9Q$qySEaR_rZF{EAIox@8CX5GX_lTpP0v-jnQ?dLG~;&Yv#n>=BQpNmHzq`OC06oMHFyT}&?Ejhtxk`n=Inbz*b2~*GNl@u1N?Bs*3mem7Ou`6;kI=P@y zyejl%wKc}_?vz$je?zJ;>XE9`ABzDEt8S_(Z6+rN@fJ8nfPf6MfPevxAb}4N@PUAU zP7H;B2fnd@k613$f1ia~%7y;#V+fzug2F1I($c`Uim{`qsjbszJLe-iky7ANvlgnF z&YE%`d5!ICm<&zqj7*u_ZR}sGK!DtNfkPWpXG02i8*5u9UUz<~e@gHI$FDy#Q&Id= z#Mz3UN>fgeLe$RDl!B9qg^7hq0EvQv0_137#;YtQ@n6+}fALd&c6PSsWoCABb7OL2 zXR>oNXJ+N$;bCTBV`gJ}50rTCFc;iTYm``S0t9nK~IeTG%^V*x6FNUf0mb z&c&IZit6=7|MTZx&uQvz@$Wm?I{nvc0WZk>dWM;miG}%pt_@TLz5dFpXyI;ZttDn* z12hkC4*^y-4$wd4|Bo~OzT z&y)XE5ybrZ=Ks+W|7zxceg)cD013qWKQ@T*dv*FVgWoolA|NeT@!nPuJt+3?9e0kxZ2})V7kfNO!EdTQr5K4U-7Mk`MmIx};pV9z<;NM?V2H*zPz`uW^ z{PhNAWZo95O1=Dlod61-{jUrBUl)F!E_6J6d;Ri!^0K@)QLvKp^0?cQ-57=fiE;b; zHjODX^@^{%w>Uh2{8``vGX^7e7OOE)a z#XUu^xPsx|HUB*R@~FTy#=Yrm8wS>v(4k8=fI>y;mB&A>QUr5m(*<=U>#g4ws^W@N zZ7dLz&-}Jo38jQuy8Xu0fx&U`yTfn2K%(7B?}2dhZjtrfFg8K%$S-G6h)}H++etse z+5Ek>&pb=wCzNG5f3?4m1tyDeYuzVvT(18y?W>{bd7;d#@!P}7egC%ZH}THsqe<5+ zwdMcl3y`9@dkE>(pDxL2?g{_h4}cpb<3X}F$S%34JN(^w@~IU|Dqg-r9!9?VVc+=M zx7F)r#cc&g<>NY@rU4|E$p8k|SueK6g?rA)-Jja=<=f4;NiC#w?Cc_^INt(-ya^%TD{!%3oaML2^Ger2#?dgsAN-x}g`|KV!ZKAETdM=ozxj2pUyG|TpY=`Lv5{A$>`D;ZBrn3)4=jHD>dSx9 zcClP#*s~mhuU8`ISbs6bSDb20H-$-`Qth*qAlWj^)H-tX^Wpf|9~#a6xA#R1-)1!X z^7%0H$#Lt60M~Z1N>O7?fcee5F?!>q%)90l*Cn|apJ8> zAKFj5k&gqBne6rbp6dAy%WH{N({=3HXMkpvI}U&+`|Q4OL?2I%(rw@E0U>MOdVf$x zder+1-0c2zHMgWxU-T23=Hj5NvIVftSo9H+lyO@px{4e}%IaX;MtL=u$kN)bc{|m1 zYak(Vy|g&{;C7e|;%!?IMjE;29;M3%d>w1nn;vw*&t7C6TbQU2+v|$qLvxylD8IUb z;H?D5Ko=v&g-P;`qG4z*fZ1w>d-A|@b(hx)f=|=@PnT1RMNQRDYeDGWp*fD~rW)!5 zM!gAZzBaJInSZe;+Ea^GxTYMZiaxb}ktFw-#_gd08Y14lD{E}+2QUw?`D{1PmoUu zE7l0}%B;t5t^V3W{<_B8emQA7#mt&OhY&;@()ST#lTu7>5{x&Fp`~S6`VGg8WHA65 zzGb~9j4w0Kq9_Ag(Y*7;hM4Q5z3(u7?qIiDzS#hOPy*UoQ^Z)Q)oU ze+fe|0j<@YVh<14OBqa^sjappbRtF_ywID z=(C=diHKIXuN0{LcuP_ft8W4VrV*DScw;{Fut1J#4HtW)jEvi}e)5%IZ26Ko!qzS= z6!gMDrY)$)XuWH?bFF}d4pSnu;5m-uI&eJ-$gXJ<$FCC&;5R~XI1*g_dp{KeLpu(kWmvguH##ujQ z&W=AWbD$CBoGQ{`7{}5N0A?vO4rws-_U{5ZWRV;Rhh_3P2o6bNK;Yp|!LBs96tRx3 z2`G>w6lwEMvWol!0?KCmG-|f-$NHdjL@nnDanjAl6Tg>MFTk|*M3+xYt$*?(gR!~s zqaA!>5;KyhW4T2N9=T1HY+EaeI_e9aN8RZp*v6>G;A3IN-oYUUJ0NxB*mono4P#x) zZCv$~-R2186hlJv4sv8-TR*kwc)DJE`R(`8-hgaO)Xhql#fl+;XcJgtk8p!`#;y=& zB$g-=l7~79EbMR5_d7r&k@I8jS!Nlgcw9Xw>`lP>prJrLRmHQ>mB6?lZjV~Lxs{~g zS}0}Hel=_9jX(3ND4>u7OBclt29d%9PYb#(r*l$W$L8Cv0|kNv4TCH>)y>V4onU=d zpiStbd~L@V|BdcU)^q^jq&o}8-A^_@=9p@^4`251^js2CbseQgsgZa0O(r1+-UY4a zcpfmg0bRI6aV@<~w(V4wxm~rm%>!-yZ0D<;UtxpSNrF#XjvAIoKDq!s#iEeOa~@4Q5<&v9JHeusv0G@~w)JQ_ zA%EO{WN%I;d3O9`z0rJ+XzOu{)i){`hb(&d&9DWMDoTZ~19%{^@XxRb-YDkDziP(? z%F=4U>h7@!JWA{+o?sT^_-WQ;kP_XHHHRU6BAS1JLVG-ycUZW=#l?UaAEgPzQ%q)e z1f7V~Q-a{BWHDxKWL<)9cSi0L2HO57x0P?PJI@a%CwN*Wm|+P+M2NGCFkgJ{_c;gx z9hrDB>nNK<7KgXf^nV-$jXPjWa1b!np%XHbiW4FC)z=Cj5Pm;eV zhNL4`C|gC3vWZF7RYj2!-7vK)W}QCT4M|57+BJytmcdNynZliZAWeO)Bjbb`_8kU$ zv{*-c3cc3P&2+wYeBblz%9q$=D z+ld)>nCea_&I8tpj$5Jl`WgOkt*Sn~KIq&!$K5OOzRK_A`HNO3|NLjIYy1Rfv(zrz z4Aaz!4~g;F#LOLk`rCVYVQnzM@3OIY5*rZ2ku1r?FTMUfno*KJ!mWeV7Cn&BH@4>;E-*WjigN~Jqp-nP zrD%-qecaK-?UvS_SI{QYpTq7FLkDZ2n{_J=U`%BfmSf`f5NzsgL4px-FxVJA&KyLb-QmXx z!D>Z0$h{b9if-|2y0d;2ixq^77UKS?i+*U?eMjXBzCya%;gi4(g{;LdSE8ti2@1jd z5+;hdlvb|N)}CjV@rmjs^-^YWxE!|DZEuc|Byk(>ijQaLl6XIFMAgt8%%I?kS!aBW z`cpCuCkr7IqZ7q%ns^uUE|P?3d(z4eB-Fc;kr7UHWpWI zO69%}2B$;xIS+%wvDivzIB+UE$>XZjB5B?Z1xA!Ybuqp)YQd1P)t#z@n8Za884}dW zi0GIBqNN6^U49r6kSfsxN(6p07@=B;=HESjl-#hO4Yr#SkLAWok5f$&J2uoFWOFra zj2l!{RV5;@ZQ>Sx5&tZvt1XS-gJMCIu=OWYuxLa&$3Glw;LJ*lb&l##rz9fgj);Yk zSB#n^QFvwGZ)m+{?T^le6~gn;Q6QlwntY2TK_uG7J#5)_iz}g*g<8|u8X-4Vh2Vi; zP7H2cMHx;Cle!P#IaJ?%juwX~yx9GwW9|%Jvkl?`zAhy6jv#P2SW;l*H&Am=H80c(n z5h#VXV!t*dxZprhek>#eVvJ2DmLaf$^y;y!<)tdO)KL8tG|I7SD}W18(B2W`245Wf zAUn!IQwj2z--^M?GQCeC@h(CTmFJM)8pC3cS`MPd%_kwic7M8Lmw*O)?EOB?_+uW8 zh~uItLldUpKv^6og+8?%%>hP)W8j&~d&A;P>eH$&8eWCr6yVxSzeVT_SKA`4=*o3IiFFH_J%qtzXDLZeS_ zf=GsbtpZd3t=SG7zf=yp)kkMw_r_MovFEo1l6R1z6s8Ta(yBrB^5}G56qtuR+3+%AvY&fGZOTz3cDJL3ZI!n(Q4htdu`tAF6ft|cDfq%b17pZ#$p-l ze>kAi8}3MwUs~qPk4DfBRwZLy31AfyaMqj|d-}MP|EOe5&r#GQ%A`ymw=CO6n=G_S zw%~reWvfIch7)=TMG*cOe>)$v8C+u;nQY#TWBJ%Z+6V_(beLgSG7W#p{1mw!orgi^ zp75FEiRAo4kIQ|=xz!*$YC>-Q?s*8OdJyGij01uMbl=*K)N`h=BWf zwuHANEz3`0af69D1}$-gumO_8Bu$$C4ui z`6t{tTVBWJI|x1X^vV4fjHlfmR7MeoF(Xn&fo($SZ?0s>(2lIV@WwR?B-fEm3>>XM zi%B7(d`pq*QF21|h0Ll^e-4Jd?#~%(rRV7#mP%63)4v(D83|7G@3n$HX+#N()O2*F zbTVLGX+MNFu#rV&?|%9Mo9JLh*{#SB$IEcrbMf)&Oe4aep(!xDGIv}#m4K8|p;h_L zwfzYp*t@>&3yXbio7H`@dgO(2#W>!TFG;fJEx(;L4e$uc<9vzRb@zN%v?0OCY-W<0 zy3*6{WL@i8d}F-HHz{pCvV_)5Mk;PSro^Q8Q79%!XvK<>p;>I>?CYkIjk0e6i;{Bd zL51x5nzB{5x(6P!ZK(C!EyBg+G|uaui@|Zm2V~vhMEO)}mHOYZ7S`q*u~O_R?uIJ& ziSBEbu}|hLOGg<^9LUIBBrP2GY!Yvn8MFT zGGz+-Q&N*djOWcYg$c=K0VWB2O9y8EiOzuMD5Nw1yAr*19s3KgbYgslfC?E}Ff+zc zx2=T^NT5_?hAPkH6!?zc?#Dl8L%?=r=~&D)UKPjN^u}#<&&T|3oM1ey1HD$e)75t# zA9m6Eec5*(fjCCw&4%%ilw1gBAHw^3doU+*RHDv7N^VC*B&-O8Vb2=7!1oT77F5wB zzWp{V`+Yd$C3k@=c;0o!)`6;bAG!8mZn>kE z^icyM5vmA6+l^x4-ioAnh&CEZdBx~^)Q-~PAoJ3rs)Q0|Ql3Z*I09|2wPAvXKA1M{30Mf{0 z(y00EZ)C{}39u->Jp79P--Kf1pvnP(rEh&ZL5myopj^a9}Apxb*)JPF92HP_3h0C_B_p__v>Ng%b1cR>v*4> zmD0e>IX>4Jtvg?=mN(-BkHO@A-YZb=ac%(!wa0NA`#v>MM~465PwhWc3fPr`4Za-z>tmssN?#_g>Ur3l-P|AfYXkb>^hEE zR{;d@?q;tbu4TdO>-&~UT=-YF>8txj1iQZYQ)TNh?+x%aO@!u|)pP199&IoZ0OhLG zF-Z_-8{QSEzuCr{T#FKXzAZTSot@RT`*~ONN_SQO%CcdWZV0!c_g<9}xfYa-Fy63P zi!~m`OY`vMTGwSp?RZ8*KjwMf%r;S)c0zL1>xAF!Zab|tP0v$$Tlh;kqG{tfd))4C z-v=Ag+A~hd;rZe(*8pC+I{wjmJju#_x0Q5L!pZv>%|2!icu3B17e|lXP2Y~K-)Bmk z-pO&TYyn)(jB7?!r5WHGb^SIT=b1laZrtMFmrlPWlB!LgX)vp%n5edIb3XDcptP~P zflGV=Frw9u@e~ccebd}Mryw}g^Wtnz%Td!{cv=9rz6?;u1y^2ciNJ`>KU8)+w-}Ai z>DcizLk~r*FCXfSMPMF@?|C|Ow$V%Z0o-xVC&%}`6n}HEvZ@=&_jIkx^LIEVbv~QG zX#?wEl}T&o>X+B({Rr^TrPVP@=kT-A>iHOrXp0R_^ZyeBSNdY%g2E z2{CLBumUE1+%7ur9>w@PijB78AWb^~hxQG?fQF;ikGNLdjZ=bjY@1D|Nm$ojJ^qcp z>ew;db^kN*m!brM9N(f0vvb+^^~w6?SuSmV7*0-_He>f@89kWBGCBZw+5T7(*#Wq; z`43Azii5Fl4{pow8$pC>b{V7YvHGhFC~8Jn5rKEWXjsw*-jz(4Qmv@)rm*)pB7-I~72V<}45+%!~lh%`;39Jfv1e@c6FKusA zd(imG=Y+ff%J&pcDca`VmH`cFbabs&Ku|6Cuud7h&uIMh&}odP_~mL&zn%%6+`CHu zb6&_LK>;!~b|QUXTKG4?^iOT8HcSQ!`wITgnDQ3K`;Cqx3+b+f~ zUYV%m4e0T-C%f8ZGlol|adT_X`fEP{TCALNH8_YdyEq+aw%_{pU9jyk-fIEy(`P8& zAxSX~Lj-<+^FDnlcD+rwbhNe&GS;EJX&*6@JpX7m^pqDy_T6SYX;(#o-{s9=ZS;}r zsY5oY+R^Rd%o(ge0$o9*>d_>@5CJnYEL>?X<-0JDE-)de`C=vn zvHYaT>Nx?1faM-$#Ub)G0~?AiO1IFGO=A{OmPh*bnHYVTf;7LfUS1500?VHLug`q7 z(gwnXxX>wDbl^20=#^K4Pgh9xUBi~-mC`14J}*0sUlmBk&Cb07>9_iCM!`8AI~kTF zo4Q4q_t6V%V2Clg7Whx#=wHCnwoelx9pjQY15BX{ufz9k4}!pqtQJVY0~o-S=B`kZ zkU_j7w!eN~dgTIhmi_~xF`gtkibM2XC8H%g^Dg1i-f5QWqI4GDy@K*q{`cKMr%T=% zy~#aK*kuvOqqR+taqHq4{(*kzI56@H@6*8ZsgHsjj@`Mxtt#6+36~)FJ}Yj2z{25` zm<86nVjtn;;1ZfZ7J?-fnyD>eZlgB#PrX87n)ZSd4hWFaKBvd5v?9F$0a7sbd%yBL zbDpeFp*&=;jShO`0-U#P#d5#7L zWdgbpvaZdp^*73-bR^nEbq`gD#&L&*M}@lCFV4}6%Lv)}#BE7X z&281y*>@W)*?tx9_GRWBSHr5O702y9b!I@kyeR)?=tq&EjB-Rp=r7N*SYS?h#$dxy zr&GA#+5q;myWN}{DXsW=RJ~cbJ^ri5;Y|+|snb=nuQqjK&~GSctQbApLKjSqDYM?l z6Rde80OQaxyE^6%n1^B%enn^{!NFlDY4A{$2tK$!apSx1| z*Ry%cz);s4v0be9PB=1V;%+WPU~Y;v9f&laLUr&8_a?zEh0=(T&*5Vx zcUtLHg043II2k2#16dHkMj6c6DsMm!pU5D~k=*0v%9HRpGN}%O9~X$L zWsO%&YB|2m+FIQwkBsZGQbmDLB>96TBsjzvu5JksKnJXteI;ROc*n$@+{nxa79*B? zf!j4`4xFH=K2bKCqa9$4CmVM=$9H9oCvkOAXQ7y%2w4#&Ab04_O)U|1MjBxudBZ`$ z+YiY{?9aNHkR@vZ`8|n5$_-c(ubV1A>Dy=1yzh}lD?3i^{z0sW$87jb+Hxh0+{lgRx{rp`KPKs%m#IQP_u^Q%HjesFdV=tB_4>}W5D?Ec#xb%NNph!;V*34(WtD5*0Ge*fvoUvDLxMxLDlDf-#Y1{J$tS89^%6_n zwpp`7#^crKonjLdtf3KT#d4bI4h3NAz`9KC)ay~G6nHQ5lFPeVzWz*xViNh}$B<8ps%Hn}-q&|*q{M3v(G~rX z(9!R5D;Au*W9^i~t$&~8wa#(AHt;P5o5wfbf3sM|B{M9KUj0*{cs5IO(N=*YnvoBb zH+i_)Q+^w+2Hr7EqZW>+s+$4AO>H|>RHA8|9`i$T*p%GM$dJBi1so{;(U>coo5q8| zH-?lpUL#=sEpx{1Q2mzAy01VITNrGhp#v447=;ssD>y#95Z_$M3EY!!+pgK)(dI2> zVv2=7+pOAMj-{X|=h&b{LKxnc#%PA#Ya}wO*r_mJcN@>iF0ZAbg1&v`-PUHJpY(Oq z7Vi?$y^5Y=E523~-ctsO$Mb!epr-10I|k4A-dCXkEXQKX44Rp`Zh=T?5XQZg%ur<*WxKLPEw63T3`q$^;fU;z}G$=%VsL zrJjq_io|JR8j<8TMP1>0ETmZykMto3LZbz5sHmd^CvB&k+Ejw8|w+WRV+EHBKDpGcO9FcQ01rAYgM1uL;>d zXGBSdjPL6y6;u`N{dnCJGizj$GV$l4P&htm1+h08njPBc!{-AL{Y99Uq^O+K*dvBCOrH)F{ z-kyQ((>)8w-#rOww!4&E>K3?XgmVajg4)KYl*OfGkr>#uZa5CT3tk%t$;EE#7TL7n zuvUxh`@|7LO!X)ZIx?YF75I`(rS?^nz%(rd9isoi7*d*uweM|fMB%3zCsKc*c9|q^ zLmXqNh&>4U16z@Hg4w5TPC?DV)6Y&9AH;gE5Nb(&e~wb zT;HUSEH3e6WfixvK`;}&%yquQ60WJ*t58@YDu!2G0O=LLIIuzbDn%8?2JYP~fgVG_;pm!Hn6S1PIM{58sx+GjjOsbD~685_eph zB>-qetx?5{1ObbksQ=)B*$MWGM3lEWdDzah4QW!el*6=WjQDQ zqyEzKI@*?qCE0&PHcw@ZZQ40}0J~TLyph9ezz^3Zueg7fWoqvIp+I%nBgI`1T+xiNBSr-{ETucvCYfuYds1 zn)NS_u#f+l)ig$3DPr@r<01p(E8DgJ{c#2~Dms=Iez)uJZvCWgO+fi&U~}tfd)&Mm zdkpx39lg+FAg@q`icBpvue~vfD$agPslG zpW|Pm=%~dq7a8g|KHsHmze%Cyf+LD5TkGSq8-fQTLSMM%sdzTmdSlCC-kn9N7}iL zjP!F9-qjB5irsm!MzWRBgR^n~1o?<1%b4c}u$G}z){m#_Jq0HfyzYPk%SoRma&VmYu-rFEj&t8ZpTBLo0OIca>E`#t zC)b6(;mQxR%=J%v=LF4};#w|(d$~a%A7XGix5+aw1x_2)unc=jmW}P6d6O~g1J~z8 z>rKBNz+f$E=f2QBvT0b5*be26^UaT-jlAtpvl;SIAR8yQ?}XGtk?gqJ`RawpO%7wjoM%9UstG@Tab6=;3O+qWTEE6e;Pwggi7$ zmJ9lU3C)95CW>J&FBkFky)m<_c7ShSlFw#2?Qcw$rwge1X!{U*l+Bou&E3raf!iWEfkBpx2f^eH zATHEq^=Gb)wu#6t=|4t@rjjz;A!3z*O;xTtT7t5aj*s<;@&mO$aP@I|H6%J}9 zKOVmy*}Mbk=>ZeX6QHdu>7&v~AO>)3P1p&mM9_tl&fabvZ~oM(&&?-4Kznuv@JY$- zM_}lcv*}Z9Dy1aM)DJxGbtS(7I8-*i^7M=JN1;gHj=lV-N1(q}2IOE|=Gn3Q%mY~K znCu6gxI4O9P3@Px-V^wLSR7y3i%5II&8x(jS615it8Wixo_-K2X7*++sduKiBql`y zqyGS*$+A?PfZp~b>F!_&6-UtrFefw_Y+V1yn!jNMLfToU|S;gG9^jqrWMH_h@F96>> zr6m=&wFVK2e8uD*Zca{2Bjsbz(tSJqA$_x4X3x%}qMNn^Bp%882LjdN}lbqmXtCloF6s*)~n9 z4@L8XZ@yUl*r$1-SYDkR2MDf=BG=-paQ8CYdag%yP{NQThy(m4Rtk^RECF{QTpa(C zst18bxC6Ec+_>3bNx9>@tZ@|+4;M*1EK>eIRXreiJU9r|_hyNf`E4S^h}r(AXhb&T zfb7UfxR3-IcVYNXa-nPK$3E`wVdw4wacPJ@DAFiRU=xmrZJW9T0lDLMWQ2SnZe(3i z1scSR-Vtmm5lgoYTRiB9D*AYb&@)U7$Ng3Gi6S?F14cdb^!(XG!2 zXni_C9x8xUB*!7BhI%pN0v>Z4ErFeXBG6AORPu4Au&I~&bz*31yJd})(la3@%W@oI zPy@4=HFJrnL^vDe3Tv^weg2^xTc%`U;nI&-&>>ww;m#@)h>%!tQq~oHPx%t>K>&>b z8IEx&Bw<8h@GA>ouWviz`!NFG^PjI2>p?kN+ow!{plL!;LP>}f{{)%BF9MrMhXl6L z-ScLyI7kf0iOdzh9XRc24-%fVg}@z_?qs@M*-~6+oN$5`2zAttd0#2>o48TdK~M5u zloA)ahCRTpCHgfl+{_;HmMZZw1M^5=&Zh`b=^S9jNn6}uG$saV5B7V2uK^Ue)3|6^ z_RA!te!6m%6&rUN9As&tN?eBD-twU}Vc;?h8=6kLkTO!+z0eK^k5?*L13%#L$j6l2_YG~Z^w1XhKmj}wL}2RVXn`4`5m|n+mM)S_|ZgZ8;DI6&FOn=TI!(o*?Ex-QS}|?1LdLj7AB2B5_{lKc(KxMF>s1*^}F(J(|#| z+}~@q$$M-kUlG~h7I#Y*%HW?@(Z_@&F?uFA!_&#DJI6)me#TUF zo<#Gcq>vdLM2U_~LFHQhB^{Z%S_>d}z6gY7AWo)*FWP;A<>J65y4?$*@yFD)M8iXz zR|%c@>f7@G2=5P@Ss%9(uv(Sl^;3OtkiX2r0B<#f5er(fL&ku{vXbCjK7V1+43F6Tub@-$_X=|dsyzxAG zm9^5zhsUbe7YWjI7Cc2U8Gbxz-pyXz0SMQiG*gu^Wi|JBixigD7YXsLZIhRY*eQ8F zIeftydmXc%xX2C^nT5{04!4=yR4t#sa7GHBys4TgYZl)ycGil=J&TM~A$YOumlMhb zOirEUC~V$gL$^vQ47z6S6#>Ne!tk06jt*ctEN&m zhKy0mevwMoh}%Kun(1y7cK~ErHcg*cjKpBnbjmRnV&v~skLXUY{T6x%>I7WG{Juk* zyk~yTvvi?E*0*1b8L4Pt_Yo7L$AkdSa&{*B76t`NmyFoI%ry?W5WATdwuA9~zB6B` z7pHnJUzA#KmeO`{e^}|pM*VG*SOCu4Rk-ssRW*C-DCAD>)r98+h7LyMaDjA`u3pkf zN{LQHwl?>4O$I1oS%fTjtSkvGDJ)SMXw>3Vw-crAUOmz#O(Tii5t9dK$glCgA&!XE z5FMiPjJ{z44K~r8HyitJ+_c=N^8^xk3)s{r1u_d;xC3c{U1CN7d5vpQH$Pudt?1pa0Puq7stwwqI1SsuS-Mpw>~tSSU<1i&&8OdE4Z66pt)zIq_fW>8{;nijm=sV8 zL~pEugKgGLzW@C6!t`6vm!;J1Olm}b}7j)AeF9H&_ ztnYdaTey75ksk|GKf&hjpfJIaWb<|lpVPave*ccla27-0BR0&Ey04%7rj5gXO~?jU zhYFJh87U|ULDmfO&5_gt$u{LaKQDDI`a%Z+BsgKq^}tPhc$GQo%Q+6=bui=I?Lh++dR2q~2?v}?%uxhX7V z*QDzLTj_h42l$#J2M#(W^ysua5jm;A~Qajq4$i~ z)Stxuo?Qye``& zsv0r+OPr7e)zU|CY*RBoW6;O^NP7G5a6}RGL|xsOM=W6j&v$X*dPY*~8To(CjulT) z-d>}DA0*~kN+_s?KBgFcrv6M2jo`LQPBrau5~VLI5M-a4spiA166=27V=|N#?!hAO zZWhb4qxdc448Kh&It7H}f_##UyG6uda*$o4q+G|RJN~Zh&)ocBnvcN(ajI|eONIbS zFh>4MQt-NeQV6AV4olY1v}>bEqWQc|h65dPxw9*TxP-P;X1I13gCmN=;QF-h8d-1$ zBZO1pW?8J_V>1;=Shd)vgKe7pkU~ewGN`^`)ZL97>CDZ!cpu?s)4`J4rx*eGS<;25 zvq9C?Kk0>DrN(WnP8x`{?kgMHv`geasoABqC|%;JL5e5>W@1Egdy$NKsiY;Uv?}OZ zoL{8G()84eT~jqBl- z!OG@P+Kt~xXp3c`AoVYmM4^keOxDj#j}*6fGbL)`5G%2g&Wmh8aJIYA|5yb*G4+9J zBZ1aAA~{K*JGt zlu}lu#jvTHv!8{tsg0HP2(le4-3E55H662hBH`u_Y)5C$1 z)s&}Z)1G)kW9oPAS^xW?`=Sp26R9%u=82dBHTizrPvru4!uCi3xq~~!j<#pyn-34Q zO0T{_2q(*PdY8gshrNQ9zyno*_5yfPtRaG+ia!1`o08_FRCsnFrUV-@S_W9A;5JYM zN0`VI(FVo>)JJi&U>^%BqQyWac0Gwh0B4k)Krkdf+dAt;={!L9N4>jCW(QTh8;Y#A znbnd6DvRRJ;rcf)<$P*b!`^&X(7Mbu+kcrdG|`che#zaSN+_9x?exUY+?I1COyC}MTE}_HHE~t z(sCkpij8W+OAog$U7FGmXc%y|n7EQODJI`qZntXB(0axFqZ|A$wVJ79F5mIsl0NrS#Ci4+XY+&{D2_2GtW}uqSLModW8F;j5z#hNP{0!p;F6vb<q2KZ59 zTn}>y+;h>^lerLwiq!*(KPN=Nt#0))i>2i2pRLR0(YwPdejfGx1j9?_d?yPvpL(j- z%=cQwvndOPFi@&8k7{DxlvVy`bA}38yz2Wtd@{xT8!FNh1F5NL75(Ku|8CfC!mp{R z&M9ise>a}>Yieo(S?&Gbnaas5U)M^jNRiWboP}1Dh zcjGwz*%-j9v^{CR`ElssRicRiNMF#8fkZNUNfL)(V!y|;ddF9R+&^ed(>P|E697?M zgKv@w)$f7rm=l0As=fja!U}*#j*HTbklN$OahlG+#4EtYVhvCGGvz;Nm;g~wsXY4$ z+^Wat`EJ)1$h~j^v<_~T3#Qz6fToW@-md*BRmZBLemT==j8Kga`RiWjZ*++mqU~2n zT%S209&^D~0691hzbXI$;>JsAxBkW*oq(lt6i6RhSCtj8I0RVbcb}GCEZHX0R4s`{ z`j`$Nv6a~k0H=jt0UotcTwvU=NhILi^eo3d`oR_`uTB+fK193 z0Gz5dBBIE701vtXv{2DgJpiUIyBU`?QpdfHoBMqL0g{pn;YG9$!iwYECpU&TYapH0 z7V!1sj^7=20dCpuaodIbQ6q3q+Qfv{EY(&3cRG9VY%KwL6#ZG+>k_UdzyD^VM-Bo} zaTm9Fl8~?u-Emxbo3CQK6w|2p4Vqn+^LaA~Pjtwl=LJyDfU43~+XtXappF5msOeA7 zKvw4d4X}A?$!Ubw3GzpfdzEx)cxMo_J!YoA0J)o&tFP(0Q3*#t_ASS2V|XoGtVAWu zl#yW8=v`l3zN!VCMmf^(MSJ`Joa&iFPs9Asd=CW4mlS{;OtS0%z_JGx}!DuaY(>0Pf{4LuU3rzJpHT7PWR zM&H3yKdt--)L6wDUiUNl9uZ~#0IADtMRKP=eEz)H%(Ey zBy(V^(Njvl*n__3iu(ET?9~DIQSNu&rpX$&&K&RrFX?kp_1`Wi4J-r5Wx}p*LV{NU zNNFA7oUU=G97$4&@sj;5yOHLGBT(+C&$)HShy+a&H0m zLe;Lvei7)#ZSGgv*8ngg<7evl_${={FpPAkvgP0{^J<4)kG~K@JCOeU49KA-?t9^% z0Bo{G)AAkZ;ai&C`6I07f2#?_Mjc_rn{vi0f8Gzh+DqFmV$w4h7T{p$9uXq@tS|IB zplh<zUh*^)IC|JLPCOOBA`<;gyk9N zIR#SjG$h4*KMGkP>l=HEYR&KU%?n1$N0>>PEAAN#H0c1m5S6tAWJl8#bc^+&b0)q%9oB5Z00T z=s5lenL8DEp1xO>Kcug1kNpg2)kr3x(Lsv8BPnBooX-d8yht!IAXS_D`Y@>_=mn;E zq@#O)yp}m^1mW2s>##IJlx^4y%1GNZLTSHIj=9?)G+z1{$XMGyJ;G$;!+%1FjHa2T zPj^V1M%E|zFz%)E3kH`SspCK!tVZkDV3a3B&Vd&|B;7MSk|vN;)ZvLc>yHg6)h5_f zwkJ$6e4>IPjQuY{`rpKvpJy{S5@zu)8Wmo3TpA9^Tg zpj)^Wy2Vqnv13;Lf9;%CSX0@%hv_xaOMn0&APGg9jD#XJlqezrlqyIGhztq{2qV3O zgkGhHlmw)TQb!ny^iZUufQmqZ^dTT9pvc+IIT!yq_vh~1?u-5GXRr0F=Ueahy}y8s z)Gr=38KTyr02R!@yPo|#?J&2k)=xmI6k%wH#$S#3dgGAgpud4pJ$ZFJ5;_6QJ$oyA z)Bgl|HX}QX#C+5O-io+gQE*p&e5q${Ag=(}#vSI8n{?+gt|znROS~m(BxbL(qRO~G z%bv(t4=&)kejdK~<6La+`UY^leQ~(@RC}i>%h{-PY7t-c7@K<)p0`b>9R1OM4zCrf$8ZVN!mEQg(LdN| z7*P`IG%2Pra@~NQa7)OjrA`d6$EjqmTMG!RT17xXH({o;sHNVE&wq^eT0YAa)F^Zj z`1%VJ?o>qB&&g~l$=PcKt16y9XAmk_2&lprQ|P+(hZU-~3AM|w)Nq7Kjid$;cd|mV z4jYNlJ#)`Ij@!-LjV%>eru>1g6QxFixqyLhQ=Fzf<3Qd$OBbXuvFK1hUZB=`fL@;f zvcG~!W?e}GNE79eb4S}9LV7NeT|s8MG~vSI&f(m(j1xP^^Ji9y#^VN3*8C(C^H=SG zGy6BU#2+yU>DRMOOBg<69FB%;1I)9oMZFEL@~bVZgLkcc@-MKw8I_@yR1yper)l+D(gNyEJJV zy>1Pfp(a~ThG>q@4YZc-`ri|I5WTdas5?eUpy?Fvyp{rm$PyY}ua@O%H!y+q7DoBK~op~&y=KOs6Tvn$kj<&jrWlbt{Iull;Ev=~XN zY~t1XzeAlU4-&+KExkAw4P8t1mpMbsBNiM+K3{HU`~l1o^&L?}JFs`3>dMKly0V>J z6hy!8aWVTw?vb6hfVqI}mqQ1bFdl5NIDwpVm*!qa9!#1>0HXcdeEK>myC((!N(~V{ zd|mRa6S<5w6v7&}5CVvO{s)*qFuX|)P39Ojr8h+S(b(e(Vlj=WEbZz~q)v0(N5XN>`Ab((U?lHX zi)Z_VD*613@6Zkee&tyLEx?UQo4}!o2|jTuk94cl62iS?={5)fnUHR5AE=9?ipCa`|+_)V&mcmc! zCrD9HbUuQ|+2mx25fGk~c3#j_c(*=X6%7;c;^7K1KBO^$L1G+TDQ|-Bx1bSs?I0$h$eyt`>c(iiGU2C>*VJ8DG(S z$;;SJs9ynVuLNon62HmE?#T{3E;7BxbWEp5h+gyfI_&$`PK(ypK7+}v+X)}Mh3lbq z42%mV`PXLR1NqozJ2``hrz?2ei_5z99;|4kzxY{4FT7fcIeE(5*kqd=l0!*07LrJG z7aqFOQO|rPWBVRWGY~fJ%~dQTarb)%Du#LbE1oJ;1zC8iJVho~H5)n;tvyVp2_)Xb z`*#$$4~-+sJDUcwXbN$aWZ^ce~QxkBruDZuPB?aL~Bp@fYJW zl9ySQ?a(&8^_vjZ_}y(;SVr@V=(HyYl+6Pk2Wl$^i5L+Qj}h;n8O&6^RyA&2ET84! z_M+59$-7O=+tw~tOIh2x^cKjxrfUJ(9|3tLFz6Am{-4bbZi;i??4ghwVi^^vS$$)4 zzvhTiu_v6Ps$+AfB*8u|1Yd>?>$z5#W^db*jN0bPlS6P4(qr3+v0FMh9MmjRnnwXV z_goo}*m&)WpKMLJC`4*`^bcrINA9KK5J0pryPPHH#@WX>H2_ zoo+OC5E=sVvIt0+J>nW~TH)7B3FDUWhAvyamprpLQyZH`EZ(de{4QKr(z&jDp(O2W z$rjPXUZKC=Ag;|cw4JptM$a(-JMH1p*$a+)mm8mJ6rNQa8df;SJrs}_*ZV6ZMurb^ z1M{}1a$07?d{R^U4i`hYS__4zBxJsgg^_hRjx|*^k!UF5en14_xuk0easC%B6bL8_ zyGu~Q@=)T~1a>$l$tI&rE}90xT^^VL+Sr@45JH%NK?v^qN^yGvo4g6*ZYTiaNq0o9 z5b%h#J7So7`E54+Ldw#i$$oveGn&}Kacmw?mMlfx>E|_bbxHa3m2V%GS`tS0;8j|s zM^j-j+~LfUCGAp2cwH|aQ>I$;TRz25{JJCFwz~xvhgx-0hKx;`2$FY$kCQXEvrB^(mvMcA4D1l#PImH&(#+g8@T#(8< zViUg1bp~f&6U7=PFQ=vT%)^WCw>f;-T3*C`l6j7<=>|a?8lB}C zl)Yxfr8R%uQ>AL!+rK>Tp??xPFHBWw5O`|p8HM5G;fZ~zlAY_*$8a%Va0RtU(l2Yx zre?(NJhm(A9pnC8e83Q?8gr<+pGiJ116N8Tzwq>d?7ckGt8@0Ax-95e`>sN)#>-7CF?VMds+HgOvV@kBo**lzi7)L5Wh z%_JpSH*9FwrQB>l=TvZ@3jC^L5%p7(g5cRw0RI`?w>MRvVD1|B%s1C0!prIA#A3)j zjosS`LT|xPh1ZfIa1Qkc80V14j^fbcbm}WB_(Gf$w)7=R=kUgMTla6&bMNYa0Ja%< zzjMw}2xTS8`CGEXX}S7|b>SI^wmRRT;k4`F=p6W$kfIYF4rz4aV@+U>yYq1boNn8plL2nTMAXRCWU;XQ41Cqj$dS_0y|hBrJQKTIt& z)-r9>opH(=pLB@aOYe}_J%0(kzT*3=T%o}NLGC+DTjV zER~AQYj_Fn)#-?2(BGpv#(%?uqRDKLu-8FX@~Qy;(CKZJ=QHo2Hz4c08SQ)tqQ;0G zv3e#4!M6*aGAs%*yH4-YZa;NDv#%+5|JKl>o`TD*r3kr7k+9SMZCYv{HI7}p=dFw}8hGTwc8rSS_>gDpEyQ~RH`wR_)rl&UI+K_ehI>+% z82x-v!vfxNWE;=#n>(=~r#~(w-nFv3wdH@lsNxJ9 zOP-{rJyI1)e;~D5rX1wWtn3blR`k=?wpRah{x)}3VvsiOrkMNl5UCr%?;Li6Ke?by zn*WMeJ}uX1F*3S)Eb|-%ORq|UA{=uhx&qFb9LH6s2@Pv6l+r!q^{Sk<q2e5sBHy)85~5j5B^?ct|-mDX|+>J8}D6xY2mNxq4u3ETS#Ub{IygeorKY9j(0u z$J(^?k91TB3eR^(R|;@G#Y^0Vtcfhl5DGW$5_C)h?uZ#vMfu|gr4ZGnA1hmAN4n=O z{byQZ$xWuVsku7AGS83WGn)Vntd4vW!fGA1Eij32+k*nbvj0k7oRzX%_-Iz`Q}hx0 zzr^$=ZUC6RPw42F|2JRl{U11Oe>{@-;2$_WCl!5~oRYR_Omop*4&=ve!(4w%J#k4N zRD@*v_Wa?p{qo{RS&cTr+Pnb$_n0mV_(}7VZN!2DF5*IV{hMI4qO-?sun5B;?Dgwj zqza(88_e7NIiiw%IX1<`YK}Q{ROo*A$6=-N^`56{MaoXO>a~UdQ2J9WkYQ*0AINQ> zD|mOS3zwp(K>pXa0=b5C438UcMOnO*|Bt{*06PcD0#Ny(XO~0Gzol`GC}6Oad7Y`| z-+7k$UO>oYu-Dg`=KtlS)BS?Y|Nr{`4qXghc|2YtUf9oxsB41Pc~Hf?EjgEDphKA-Fq4aCdi?;BLX){awy| zZaL5Q|Hp4;cXp<`tEZ}~y1K4vf|cLOJVz%*M?gS$F8fAO6#)SWgn)q90(=I)!=)Z^ z3;!W)CLy6LDEb*(firLfqvQM>oxYBQ`?CbLQhe9sld~yAdkQ zGfv0GB$O|KZr1M}#Uu&`pW_tzP+5lWi%EHjo3E(axfXxWR6*5Aqa20~t*rRd7iYd3 z!dSaJ8V7MRW!fI0qQ)Wuze#(n2ft*L!&XFuU~>hRVJ21zYd9OX|` zQPaS33GiQYi?D<0)=Yg8dn zM6hOmj@y4D=X3r5f^6FWhms#tPAlb1?-#x<@0DCh}cc=%X& z-x8gi@9do&hq1(RzE?ICxRKr4I6e~&bhJJq7Gzt#ks^sZu2fN)F}Hr}XFmVIHx92b z{bLJ1Al9u=S6=huQ0BGDV%!p<8jH@04~z$raK?TxR+lwVR77|MzXl>82AUxt!>JXJvey9mNBEsY)Ysaz~Atn39{glYaNAqc;I zy3I~Q^;Z!Gb72~FMP(`pYdd2qJ~j?E4jK`3Dk>_loso&4s-*Pa)#1N{X+AqR*a)(- zJ3BkGIdijF+nKU+zJC3hor8;=i;ERrg4G^s<)H7vYGqIRuSWjej-;`@p`DqHgPFAz z)l<9r2G))a!Zb8bg#PpQuYMZ4nEjWMmHpqZ1%E;Irzh;3Y#i+WX&YV@{B&1P+04b* zLPOHb63!kt4G|t50q|et|36RuOYwhds{gkpzW~qw*8HC*|F`CQdt*BZYfCsu2a*3u z=I_e?`|$6IVD_gs{~u2Li_L%Ch4Wbi9nAh8nTen$izZ(pAc!K!N{YR6LEKA4bJvz} zeC)0=lCN6#fDz3cCwb6fP`CQ{3A6Yh7%yeAj0Q^-y%WE;p%c{30i2|uv zeEg7sXlNR#9ZtAH$4&ilbTe`LkJo8#!{Za>M*YcImuFk-ZuHkYxQvWQSBf9khgoyLM#}+Rl z6R1%-H|QVKsNnU_u!6jS|9hMzdE*D^WUEU4qX7`SzANfK`Xq|%swj#sS**g8^^XRE zyzzmJNdJdWBRv&L*3@@=m4CjMD7xR`KYI%D(ZP!ZjGDg-Vf-g+s8GZY|JlDj;s3LZNI<6ZKUpG~F@>BXdPW*c6Y|eC;A|E8|B0=lip7Sn{$kZTVjp3*iBJ>bmno#1K@DGFNS_fFN9 zc_!n!G(Vs6{dQ|KTTMcuJ<25i?C0mzbi@Et_vY2Rs zwY9Y~9?d{hQQgkZvudx~>g}sFm=d??kV7s)bNcGt8{!yz6z;2P%=+v`fgwO?!T z+hn0u{Lb#~!pqOI6=p@Ek=D-W$PWVeK>QfW`z@JmKfJeZ7@2-^D&!_?1EuKHxsY%v z?}Fykz&kR+KaeO_ankLYZx;^pbnjM)w!^L64P9@>(+~c9Y!7%o2UCoZ*WtXywPYC1 zln8Wv(GC-+VBhKFC4azyF|!Rc_N_@lJ9gRF@7#8Vx8!#MvfoxDnvU7RvKwQR8neI$ z$Dv%p1`l5a+=JBCdp(rcPVzoo+0$W@54+O{+h$wA3k6d;Qd4;5bT{VE2dl@|LcWabNL^>||NjzrX7{pYrmQf)IBKO-$`Q<}`%$YAE8EhYqDIZ7I zgzt{pw;>N}kWV%{KT@(FZ3Mpf#?eH+?+2byeO{@-#U=vi1G^5)Am6$5bGmJnNRijG zLcvV--4QRgOS>sfcaK)uLr3cxvGw`;s9`oS!>G*$3qhe?zz|zqo#LKAX4^M1&`z$S z(6V6XjE90>zi8!pTj{1FBO2OU{oI*;sZ*@9imW1kHPG~f-etpRSc*owj}?ToQa&?# zcB~;m`qtEpNF1rsX&`sKffW_un>`GDEX}x-9|xMjZ=*Cg!?^mcrQKY2_{Z?_)pZzE z))^Q8G#oZShlleQ0+t`-;b!qwBm#iIYI`hqdsp|-)wPpZC+aQuxPy&#rpDH=ZZ(A2 zopAYj*vnJ1;%pwzTDm7=EdFn*{P<KXY8Z znHlz++{NdX!Ui9S-W*r)7)w(>Ir+gF!)!%Ndl}-ir*6$}DUp$n zxhO$AMs&t>Z#OJ_>5_gVauQLXS=o2b8BfM-61HjEMPlkQv+k3vps-_AyFuus+XbUc zA9}r+BH0i{DVDy+nxvK$L2%h@KU=|{P0Ls^c`=^8>Q z&TIy$#<}8P`eJ5gix|aBuV(FaJ2yVJcu~b;&;cCAqua7izx{Nxt>mRi zD)o3#-MsJ1)W+Gyaxm5W;CM6Tb^q}rg>*RShFp(x)9DM{>|^+?DV=8k*0$?xn8=Pe zulR0x+Bpk*{wENvUX@gE&b+Q-NmfA_7xp_p9INGyw`O+ zkM$z>BOgfpaq02a%dGbs9h)B4x3~2g5+|cD&)+Bp0-mdQ>2ID4UnAw`TmI&2#g7gT zn_dt3zon69lsr$O+5EU@B_aNRR+dpIBJK4&6ApT>)hrI`$Z;=5ZpLWf?H2Y^SN5V_S&-Dl8<4DQC$?m?^}Afs9wavC*BF?z}lQ@JaDuM z2@n@sQnrpU-Vt^C&W%oK0%hbJ0CTEcM5o_%#0s3OYK!{Zj0B3Thajh1dHD4DqF|&D zx$6hv-un_Yv=AICQ@OA!Uu_Xhf(8>f+t*rfoA?tAWIxSb!wrA?+^O~Bg>_Ml^6W3`C9TlM-ciLPy>$Y>OoWq`~$Ri9w3-A6J4bpvam?67!l$FPka3CBbfJ{kZCG zvxpjdOeGkxeWJ0?#b1jOOK?b1N!AFT4sdI~`Bd*zh|vUWj@NNDb6t;;0YAcpG`LMN z>=IB-H&E7~Vhs6A=}Rrn8uI*HvL=Pw^ey^^4+*BpYmiG~t{7C5Q-aaB!t6SLY_Kp1OjyZEt3XBZ>AYdAz@t~N zF~&F;C|CydBqt?(;uJ*_i=saK*mM$GWOTH6RMdPkQS6k9Y0tZex+D7n8mMfdz6BHa z(Nhu#d3J~p;o8D+rOHn}l?CxUqvQsiF_a4yY>J`fA9!6ldu?*lpHYS-Xu~Jt=cfWWphPNqOwwz`L&-CLG8L2VfCUVhf+q9w-?SWub$~qO#SFjKh`3$RkF+Myf zUwq}*>3sW+-D6u``#T+a2mrv;CPHaK7Zh5HnSEv>0Tt7i2r`Kwr_1g|*85bFtrPZL z7rGIfhPta5B%za#GWy^Jw^~ZhOCHX$)AWiJ-Q4|NR6T?!P!mberysZGI;Tmhq&I0% zE(s6gko#!nXHnSq;)@A49Ob@|;TdmrRTx}OD5wy|JqcT6v}mx4et#|7X26HU;NN}5 zJBHk?VBdy~)o!Nk_5vkFHnoij{mYbNlBw4wn;$3pOC4*)N7R?s*@yYO?;mhDl zjN!qsFWtAWX9Got>;0L#Rz#*%-;N#+1iH83#NTas4Rk3V0Uz%Vy$%mq3j3am!Gzn z5g#ZG6c<>vhk?Rg1G77UVhN%6{tT;ekhLi-nb*LHgy0OYGChFfd_8g0Wqbtrtu1nqSK7TZKCCu80Q0d#~e7_jps}CXgcr3!e=6gpu+w zE89XO2JgN@IO1l6ZFZnu8r(+*R##<{1N5O^UPZI*bPM+(p(C98Y@&)BA$nPB-1^Ln zZ$ciS=_>~H`uOi-&`n&_H+=vdZI&k42`|LNq?tNVFuY1AE28Xvn3gtPMTtyz#6Dme zN4OHbIL{bLsEYc?*=zv*YjPoanp`H*zl1+cE`H>G#CwmWWZ30&dvh8Jp+^M1IJP)j z#P3Z<*|Tp7l0`>F6EIe=KIc$dxw}Yz7N1_1o3|4ys4nTn2(Sc%gb!lpRprIkeNlLbINv|P7nZN858v725Jw_| zR6&}ccN&x}14zE~+0E0IfwWlS6c~9kbOHO^B!yBv5?5%{uU2V!s9)j)fC8z4K;b1F z41Pa@bUo=(D%?ZZ?rK#T1~ip1IgZ7a&AGS<$p0`GL}w^o;l%R*8-Zzi0bgbDd|!on zYGj1M)%!cYW0-dSo2lr~8%dYnL>uU>1gE4XA|R{&7q&RBYPnQ}`=xt>Wi)qAbsx`l z*|unmxVQ#2v7MN*gk$;x{a1nW1-uytB^iqqkXiBC1QqJXo37&wC!p&4 zcCdZ;?E~)9J`;L4V=_~&Qg*K~V3UM4pq>#OG96+9z$RuKestHTZepZ6y_k6Dk||2Q zy_6xcrGphPr5a$i*Y;ukL0$jUrt*i{(3*`0S9k#7`&&4hf0pY`yu$ge2>`wVmg;w% zRTg^;T2_!uNHK=lm|$^iw@i|^2K)B{%fo&LWcVQrd}b3TYkTE%-65tdekI=1t$>Oc zrm`3`ms%o8;cg&JEl72@M$($Zjm;q=mf1Rw+&uu`#@x&ED+!A1`3z_N-m;(S>4*gO z^;-epLTNviqqx9&0ivIj^r#A7Th7ZqR-I5sKNQCfh2RBGb^Bv}uT%aa$qb89CvX48 zFz?59$lX_r0*m61qY&}-Fl+#Gn@}GP?GmF73&`thqG02Bq4oI-50IUHuYrYhml^H3 zD6w|M=cr-&D9WlwU^NS0L{nHD9wp*y@|EAIbtU1iC<#BFW>TE-Zt`;c62DcyZ7Y)E z$kPGNH;@fvj9d;hl!zvQ`)`RMs|K!8x|sqc2Vd`I%tEWWZ^*`;O?_wHhQdBGo0BSk z*)|;TTCSW&_S`{0+6e}9qP|TiJf^VugL?Qfgf^rlwn{nm1j-MkR7Y(qAV1_dbQ*BV z&@1&sbSmi8t2ev}t!jy>TUixJ%YI%EobmRqC@NqEa+TGQfeD{T3zePvYNc)+3E(ng zdy?5N$OI`4G3ZG(>Ofzn#lIB_;(Q?aA=A^&**EBU8@9v!Y5+* zZeYSTqWYx_Wh(NnBxFCU)lmv$QRxyhW?w!mecW4TKY0<3tLbi$KjoZ(s!G!JDpY!% zni%RFzmQB%!u}< zO=gjMkrV&931NbzUO3vlX#Ls(v{zndHH7BaMVHe&i!~-#JlGf6t0to+bD;Dg@RWT^ zHwHgO9Y2Dm-zBhrS3zXmC#x%rvRVFjuwXl}zi(Ynus0Bs9Po7yCc}5eVKZA02aid< zLqnAACV|S>7+m<^*gxb@M^aChx?u{Tt|aKU-~>pB8XBdKYLDsR!FrzudQ%fqgQzR0 z6F7guG_bMk@yFEUv0@ub6XLeSb(bp7~uy5hbIm^=r{ypi}$ zuQXsxywDAPwnDs;6lE-u5EBW3W{Qq}AdFd?E)8~)(puntY^_D_inybjsjk`xbk2CsGcb1+ zjq*NJRByeJ&@JJ{E$1e$=-NZP9%Z}nsZzr_#K*E)hX>ZyH42yy={@AMe_&jzeT>1I z#ZsCro4*OZL^me<(BKt=BGYHeN981%r4aLSk@hBp55-XZ2uqb>UuIOSRPVx<`4HVv z2FEy`5g&6bF#Ev$$|D={gXr=uEiz4`a%=oe_Ag+Ns3SZAt+H_cYcg2$J)Y=yF{(D| zBU%oE7rsoCs6)R9roGBIQXptf`@esiF^pwN-YXo<*8i4+6yNj8?$Bd8~c@;sZO zgDFmNwkMva0_HOMc6F7~*k*%7pJVpD&Qectf>H-HEA$zEn(gn<3mNE@j7SuHTeejc z-)xWlx7 zYlSuFfi`gCZ3%{-JWXJvECkhXpcA?i&BpuZ0HY>XBY?IMPCjy-p-`G~k8Fl=koI4mS z&zPWbLaY8`%8N=Hw&yHx7xo^x?g6Fn;o_%1Jks-C5+O5>(L0uZUvFjOxE?R1Z|&^t z6MjdCE!IRczgehl&Eb!*6PL!|x#R{{ynKFRg59YXwb0mCkl%u_Q`q)&3gOB@ zjG=`Uq>SQ_|^CGXw(FdnmZnRGg~e-z>r!FkxyLQRF2=QBR_<;PzDNsB&i zOT+UyuSsBu=enq=G`R_m9Q_l>K_CGSKSB0i<%J~D!Fnj*=X!TXHG?n)f-HKLegP(<|?D%`GD?)PHIC_sxHSD=pMGkpSB_HTW9;r4Q%UGd{#bj@Wa^ z#h1MWGADC#NQAJ~s1!M2ABR+@Nb`o;`%ZxzhIIJI1v|3;1LTSog%1P`cIqqIy+D8p z+gUb`WQsCN-`dGQppD47${91WDhxhe{&RE(!LtgS6s$iWw6|@XEO5T6`%)eYP?@Y8 z5V4pp$*gcbJnp7UmyRHxp(C_?iZw&XjaEB?J*Tx)wyC&6x@IfQ#|>e^ab4kL@jZd8 z8qnbLF{joasQ+b=06p@>-ooZJ76q8GpVAn>UXO*=Y^ZAIX!;6;=1>>;mQ|}N=T~u) z;DSy2^Wf+Vn9xDZ8QfcCPIa8rC<0Mktv$jcFTd9^USOAlL|Q%Y{F5f zs=pAZ-J*K7%IfO+;PFJ$v_zeYvUq5kD$UQ^c)3EjUk~zmkVB|7EB08*-SZOnB(+$w zw4+fDN4}V@9};TnUc4M+6;kUTiukSkF}e$@nwxZQNoV|}T!<7eKp?>K8$iXI%$)Sk zK;l|C=yK7`8jcaE_1=BHJXqMin6p;Wy`7zMmtMI$9ah4I+?6n+J32aU4_bScGn4)W zex39&kLSonkDaDnHguTzG14V)H{S1CD@g=mvBu0oLk(JG;E|-iu*L{JL_bCzRNaaA zUCgkKx=3TyxZgq9il4596OlhD@zv+b@E^Wu{?x#>&|LR=f4Y_-yx^B&z5-<|TZ$0% z3rMCTNEo((fOUv!|#jfuS{^(Eqd|wnf?|wSC{Y{=t z7K4z*Mk@1jpWlhE89pVs@tZ^&{2S`OhLnvTvNFCh2oyIt^Txt{?trJk=}ppz0L$}V zz1U4^4bcmDMQif(!p|b-y$X9-0iL_jh z@73#?=sYgEa<{8w_^*XvWuFZDPFVZ-av;J@bd77<_G4&jg9@q0Nx?!n6fppmmQGTC zCbhhmCZsj&&dL1NZ{_1yWXJOq^YqDGURuL66NR0$LC$2Zn{lMq4>HDWE$x6$z(Wx3_KCs{~LIY`vq2D6&kGoyDbSLpS9KN~>78^7xf&wDfdjAp_3_g6}KDpY$^m~A9E%h&sp z>ESghD84T?lNosEnVBrN$-t50b3fWG z7zsE1{%mExDT#C#aa2-rvYMJ&^zi3Mtms^oZ0YL)z%I*CXaiGP85~=QJA(&>#|~9! z;@EZ5J`{c0-f&Qpg2Me$_!RPv1o4?zyCcrK!Di6!jixi@$lRLntM%6%7IB2dGjUCJ zyC)9iOrT_oXIV&d)}fbkGJMx>_U6(>gi<*TEq+$^9GkfqP_S;L5Ws~;M8%#qt0zL zyLr;)utIXY>3fZ)Qo043N77+twTNECcqZKa`pdjz3Z3*cuf7r|Vt%<8(+o;! zxXE4N1-7P{4>KT_Bdz621$B9QUFc zdkgr*3gL(6gEyE&%Edmdma5;*nirpQ^{wsx%M|E&0f2NXT%|AF><&SqG``xQ$J(OR zl%FtWTr9AebC{c@h{Y_1S2up_Q=iPR3!~N9MjqUO+|0B)&0)7J{DZikgl+->NUUTT3yJO^s?V8<_EDad1%y6$9 zoS4T6$}7Ec2Uu1ML0d zYwJ-x%uYCl)pXCyp?})zhlMz&@l6)FmBbfo8mJr6E$fB2Aot*xa4UvhbJxkOPa&1r z)U@dDVS)rYx^8cCedhE*v)Qw8m>82%WS&UASfiZYc33koAmEwqV+#q0rOt$T`h}2F zj^pkmG%W$5f_3e`25s|0GrPMwF0xowazByGjD$N30#(Rm?CpkHU822>XYqv&c&ymR z3~A-&+e-S!bB!#P;D8jo*D-g4?GIs2wlntmEk24oMe;lpM{K8X!_UiEU+Ymeb4`5rkObK25alsVR5kw6QqE z_wfKL)Orao%2YP0=Tt)UOSQYx^hIpbX5$1uEzaO{d_dC7*at1V<9nfxacwD;{K8bm z$Mqso6#l=Av2ImKuAeX2yTskJrWx`xx-#t+ztxX4eRSERy2C+jjl?W>+xeE;Ki19t zF$E(gXR}#~CBV(2EJKx8Jiq%iNJlQs>%-eP&qsF!Ne-EX6CSYb;kEH4aX_uEpVS?j z?FkP>zH&r&@3=iBbXr)-Ic{7dP$6NckA8kGE}uEK^v!zgdq}8+;H#a73tD-yYf!Z^ z3^;uHf~SXtUG7qQ*JM%SR<>PYJz6(gp{>9Lwsu@Iyo;xwHi@1Um+I;N(6t1JE0{|Y zISr+IsORheD>F724Rgyw+&?QOiR3LVef0bo#4siFB>$8IOVKUeM%T(>vFRocH_cK5 ze|C41RHVLkcmh#;)7=JpzP0-r*>+Yan;blsLFNYTk*#6mnGPmx)Y@7h+csSfTIUfp zETe4upi;cqYjJ2pW4OXnkX$9o+7i!PmQx24t!?QbOD=EWE@O0hZd}nHGwY@yUF%Ul zx(+rO+9Prh-Pl96+J7CX??jI2R*Z!kviip_;Xfjq_=-}0yvdHth{;`uIlx%4O%BGJ z`OXbErzr0}Vs5MOApS9YCxmh#d<9Lo-T=6x0-CR>bGSpA`|s`-@1WA0qF2Lhb`V%J z>@Hda7R`hd*R&-=k&_>BF=KviR1nmBYb9uKDdG?#>%@jRYL!sSVayLcZ938am`F|E zd2(>FQaj|N{__Q2k0}Ai+UGgr`a6x}z8CkhX*L3uU0W4;CvW6o*Q~djYI^x2J)YMW z2~)JEmo__VD)wTrZeuG-cZ~R62d7uS>>1kaqv6@LALy49F`ND+L);K1+O?=_s0XWG z!~D|W>9mTos;dhj1D?yN>z{KPDd=L9ZYfxm;FLzY6bsqJGxeNWcxbmLT)0k&g1>(F z{zUYyEnTR&o4tA4edypW{~qXNMe`o29w+1H^e6G-U?1bgSY<;)6V7lkbpC`3h%uF@ zO}zvR`-S2d5Ma8=d%_NTpJsC5hqIkWw`++pb#69rq)A3z)vDJY;Br@VDpYGDXDDcS zL;Uy^&tppC+X0p&d}4kZ2${EN4B=rM%SQM*!oBsZ0eU*dtaFT>&PkPy!QL>U^yA?PVie-yMB=pnGvIK&5g(70%>1CL zijpR)b>NjTq?Q0*s;}VKh_Mo-fMVu1mPCLW)Qm554rJo`%%eXt_5VnYa>F>p%?+fX z#Zufo5CLDSI)?&6J3NB$K9PhE58#!F3!-=rDcGC)m1#<{X*d3m>4K;&Mw$urNgpa& zv4^*v(!oU2we7{`o9@a-J@7gdk8+1UiE%sk&=7&$7QVY{waAqk9JaEn)ZufMr z8fRbCa#(xC|DY{L4pYAA27|8dMXYs1I1cVWVG@zWoTtI0WGgb?Vdklc=)71(z3HfP zZN_sJUt#;c9To_-=8Dt$V%!&V^J~MxQ)ArFWXaUn(L{)6fqlv2k45}o)DPD3x=kCU z6?XE!n&(Q&@@lfv&QSlzvkMz)y58Ic>kt7NQSUvDP~9SaEfJ)l^)z*tMeYgjxJQ@S z;7Yn2ti^xR^;CQKQ{&8}$`4gnC!8nw;Sj$RlZJsp)NFl;!4I=*-m5hit+uUmA=He% zbw*?R&0uv}RN6gM5411t$w*#SZO~bgG--Tm;~kVru+y;n`o>4@K=CHcen>no?59#O zq?oDD+)4?%XyKr_{Gob?>cq`q?6=A`@8*y~^neBS)P}WIoWCc9H#`jvK&}u!?HNmg zJjrz=6N|k|oZ!(CgC@0nUhLI44Cc^koxy=8OC?$F_EFM`jOQyU6+;Kj=dn-eS4+Z~ zxk2lr(V=I4M2{us__`19#dY9YZ+80I%8TKExQmM4d9@lAQvwBioCds^IAlj(nNM#$ zS~nlmw^m)SZ+=7RJ{`(411Lc*~0bbZ*gmMikLb{CnLNIk#U z;@zjn%P6SytqLZWac28ul4BC0@wu)3(yGh7!naEmH**Sru!rgUlZSH^9rJga69*p1 zLZ|KND&3$1i7iSI{LBW%0#ktSCS8p(43r*7gyN2mI7VGV+i_c-UwQ^j(ma*X(Bp|Y zI=U28Cw9z;NKjSgkD2+t`7k`=jI!`qr5xK@_F_pFFs4ApJ@2gP+J+Cj0ZF0A2&z}@ z?YtoxOiCE~LTYZi3+oAMcWpU62e@91UejNIRuC3{*OqiMuVDRfx-_ia&nMvSAnxA$@0rD$Q~jEV#^r8mCpt6Lp91xa(km0 zZdc7>FbI{1oK0x3LY|q5bNp)MwpCVsie;s_0~j%zE2XkoShUNk=qeMh4cbREAHChAy?iIk zmB>zZ|A!P%uibw3On?5+9tA;-Bn@Zaeh1)2AJ*ODsUj1ikG`6AA5x~6T` zVKsOztQ4tO-~ztc=boG!$emOgo3;&>?qa*b+yp#QyDjz)N(4?L^& zhLxnF-GyDK9V(z@la(W87BKW5l1P_*zwOMd-ZpL1c#t-O1yLEWY}rt4(x0^ z8!$6lxJaGx(JZV7qjjvf?Np3z52ta_4iXE^&nXWS_Y0FybaZMhSynXIHTKZUFYX2{ z#7(k;e`TO)zrJ|?HKKxCUWqW=Y3EGJX{Z;#{a&-wERY%WoKO8XkEctL(O0Q~XB1{C z+KA6n7-TE_o22#iR=6;}_iKk;*oMD|S4Ov)iI*;7j!NrP`%kyc^^e05(v+OlC>N=+_`#sk{&?DYi#k*b6`AMr;xg zPfuK;8ZpfiWShrBZC$+kqA;D0Irhzz{%SM({DPmCd$-r`Zfr|f&evaxbjUeP8n$`x+gJCBRzj~C7o2R%S|LVbWP zBSvRNmhN$yz{c>(Caw8(wUV=K$o1}%OEnD=je8a0WQgrHvClk^WB3cB8kn}CX_=n{ zVO#pv1f2_cXR6DwH!^A^?iPr)EAqL?9{C*15`zE>%&_)#4V$!Q^%#Kod0zIf zQFoMYO%Y8b<$Vo~gx0=}fGyU$$QgcCdO(Am4*A{h9pWh3iOs*<236o3;QW!nEbpuY zt`YvBz4lDU*afb!4RCX%Vm$hruM>Qfe!Op@n(y8c(H--v*RwWOqa-@m4^f6erj9Oe zZk_9{$EhcuxjuWW**yGCcP!dai*1ac`-$i^_;lxFT;^)9yL=nht^`%SxBs1;KY2}M z$(4|o=xL~US!$#8_BT(|4wDQ%w% zaM7suD1X}@O(Om(G?!#Tx2lQme$j*ql!s#wOcr4({T--l9`bBSDB*Cg(qV?t)5$o~ za(ku?^q?W+z2?R=kPfn85<)g^PBI0bY7=^fbxmOxokzJ>hnl`?)bsqBArhAAD4tR6 zZr}$YYaJ#Wx&dfLx3uGTpQ4K`6{pIf=vRjuoipqEgfcs{s!OEvsMS z3x{4d_Lg9;D(C7?E~#0DBZW$H24){_nYLx6-(B_w z8W$c&4{E{JhUevZ;fjh%F^UUx8qxaEG-&Q2u;Tm5@a?^U)LK^xAC`_XV%5$zvjSCF z`S40DB;-krFUo;a)FV^agVGa$Nh2F=)v)Q!75bD~s`T5=EwHD^jrEi!_jvHATaku3 z-wq6bvjLL6`KD~`*oPl(;bSF>SnAp#+@?oA?OfIPvPCOfQ080(ljg0HAw<5&uftkS zDfg&|KdLO>CAH0CYVX9sf1Rx>z*%WV>Q0=l?)a78PSqQ4=j0gyx5_<)T5ncgDe1am z9f0dN%xX!_N1zTIn+yjPDM3Jee0@eEML$|(!vNLerP(TG;kr^@;nLa(lNVL_w;y@) zWfXnXjYE*j0c_&g+773MzT0CMZxg?zeQ{a=9*by2G2@2q-LeT5fsFbPv#<0+@Zd{M zkFYMaV&ck6H|B-*wxx7htoLPJgwp5p&=>pEX+pyHY^Mjf3Az1Vt|x3F$B`R}xdVn$ zM$KIk9f#YlM=l*(oFAZ~*Y--CeUFi7NAO?*ex`_#pBx-y(1S-@ws_$q^gA&CC<0GD z0=aXE38~RI%>*}?C(YfR1|>2H*O<7u_FO#ZltN`@tu7YB4wOh=v!q&Ty=SZH9MiI7 zAT>eYkP5j2-EcyZMmTsHw<>-#9pV2F_VZvLMVGEQWLb*7g?-ce!=IZ!1k4puU2_eI z4xg9#oUiDS)354A$D;bj98w!B35^-cP0q>XSioci7#FvBf2k*B2GH0z!0nZQAbD&k z+=b_)Y5}_2#vvjm;@m~XXjwkq#A?ls8Ioy@g@jvfH%(}H5asgn^^a7UTa%jIdXyL6 zr_?@oYO^v-G8VE8D=4m%`VGsso(sH7)CP91nxv(FaSKfU9Ee#8a}fi>KKq*|Y~f3m zsebd-rIwnSL+WMzL?iul zV?Ff+3ZPbbp>W~c?14}(NAywTAWsR0t6J#3rM1MlVF0!w110~f!PMUg5&Zu8Y1%Vp zCTB;QOJ)IJ8!bz+eh9c~rmB2?!&u*yXYr!Hxg{nrKAm@v;Q4ATcrjdgF`Q_0^x<*-mrZ@lFE3*>%k(~Eimns?6I2NpAQIkLYOpk0*#pl|QP+)(c8;{+Q$L;ud+X(RJnzu|?Rk-R z#q@Sg_U`LchnQgz4lNwVt%BHtzxyDHO!c&5%LhL4)A4M^Un0AvW0ee^+nEWIO;E-p zSt6eG4O*HN4)TF5Q0rNBDp^@8{YQRT{P8&@AXS`(3|$m8+dTO3bmIrq;*stdjpCT? z0fk5wvDyt9CE`AQ$DEX8radj+XHopIe72D2baL?LMZJRTO!72?S4yErO9vAna?+cKNyAGh)7@WW>DvI??abr~OV5B#37yliWt)(EOLM1eh5v!)j5f28xqhotLq_ zrhz#L#jvyD&*DPaXwtwNmUgfjsfiN2UkW9T=+E2B&M`O0RI`A7r*m!gSN5GkZy7db zeg&DPeGfE}jC}&ip0F}RB~kPaZ!Z*NI5jpz6AS}Hcos%7Pt&jo0Cd1fq-niN@?qLF zz&^2j^Rci}+5wgyttOu;SygUiu+1#vC{&QBLebMTRvz~ys z3Kw3~I!k%;s)~FmiE=VRvROyoKsCHwqV4CkAZfF@lXy>sYIh7S!iT zCg7<095l@GhihGGHAi=hKQv`n54Fx#2Wc+H#FRVIHm!UP;+Pe2BIw}&-v;$Bka$G* z$)95v&U6iGiB>=$Nki$Q?hgbF6Bru=CQ=rblc1Q8##vh^Ue2+!b3u|bSt~1?b6kbI z^vm`mJFd|&@_BB=w=~ws1QnzAQvB0CZQ%&}_v`)}>&|!t!FOtU-H7wz_=qqltCHFk zW-|61a@OZQpPS+RvGCTz>U7~7MMYwOan;1mGc5!~m-Z5BC*ovQcfRqQHOtMHliVfd zxTtl{`Ta8k2u5+z7$Ne%~1Q4uT`lhdj^n!#%0BPZaujp_0Lp zZ^IjDfnsSsNtyTxtY40$rRkh#Hbx~hV)Mm1 z?%nox`TpuFDH>$w!D$hMU|V0Vf$|b zAlmtqO?0gN{aH}U1F``kPn(dPM*{uvycKE{@0>-Opc=72x_<9$oWtYJpNcj@iSqlO zhe<{lsfij1mO^x_DS~~3qWm>xV_P?wW`2pR6PQ)TW0@o+R=$8iq~fD0t=IoX>wR9m zgzF-@(0fHv7i7?qkkaP^3$Hvdrko{Z>nbxoR_FRjk^wbYaeA|8^=$uDLrhF~0QZ?R*PFrjltVwjw^?RT32e0nX*D zgl|Tn9WQxqOu{6tgQYz?k4LY}Pqozo5Sljg8ZFo7lq90OoTO{IZOe5oU_vpP#(wGz zBlYPK3GnVIe)9K`K?G;r8Q@!1P|GO2_tsF6EcLkC!$r%fjuyfo&E}wxQ=TK=xVIT@ zIi|d#nR+i=4+ZMtw4*JgR~+Ve(fobzGE8CCZ}4Qe`t|Z;t3+Lu3rwk&8ZyLmd`(Cq zoV;E^{^lI<8#p1%oW&1X>F)r*W4hSZ!_%GVEw4aU@5L{3Kg!bd&nGV`IuxQ4jMcxO z))!h@$qVi81>7W2R~3HI7Brt!hoF#l`k;)iNn@U(jPOb*2=@@649^^L!&-A4v68;H zsOka;*x)vE$oXsLzyBA&lL>wQDZGXnCVZc1eStSG)k-g|aZ(i5=NNx^TN0pO`eLhV26Hdz_t>I7 z0~lM*aFAzvZ;Yk=jT!~%7_v~ZevV~p-wb9`k|6prssA*Kgh^$NMgR@P(*}coc_8H4 zaE*;%Q`+D|K)dQ`Mmz2~<~ulCd-Q>83WwtCSY5xftm`y>z%;K};~=vbmr8xXYJg{y+BKGODWXdjpm3lJ1gFy1TnUlx_q>0YQ&+N=r+3mvl%;w{$27 z2-4l%-gSIm*OAb3U`4>GwphL!7FJ_jj}Yu@w07OVj)U z#aO933!WgC`q}0=am`od4#ecgt=z#STJgot6^d+OxJ`SnaY=0BOi%f>NkBVxfI!X4 z15XS`Uf*Q;Q5%|u?npz#sU{}$Bn$8G-w!V?20faTkT>tu6X7F|bk`g6>P2oWKLtQ~ z4hJ`IFdA^g;Iafw+JK>xZ9K6s35_BL_M0 zB$Y-Xw7*O+6|5RBP-kk6SOwRfQmq!}*vm)OcPIp&hS_S(IPR&;*z$stkZ4%<;_<7? zSz1!t?#wO%Hmt*vM?F&w{+f9ahp&i-5_yJVktR6FKF3!3j}1yhGrsvFcVS|1JcNlq zKelY4RxjnQYd86@)Q2wl5en@bmCfQ{#_tVTnM~&317zYj!(-i9PTkzJ8S2n6F04P! z?j|XfWMRdnTqQFSW|`Cp`}DUp0e&An5c>Nx!x^+kwC9P{5U;erc|LK$VcQ| zHDn>fFbnxN3c`mLU--XHc<;6jZ(tqtqz2*cFb7-tOm#qwA$g5uCT+>obX?qwssd<9 zj9A59@bJe1Fra%bg8iyLf9ZVb}G9qHGTf z8X%c0o}%X6L|iH)QAx_y3Br{_sy-CY6lK!N3{O}69fD>ex9`>3ZQWD*rQm_U5TOFg zB>WO!kTNW>T!kKV?r2w)OkV+Agb6Nt3b-mXtZ4wX^wFF8Citpnn5DB*+r00ObwxAe zfbl!$l1Zh|YUEh;V%MT%5`*XdW} z^R#cbOSUi(>8Po}oZ%@PtkpK`W9}f)hqu+9;AeMeEmg>$Dpg>Z-WWb&h^U5}B^h(b z-Wn(3Q|VKV45}rJZ7bDb!l=sbh6KXGnm2Z4B1nyH*!lHa>| zw2VpK{6G$sO1N3|2eQ+S@40Ml+K;x6*Ic4WZS$ySp1s}vxhm7uPSRsXZ|}rW`MiK8?%fE&&(WAQ`&xL@~Ikat$o@$)kIt=|&mRwv(g<{=*#8 zL<`iHQwrV|Bkp>N1=W%&{+koT0ZtRwn4P5ReoLa7sUd}uQtt9En@Ov@`czGPVH6r$ zP;ktXr>Rb2BhumE2+JLk;nBtQ?2W}>se&>$dId{jCBleYJxAZK`bJ>(5uq$Fa0ONA z+j()H;XfW&^f?a7{y@q#%;RS7Z}qWL`>Gev!&f!<04<|-MyqIM%oUuTXCZgH`7l-1 zhA6Cr7{H#O=gtwpB^_r@wj~mU1Qk&aFrV`l8R4t9KdAyL2iVF z!dKl_T15=g3M1pdB5bY;>faH`dEyz9Iv9EX9wWMM4m(+fHr~BIsv;2TJ}*>h_Sqpr z-lGr@Z4oOE$Q69ItwOJOKDJq6yMZ!8XI+?hPo(?-(4@H{dsDT16+(BdI8)5lxR|S% z^2LX%5(79eq?BBdS2DQgb%0OcOTfjCbp!Rz|M~GTR{%Gu$Pp4h#LP7{W*r%~u_V@U z8Zp(x*dZtP%$Rv!QnG;~1mmh8+F$^(1ku ze0Y+p8o+$gnmveSj+}~h-SEIW{t*mKx*^-AWLnSli!jwfR@LP5hlx@xrvxxw0TpPu zsvuK~#L`JduaIQH_-?f6&+!r#fEpozZ&!~C2gs=MXfv$d!cWN6C$+l1X{^!JDP=$R z_1CQfZq2F!BjWSg9p#ARcl(hno}MNj?qk%#|v2)tZei#~*#RW0Wtv7Ej? z0?Hs=>tmuzEXp~Vy*8Js&^3HKWmIB+!*^^SAE+=}x6d9HNx3|&venR6fiYpo(VM9( zFx3g$v++}mD!Q8(8S&0^Oe9~tc5hdH&@p3Xsb-!ycL7FdV5j-9{~c{zWq)B{0ERP+K?(S1 zSwr?7ldu2C1N{;A$tC?U5jC5Wj%kvuXYM`OueQ~B2ST6iQ1L1Ue+AkZ4_!H0Yf2X# z3pm|o`gc6i2f2&OOSCmaWzkCxY#*n;UX(UQ_GtecWu2Bf&OS#V-eZ9H03{^1D)#Q_ zI9}lN8_Cf#yhnd?E{VT@E;dVHrL*Z`2R;{tfdTC^mz2Z(ptC0i=31upC2HrJd-3^O zpwe^;U*~wh^f|8be9N+*!Ul%g^Ge^Tfcy{oGq?^=2z6HaEs4VD1yV!eq7N*m^>R66 zHI!rHp8mD_TMtWML{w@{HVZDN-;K4RcTimANW`@qJQxD-V@Esjx4{L!1j>PBF}0WC zK<+Xv4@&_hOKA=Zfn%)8_dfQS0bmh z?KcT&Hw2GKYhuTJwdr{Gfu*qCqc)KqLqSvaOYT}4_f%{^J#UBoVvL3(Dx``0YutTJ z=9FFnap1kSWlW4NFUXbf^vVCdMr=Sn{OHrj--VoZm7&Z=A02mI=9-@GFBE2GW^$ud zSPiFro|ss52r@?Zs zAv5!$anI)e<~U>fvs{~ng{3erkA5&sM99$npbN@-bVfD_n2kJdwv6-L_L?T)x0(tI z3-6085f95BtqnW*FMWDMV}|LS`i}R*_Tf|zW>L1%tw4lfo(Ov~`!@njwj{o`!9>+G z-o8mLb~qf&s(Ud3ZI($-rZwMJMBK#x8!-H-k_sLI3yhg*u0i3rH7n*zv}=;Zrtkn%;CQ z*3v-rCaIt#l#7ol3atY{G!?>qibItsbSC*Mp`u>9=a7v;P0j4VhwLrhW8x&oe$>2Q zA~(>+NH8f?diPtsDB1yNB%lKXPhyII zgGQ~h9&n$GPg$j>ie8RJHWQsgZsiRa6+9FP3=ZYVznuku zC|X;g1~=Yg$OZ=XHj-LutT&2w7Tvn*Eq-BXDJ$q}VBz88%eNlS%jGcd&VknL->^3B zw{t_*)wNMo`4{}SE&5`roe#{kMFDe_NK1mh$sl|c>4I~3`M!{z_A076wrZ-VAWO=( z1T9Xee3?lKqV~gK{vGWDfS26_y3;#LDLKrf z1@{_{+;2JpMUOKffLbT#WNR|NM87uAsd0(C^q&22LlCG7ufN+mq{K*`z-jxfZq$ld zUAUcNYrmH^qVDDB=;%VrTHnqfe~F z8!uCctsBS@wZ~Y(9W7$g|5$|}aT#cTOweo>GrZ7)!4v_m3iYJf1a<5H4ARw*A`Ob^ znHfU|@nB?Ak=;ZKMn28Oiy@&sWhhk=E-HK#0VCZxB^tsTdVMZ;#N~Im42ilA6~!9e zUN?Nl^nYHlV-PsyS@epYH;-_pAuwcz8F?Uu`@lYk?QPa?a2X^X`!lgf9#Vf7E$aoe z^1V>a;{mie1uT!s#!>nY_n$OSeDs#2>hS6W>ip;S5xRH#VEUv-Grif1I2;zGBYel~ z0b@~4vR%Wc^bm)L2@x)I(+J1`O7yrjmux=Lq>UN~J=V9|AAZ)Tk=ZIQt{ceOc#2=* z{wG)hn5YuOwH0dKkiIM~3cu?;Q*P?ZmPNs5XCSx|qiLYg`e-93T2*n<*vmt&0aBRE zijz+KR-KC7&@2`HIW@cQ13^6G8lP02=UShV{U>c;LdG15QnOJOtLc@vX_k) zzvZ0D4A#u%vRKmjB6;!Kbp{al(OsCG+*d(OU5jfdxb$@|_j|-{N1Y7xK0J$M!cQQp zP$xOcQ;4R|1&vt(CAw94)q_l{D$s(dWFZZk1U`p|tkz6Of|$cf2eT{(=0SLkl)!u| z-*GnP%mmNXHqTMvHW_k_)2}4Nzc7a?gE)xFA(H8ha1}}dvEj>4bj_9v=9E_nFTV5@ z!_&)!5U?n&rMwDfLS}Ov4H=tkKK*bE$fv#$s#l$C0iKa$*1GvOc1rCw!D_`3K|Ht| zN29h`+3TM&9hfJFieqzl$YiSf6#uA;_iur^kXl!bL7rgGU^EGUoP5#F52SGIC4Ag+ z`k_pP5o4(*!bxVSvY+*pW*(_sT^pfv%f3IG@=sp78_&WD83beI>9;K5?)8h z2IT)Vh)DvwigWzv1>T#vPJuTM82{-k{N?2w--oeXn$E9#3`!b*{SCVQ&A|Hx-T#lp!k78kcTEnGu*qi|W zsK|Rs_ln}(KBfRU!~HE*JHM^J0)Ifm-lU2@2Dzj+9^6)UByqlec&ybD@H?ey@n zZ$R6j0%)@=Y;G3CAm&^S5~S;sHg-hoRThsAFZ6d}!K*FbY*+F?b z|JrQ<&A2W-@$qK{Bgs;S?=ube)BcstBPN(;C4D`;>#O)S;k17q?3<*2 zPJJ0B>`>8tIryqvrm{v(k<0b$TOcWlSHt=w)i}C>;QlEr% z{cgk7HP%!(xsZW?%V>zv@)j9;ER84^_5vWh+(Rqmcx49M0sMuakM0+Tev1;x&eVJL zYZQDDBv09%u#f(7k>0{5Y*=|v)3zjFQf?%5o6R*4`bg1vr+g9$zAv$h4|>hR~~9i!J5M~3WjcdRlw72!>h=l#qlK7ak{EM0{K;T+FPkUnV7Xl#VynbbI) zrG2oCg#h#DU@T#uMYk^#Dr}yL^6P`jgE4&ai}J6RSKog$2S(X}e$(bSNiV99oPTi& z`v`L99g5`4{n;TKvG0X}TtxgMUkjUh!tWf?!}Z#{?`SQ@3o`GyELaP*AEJx|gtYxm z0%kif*=G#t?v-d~eg~#GX4_vYZWTUVw$k!Tt*unS?>OP z2c@VHXAEMR22Ecq>~w`m+Z)J~MZAka8b?R_a&Yx8cN@B?MEcGcgdQx0Kk~7MW4sEl z2_3u5mm?RN?nO8VcJym(=lXt?$t}YoIkzA%MldcdJm$DYxiD*p6=UplfVE8MqVfHi zlfCTRQmS+_>C@6IE2?#7!N^2}82AA{qD&J*SjTq+E1J9^RSpSCrVqNi|h zN3dl7J=)8qaW^gEo~;vTIQLv>41a9+K6omV^Sv_y4T&;CW$fl-ZNpf*hK;;2c~3ts zxPzz&_fG$_bGoqdIfGB>5HbQMXctvnMa)skns8754U{l(Y9Nt|A&iu72p@GQc-{t? z`?J{XL4@6@-(B1-%06S^!w6!e-3ut8%|Dj#34D0>nOPjt8`n67c#qqTQb)>L-SyEQ zpOjJaMiQE+kjn4G`-~8Mvb+8oDIy=L@&HJ}AqF zM2VJ)?uHK`f+2It$z&&gDUcB&z52!zMyN`q`}jm4jvbbinl zR*n7ku%2*X1XT+;I_B_zingP0L+jpo32VuYa&Cv^@<+z{(f4tBkO?M`(HZBwe%#nq zw4RB=rPy$JZ5HM?+}#f`zHaAx*tSd@xYD_ipS}zCuG4~{H;~ekAKKVdLX!2K5zB@+ z;&rD#q0u_3gdcucFEO?FD~mgjgT<~5K;7$@BNkB280O2@hZi16x}u+O0} zseNP7fq3VOuTjAoaJTa8eXV*Zo&pLXOl4BS(b`T6yM>g$4XPn>44S(k>__3Rj5l*0 z)+=!n$01!?V>|tP`LAcDHN!miR4IjoQ^l+dTrV3@^5j3)-!(N}HGH^t#$Mp`oFU88 zCcNG9KDwh>-T_ZxI^*4k7e;^j^<66%!Kk-Zq`dX-GH&uJ1rIJco0&BKbVDN>US z172hcOxY`xmV<86S%a(Xs$o`^O^k~-mvV-0J#AhOdow7alD6S>WDTCnOlKK?lOwWR z{+!L2BS%&`yP`6^dmXaTw-;jl*7`t>0`w<(ZE!AFiCs;xDuiqx2UV}!c1bq{Yle!c z?-oh=WK>}{a*!_)zQ0d6CPgHcl=>;8lZ`tY;pv5%@PQv&Xqw>bXB!bP4kL@kfb4?K zGdQvI-nD#9lt_}Ty3xO4QfGlbA9_7b`+USl+S9M|^~}t;w&zD-L$~4g)m@g9j>(cf zB>VXcHF+O*s!Xqjj;8^+r@0|3h3=f(B4ad`r3mr|9oF&^;WY{Bs(Br@Pk|D0i=690 zRKwj5I!$X9pk%}i3jw4Cy$o!A5J!JzLFEMb5EtBwXOWmCXqLmmYp#Fg{6XefP7EQ*>b;K!g7fHFg-UQ zrg(s|_c@v;%f>=2nK53MFu{Z~{NRZq|O>1jAOq<8+2cJ$!o-iN(4Ilk(gy&DIMB(Zu9kyjF)c8^?S z0}lqye)PpM;Z`9c*S~NbPj+9Wsx*Vc_wyvH!t2Cpi}O*0w~Il7w}=0hW}tD)7=il| zS+Nz%b03Z`Tar~$!&EbYeVm%2>fYxyj2F(nSnf2n>~NCgb2qzA3=^)mfUNq+kRe&w zWG%yJtYyz*?`SGYXs>a6g#&(f&wWj(RGK}xT^VVG3;AlushKO&K9bKC(DXDfSFw)T z;e|ni9fPg9$r_N)QSPPHM=ccY`)y-_*mzi*a&8G9+Wb(e9Q&LPLX5Zj?&j%%lYN%L zb=w=hmhRQe1Q9kj>W;fE)?OLF*$nvB>#AKWUnhpWW+qZ})BFGr*@)iANHF;WA{2Py zvhlE4L%2iIT`ERumIycG1^Eu?*vN((-4~o!aV@%D{e{ATv;}Pt7j7R9S_77rN9L#! z5lg$LhO=f{6s1j8ub%qg0MJj|6x5>;wXN zw*hmdJf&m%oFd>0ro(uy*?od1L-6)WKehrV^Sg>_FXBpPAKY8VqaR6o%7yQBQjB12 zXDIc_?|lNp8TGLls_%X%theyP7>r2Gz7<^fJ?Ji=%OqQH9?g=m6I9VV6p5rA&Y~4< z7vn-g&jFFVvXhb}j!9DuUbJ+FPV-f&C;7c_GKf`K1$?&i#1hwwA#9E^fy5ZgY|}(1 zv=nc#0xxLNqp)nv3E&07UN+yJl;uNn570>UoRREJAw$T=PgUzd!$@8E_4QLT-Y;93 z5fss1_rM}>y^1LX9>uq%Y@O@N$(BT$`uZzC&wMb-3~N_s=W_tYgac#fWM-vE{MBZsCr8rd@!z2eI9>(Rz2 zmV^Vwm2s)O&JJoFTJ&t>`96FQ#m=&6Ul+)}MqWa`CNzXZMdZ2VDPWC|C>a9mV4s`??XySY=R?iTA5m;>UNTAyS7P3+=t=H9mjs0cJhjMeI% z3R6wqU2Mw!6*|Ei4+vKGIsX8^N1`y%OAk{A=^GacRW|(dRe5|wH8EYE5rbpi;33nn za0@amiR=po^}V>;91@k?Hi@i8{2Yd!6UX0buh2F~SR(FcZwkY{?DZkrBEp`IpAkg# z`}*|}-5AvX!I6m}{6~Q-VXBe4l*EW_u@VpAjr`2~PO&W$SH$mF-J{S&CTwSQki?-P zU+GeoXYLL^l)|C%$f4fLic}$bBeakcQf)ws;b1TG>M%$yr8lA>pF=`Pa2-YD zkJbn*#omu|C#-xelB1F+7r)CYog8bV z-XX#j7_LP0x6%;G-+0nsi#o6ZQF?GD7nP|_5(aUyD{WXAA)HfTs zh8a(G$W#k9cOH;Iy_QHJ_hn~$;KWGFNW*N|{RE|rxQc!voO4NH&ONAOR|a{tn9U^a z4)I&21^!YQYLQK%+pfw3v<2ZYn#k-rletb;grR1WHN`%uICFi^X`+?bwH{^ED$H$5 z|HeRK0{!zU@8qtjfwvhk*jNNHY61gEBcel_k`+{5U%PmJ2y@+0xnRWaH09uf8y$En zeUshP<%&^#^L9&LXe%@&L}$-hd8wBvOwF zMY8*W&WBqR`)j>uk3^%o0u@z=w~i0wI}?M%pn9 z6OSW#r`uv1(4S0RbU$K8FuKDn@9E-9JqI@5$e= zjy!P9rh*WR9g(-wx1U0374+v035AbplF27|P%Ngse@ZM$#X~0sB(Gop0IFelBVEM0!)< z<0mY+xqW|_6H8v$BWFA|0#`Y*7UFra_mV#ID+?WLcgBqyu`}zBl)AVHP!aq5ey4m} zTWPQt8Tz`RRdXv=s!CRTVJiB1x^nD{Do=^x@)GZIbna^K+6bI#yhhIJr9%FSoRfmq zmO=l9El-+zfs@sg|$wThV$yVoHqj!6-J&C_%hL26lSECb@#j$j_cgU7Sn z#(o95;z{(E9uk~nu~vt;a#E>y=sZ;=EjP$~VL~+-EB;vib7S4LSr$%JJUbg=i=TVk z%$r>PM*rBG#-|4~jxw1HzX8WHdXvNaPcZktOk*m7WNdSa2@H;b?_DYw zVGYbt^Kg=A#?emmZxTTna=N$hZ@g);g8ay*&OE-GCis|on_8WJ|L(Eprg@X+c6p+# z)>1mz;&%D^@$A)XuIHK7m$NU153Zd*_4mxQ_qNux2bti^ssm4I5UDkWRysA|#VfLvApV6wuWRI@zQ<>@M!nU6A1Jj~rg}0KKVl5Hi3eMG zUG3De9T6a7b$H*rf38;Ry6cd(!`X)6#8h0p zf*ZA=08{LGpYy<=(MLt559QHg&suc zVZol8fP7%-+1iUgoH-1Ls0uunf0&clqdJLPK-v zEiKr)k>2q4sC*7oOsc~I4^-Udt0LyS)z3#~?Pr}gLPo`#XM5dD1kERF8PJ2Cx`!s4 zPl$?OdU$yF3r1Td_z!bhxPQ`k{&JgFR*C)}!AG{9(|A{gFNU)QhAi1V9PuVfx|L_+ zW`~3yNx(jjMH!D@#*p(f2*HdO{fn5yk7eM@RL~_Y`2j#7qP% z>Lt^hnMiazZH=7gd&g?T>GaMrCL4F^fR(HA!)LlAB2?wZ1z(13E&~)f+9wauxej#u zLQn+xF@oN-dHs4f1@GF~m3Xz5uh=Aam#V0pCtfLKfY(`nhT4x02h*~@mXN7Lg86Dj zIrQJnvyKlNOA)wv4;dZRjn*~yUC2<6l0`H3pc-E#ysH@|d;l!vt;y;2u-EO;aeT{l zZgH=lM4O!WxsAZqWohGKU#^6|DMuxvipnqXR;W;sqU4fjfHedkYRuEAEu|gdNvDaR({OjB3N&v^(z&cuE|9 zL^70}miLNXFYyC<7539W)UrOR{+`8i0wT7ki-J_UW#nT&7@tgUm^Ow1wuberV?fX& zX8YlbR#(IY7L@Plf?0@?we2zKQg0?V-9KB<8(ubDJXg-NV8E(5b?lhoq3iyShpyYx zF-Gq65l%*ox%d-`g)ic--Cigvm858Ha1TcDaq}a@d>?uIUXjc5i}@3z!w_zo6x)xq zslEA0vgg#sCstwxZp4zj?Q51oIxaLN&(btX!K|_m`5+4v3Jv(-d8otD$cGQqFrXuo zV2X*#4dwTHLF=(dUo=)=n|Un2VF|N)EYnh28-~*Q4n4Z}@4i?U^ih3%6XQl<$ z>X|sk@*_DcP)^g8Dc-X!rL{dI@3@!ezAcwPE{j;S8%-R^WwqtTxKtmf+N-{p`z2-M zRS|AyAHN%lzPtj&r1@6qgBJamhL&CU+BO(XmK;Rw!5wcnnAKVU6;d2ldFB=S7_3a< z9z)~tn36>uCY$mF0RfYSYMOBU`2n5vVkV)#)Gc6Ez5ik}kxP;PC3A>c;zb<6Mx`1t zvXlY?nQl#HW7Q&E4{Os^h0EK8)Na5W*i zM)ik+Jf3AChI;XCI<=CT*bT(AE5zbSFDYh26x|3eqO@{W^Xc?8FZD;L zOJ*U-LpV+HyjY_d4(IE848iMfia-ZKkG8rttPZxj5Y_WzUlLq_`I5m>QE(sX-8&P-4o(ZUvK#L1DtoAB{ZMghJMBiu9^H%PyM#d_b-JjBD>Rc6N#V9# z!R@fv3Hk1EhHv3@G{~o>Z&z>8u$JcbcJ2^(opEK zBb(o0Ut9!+!C24KAAjs;It|2^vgElY(uLW@PrsT+WIg@vx>X{xu^KXrL}o8eoas~H zU8(vrF=s{7lHtQ6BE&i6{B$v&jFh{N# zT|sU#yZHKimyi;>n{k22clmf+jqQS^<@zw!ok#)QbTW+DCykS;6yyMp+tJu^nog&S zxEsX%=|ZxjwtnwR99XWS%px`s2FY`1>MBZdmkBXicc#vd%|^qQb(~_WGJIr_`OV!fs_O&3GKUVK2UWc&Tno z$!U;X_CJbP-`BCoj&ZyRw2>}O$5LE=FWuq+!8*pnvyV9_shw+JtbqkqVZ2??ic zLii4Xhy8L6fZTWw8cE8B=2sa9p%I$?vEz0A#=#aqtF8C~wgDrc3#2k0;Xw$(B-R8j zmZQg^(f!3hRX@&%yQ=Q49PF^`ZRder=Yd&b2e7A*>h0~mUEFjLq+bLNAi7dUVwjC2ND={$CCDQF(F0> zuAIm{kr{!$OC6X(#Y6(f-I1#iAgK0o7ab;h+ZaS-pc8d2%xZ$S_%fg6Y`_d)Dt(PzcNY3T=_|)xSiY@D;TC0j+_cp~HS*+tGzWbcA z9d@ln=^tOa0~EW1##4=ViTU1Hs#tek+)l0aY)Ty85kBmtwcy8`fsTl>Z3<%uZnGLb$$If-rDr?p+xmlj?XVb}IvkVVIplwiOVA!0~#HX}BY5s(LR==&tP zCcf92=C-TbcLXvwH3Mzp8b8_zn@9R6XNzVzNc>(#VurIcp*e(BygKM2jK3y+(}g8Q z(6u1Ep=+W;&_thtG^^j zks|L^U8Dp|H)W4#69(hN=uB%$fIQb>)*02@^%7y9(A9M>t}oRgy=^!x`L%*?nl~dC zC%+c=W%`ecbVvsVUknA_F-za0)Qm8L7`m}eHZm8EHi4no3tTx$4@lxttDgfpVgMtD z8tf917LlOMeXNy^UIDNoA$D@E%W_Fy4rzKS?4FbrsF&?Xm(B(GrhHhaQ2?lgpngCWDEIMMs0|D95 z(n}em^U*Ew>DpOG{Y1?+Z2MJgc0W`L5my%ZK;xYLIP(CWojAGI>>G(LB$Vf^NPYXo zkxazew^0-;7BR@Ls79uAKA;$~pd*i&KIDESz$nyFf+?^ZX_muI3Ga*I>qD)qjNH=( z)8R9R+UG|t^8)!Q#$Nz?0Ks%U;U5wBSbT~=5djL&R`*?KsR;8c*1N2zWIg;OvA=hL z5moE8e*mmVPnGVyh!4gu&Sdx6cdXW^082}|-Mg*4?W^-WtQj!b_Mw2)p?PUHbWG(j z$f0H_uXkg?`9;xDUVZI(Xl!iE@uU|{ZWsl(AX}TRZ_)7y6m!C$lJJ`^>I{XVa4F}R z_Ksx+QY6`d7%AuwCMo(Y9t!Gmaf;pXV9bcHibtNfP2(CDVT&X{HpUNKHxj?$Mm^44 zxq7JQbQVLu6B|g+GOipUz4jyl^3Gby!3q!l#RUg}WSgvltVB1K1yP`J@xxBhqkHP% zx@|$ZMlQY)6dlXv-KSN=8 zB{dB)#!8nlXd>^+%F2i+a&Ro<*34Lu*enxU+Fbk`-Wc#NN39s>w8uVkUN2vOyz>i%!*1FT$^=E^D(S2@{2lTS;Xu@sQ(JZ zZX@KdsrL^tXlYxd4eZPmh1^+(U!RNfQY8ohDOqR_8)q9a5Q>dG`#vlt4hx9G;$G3CR7yBI?SUxYynOPbLzuRYg zdo@;qY|hE+!c`pf%DjT~+U$#RoL*ON7Bdm=ag85`OmoWC_uHNCd9zO6o0Jm*Xr(Exr91}CR%2CPoso!sMtFC%2tw^FjkiAS%z_@BnaD(Tm5NbCg3}m(AmXk zx{{|;O~0sBt3f{m=Sz>Cs(w!E;c9wrhtR@E>d=0NMkV~JQdN6}pfX2_-<1Nlf!1(M z?9p@cn!f&}-e7=dBre10wx{@HiT7S48>11XEb42`}wf(&(+>Z7*ZDSIjb#+2NX00D8o4xcE-a3Xcn(>r(guoa{w9&O(i zYUanWX{Ljs5sTOK=;*2cU_5XLo?^G!Cjd6BvZz&C(Ux_Q_0P`hJeUrmODES>iE$EH z0s0Rjx(A%7bR_11FUMv~_aud)>Oi-|`-5Miv)?!8l5G;L5}7z?gaZZz5B7jQk(&7n z-@s7-L-+M_Y4rFd@g}kkmF(Ta^_c3Og97b|Iq!@^BiD^wPDpU3BD$toiRm?QO=sU7 zB79}|G3SD-+-Da*;}a&rcf}=^=&1TghTTP#c`0IRDzwgyB}294^q(}dpud-@=thgs zBgKA1ft#&s8@!^g`#$90RdLwBx$uNIW;V=Jl$$w+QBvUA{eOZT>#RQPcsfQgY}jI; z9LwVV=z7$;-Nt}NLH`U#>yLhdxsHJLG!_B%G# zPm^GO<3D$xU6{dgpG(0C7@@8BqNSf(27GY~9{LH*yfcYk8(6#vWxokVG~@JgtL)0A z%<1t&^Kt02%rn!*aJ#}17#x;}WMpHG<)Tn`a-8g}va*AzlXzp#dLq2@QT;Ze59_F5 z=XSrtJ4i5TYm7DrE32+C(+?Fh&X7L?;VT+}{w&BwZajh1o4J7ebkBy+sO4mA_q(YM z&me3Eqqr{wny;iO|nSl^nJ!dgueVWg?{cyp!{PZL=d;6JaL1BiW&^cZrB$p)&Sq+%nu# zlp}MHP8248aWCO(d#H1>B)L*(MG6xW|N1YN@1M|FJ%hSF9L=1liTL$a%k6VHcp6n3 zp|?4azrOw-RZau_(2%zgk|+^j6V^gRl={h1!h$LZmPBvK-=7Rn%Q!`pCPGY2Y3P<> zh>3~%XY>9v39a++&t8bzKO;f()h-8|et-T&qyUQ+{=_Vg?%x>PKmR%Ag~14#D>WYe zWqp7CmsU|6&P>`NDdF$ix+Z%gO23#av--8x&~Na;q04~b$l_N~{uko@yuL|A94@PN zYqBc(&;27?gYJSzpGFG(uPETp>*wf!cQJFaHKp*cMT7coCekQR#X}iYasR$v`~~ia z_xjG|$@bsEWzT}=rjo_W5B~f5j9PI0vEz-a<9{Te0ZW2S`*ytZ@9Rfq!1b;lJw=3m z={V?rLm7Si<+wjMy!#5GkkRKNH^<`}F`B9he6tWu!R_*nG2jM2MsB=VP2LC~wUf6> zbFp+iUkDs;*eXrN1SPT6vyL;lpkR!jrMwk($uB1V-$VSUXLt`GaiwZY`&V=#9yH`Q^v(5B@uwk#)vt+}pOnqMU^XJ@;*MN~R_pB7A=IAb=^UfP?I64cuV07fmNxdgfs~W8I`LQlQm-KVw3) znX~F9U&leM?%3sMheXnjY&ZMcqJqEonQV%;2sSwlhX0Q+zBzeqV~^JxKIhYu&02V# zF+bFgtp*Y_uHy_Hr`~biDlu0`>sjZ(>OP5j$BEea z28}g=K<{a$8JUT9wNQJ_oa+_@%mRUkodBFH%wBWs z{bXU6mx4d8kH$ekw%#k!U2rFE+v)1#_3Vf^%I-U20aOb?J=Z|op>Mkg^lfU$IM{1I ze)CX@zzNjU<^tHR2xrEt=la(=K%&7}3_Rw5XGcxwv4=(-q_9M)i4f4mTmirOI5Z-Z z1_mQQdZ`0*R^pAD(Iwsrp!?z0EWcCA17)Zm(4AZq=FMZ zczLho$1SIo8EEhWb=N8n5TyqagSI(H60TY!ZjdK~kR^YscW@TEVWHbe1C8+{gtg)6 zg$y@3nk%*aHkYnzy2t5#%6C^+EnvS+StjF~o5eoXQh=s2h`aqXun{G5mVPBBerlZ8 zR6q?8et5KlpTO^6COGd6H* zF(eTzZ#+}$_AgTi)f?&zKz+S_&(ic04>B{22uV3c`*RyJSPyL_w=cd|xq#yVA@9PbrMqve&-R*Cod=3Ue zNqyE|`73VyGs@Qw)OUjcj3wLOLJ`Cn@&2Ds|0mS{?bJV~;{WaVGaKZ$hv!x{9}NkW zEHVSQQgU;e8kroe>_!&xxB6h$0w;YyW)S@e9{MU_K!^CktEdlu>(6^5kAZ@DElk=D^^*pO9szW`@-k1dFUc(ZwtGsw8sK8G2r{lwdA648mklQq`r{yS9Y9@!E z(CK{lyW0Vg!Z-q=RTu?4T$*OR%>VaXeyCr#<&cBN9oUh~!1#aep0mf`C! zkk1-&xm|?DjYPO!m*eSU&@>h%|Gf9qOFG*C;e(JyY%}Bk;Oz>@R*E3g&+vWM50zMA zp*Vr_i8W|WW9o>X01&Qv`dLw|sS>(_D~LmnYpRJn4h;^*Wyp)w(z_3h6C{wf3gl)=P9(H4jr>60@rX6sCJry5-Gef^auL&v>I-sajN#FLvW8$&nZ?A@9 zA8G4a#8%4K`QvLbc6W0P3rAZHB#gco<7vXg5;<1isHbZ3C(tWEk51yX)gz|o!II&A z|F?OPjqyh86rS&7H>n$gCOGKT_G-U-%3N5b!OOOSnL~OH^Z9%{v`n)CVQDir*{PuI ze2~*At9*bhi+V*t=41n4YoOxa{AUks0aLJ=h00ELE&}ZQ2DDkp6&cc7}_bf0)90Me+>=`}Y zrb+;hmyH4ZmW&BvU|HAW{oYZn_H<8l`gq8iP@sKn(7@*8v!ikv~KTKbrU*wUs}NOI+qe$3gzl6r=?du zYC;M{5+&&2EG4xmm$(E4k&(COJz{xF;X**I0OR{a~J>f##~^10yOZCQJF#7)cVKGnVQ>fz17C+j6f<^GNrIEDhvl_5^oGVzc+$n;76e>{Y4GUx+op(s@x!U%Z6)w9#HGbcP6G(i53OkDlF zqYKtFRRX9rR6MC#p4DCb=V`V8@Ja|F+5C*X{>YB?tqI=WCjjCPd=SGnyWd$YDE2O3 z0Jn9WNY4E?TJ#f-i)#Y_1wr_j_#ae~23~bj_eGrE9~CDKYe)@H4gR*}fAE_taEc48 znslH2pW7o!YnLY%{(WjT6#ytpJFzVMTepqiLqXmDPaiZ}X+Cvyur%W@!kS8_|?z{@YpvC9lIJ3Ci=&(C>Y zQ=^+yz_BlzN@?%Q{dx-(y)RAgHpdcoF0?fQF}518=F|~pN_VM2 z2&Q7(!1pR$1%^M~fe2f6v?PZG2Y|w4v24}wS$ud{6j{Q)!Rq3%*6gp|Q8TFYmgZ*z z-}AJo&TIXhUUSi+B4cfbuindoHPZGAOp@kI&>0!!pi8O67CWt9+nBG3=E!!*2QP){ z&kYZDr_U?47LcNHEvR=KZ&|dx0+PI0dnexxK*F+ChtxZCtb3}tsJC8A$w!zzt;j+M zm#!~g|FQI7KZ;E7JaZeODBrScNd}x`mz@D0J^BN@qKrYSmr~9sE6$fUQBKlJ2wBT@ zC*jo@LXZl+2cvmbvfpEjg~levkbXp%vwLv=_NW(jg2SRE!$(EEDs|4g)n8x3mYt#8 z7=A#a$X43T9oUp*ewcUY8$fs5lXO1sW~=ecJY^(fGS$Q>E%EWrrx9C*LG+_TbZI%* zFeh!1Bxw~bg+Ej_HE>xhMcIe^(12aK}nMF zSj%ms2LA%pWHBfspnD9iSe!uGY<%=O&vo#Gg%9&0XAWe0m)%L==8cI+fO2+|CJL%K zD0u0zYO!v(D1LQ#a!yElNdExY( zA*ADaK^YU)`>|Y&x7KvA;y1IVa7+Zf%+0yGsnz;p;eNt7|M_8u{70^I`qpZ}Dt>`; zH~Qc9atwTTTBp!Kt(g*TBw9$a%o1ny_3K$RhY@q+`?xu}ucVRVoE1AgV;KCECy4pI zG_<2fxKHh^RiV7+mI4+B+fGW>HbiN!IhLwc8Gfl8Avw3>VPP>Rea#f-+K@iO!7$I; zw_C*N+h81R@vl0*77jRB|tVkviz*5YnTP&xZ-J9aNznpsB` z-Ba)`V-mhVX(Z#E?8eyg`nIr5ffLnd6?Dh6{ZH+dk(rE`?7cslgIo3Tu?>t4Oj6-~ zQZ2&omK#B8v`9|^^0Du7Kx2=Q?iwej-lgLgqvxs5jvuiK{G}*ykTDr@VD@zkq2&KpvUjh?@Vm-; zt!4vxN(?nZMaHl7r^ZP?1s#}GG;+4JRGYOF1Zb7s|T%qUoV9oxX z?v7VaF9q4?!a)S3EF0{%+q8O&n7(Ft=JkQ%mt$S7haw%^-;wwSw(^57S}U4G8xidT zqfD(JDB`RlI$cWfj_}fZ1HYqyZpA{w_hFwLip0Xfec$UwBL(+#2;G$n@fx}MB_am} ztMvP^`$oR<@Ky`P=&hL86(*rY6vdsdY%~U^lEa)k_L^*Eqm~-wXvoK}^Q$G12b)Xc zjmWSA!WRO!bc>S4laIcHn75c^X>&$~l&Y2FYjK?(qqqz=HI{`Cf2TfBb} zj+jI^7_ljZqnUu-ofzkf-G|29220t!)kMs$8K?G-TDR(yC;__rr{GT`qvzUNgg??o zx-M7i^&8pqr$kl~dO(%4tp*^S!WCp0t4fnUsIsn)boCKVMONgEd;sL&+F3>Wyv89) z6Fz_D&4uo5Nt<I;>@ zqWkw&8_shdGbZAX*aV8&u+wiKeb^pd^+?@hBe~tAp$5*Qle&ESwO}_V2i5b_=K(B! zopH39*Uee%Qz3VU^}GH&C5?H9Kwj4n1va&}EEtb0i{F^eRFAG0H?fo}Idzqt9e;MX zsJ|+8AA2_vx!8-?>T(NrojQs-Wb$>JlDHD@VPxdKIQVO+l{UKVO=Mz!?j-ozZNzbWPP4i(T7h=rMcPnL&$3o_@EM{uwocc2U0j3jn zo49#4lG?#Wxvnsy{;u8q(vS6=F!Gs5y7{Gtmq(hStTbd+dwcN7iX*AqqM|G!3?sr5kj7j@rJ ziNUw^-&c=MFw!$p+y)Kqhe&kiVdu$fQajv{UOG{#uN$3X-|l&QbVrKtHAQR&+wyg{mnefOnFkT^=2-h$5dkqElm%FP?4z8850zjzP?P<_%?XN}X(4 zdfc?qYWzVdkfO}JHYQ_`CA37EG5zwazO4`ECY|&lGrVy@86}Z-;Odg%K;Lqqpdpr% zVB=#lzsH}JQgGn%59~$oShLP8^a$+nFp7cmAq9x5BCm~5&1%Tt5p#u6lfywDjhf$vS{nyq6w_TECMx2u+dKuWOY%;>TU5LB%rfIV8FDE* z-!WLZq$wVNv>1b(v7i$<&yAMKy5m*6=q~X(*}v<@s?o*0LB%K*YS<*sfjOPNW=^<= zXKc5Q>==JMOL>%p_WaPv&3w*)-jF5iTm1PfDcy?1f1}@1(t=?F15Ox<0)R=rVXT=m?o8yP;@QOje}U*xg-bklSlIjB+mLXEBbEIPfbxx~=DWen@iXQhkj`RxJdL(kU_}X+nS6|exnG9!s_0cZM$WtGqe&<5p7bF1kI*<$I3r{aZ2(c`_^^k zerWv-Av;im5YM0|{bfu;{jksYhoIHK>Myge89J3c_sGW)ke5CXOwauN#V272iVaf+ z>HDa|h@(y-z=i^a1-4vonaY`RYIpVUqy)!PJT8F$6h`(TDy+%4m_eTpDN) zPtVbeW5fAOM7FyqNc(2RExuLGdf$$rWx|F2RMSN#AhC{CY-GS}#EIV}=_#k`6X%`~ zi>CD`;fqcdQmsSLE6wwaOin*_b{F;f!eJh}o)jTFxi;5wp_2&_&MYrA=bO(S(<@b_ zMQ18mE!jB&FmUI4|fA@6h1f#?(zAPPNwO`{)jX&nUcR`8X@8wF3y2 zBxq^LJPd<@DrQKd#pnb@Uvxz||gq#hU~T)J$ZgkAoFZa~pRe4W%7@yoJdSVf<{(|(ym z-*+(VaIeW?AX})Jq+A-YvjYWh{gIGPY256j$2%4yh!pU%Az3oWcu)HL?0jzAsmb5V zd;8^~&z>|miD+zU^P|K{R~T<_Q+(GBIKXJQgo@&Zk29 zbOOSc-h~SCe)kQa^wY9>d6i$z(*8{B?QP-BXxzHDW>PV)5u|2PhVxBwVqTI;nUn9! zpkk3CM>mrcY4>e@=HkfMby~*NKSMJNuLb+;jWm@z(leNcrr2~w#Qmzc!6YK2{Qnew zf4xRtZC3fgBYjqx4o`V)i^|bpXh6q~wNUp{>LOyyj#e>s=lq>j`yRb#aq3GB{*QnBU8TosP<9*B;h77m;xu@j)xD1=`Plp_? zILu+rcXOr&)~FrhNNOx$#X43T;;#t0d@9i!V2m+?Rjx7TI-=t*iUMXd{Ue`e^UUt)k8&<)pCrz%}mb zF+!aG+c(4NE z!)k+(nD^q)4aFKKZl_vL%n$hK)QSkLZ>g`$L!#)%z&#xE!)Z_oRr|cpoOt5 z{{i&UU)8oZ%0Sh@XiTK#Zbl5jcIY|D0c$um+X5w*_yqu@hlI_ z9}oVOeE!8^fFQ4R0F}@wE3eTIH1+33!%U^u1aaZl9s?5WFQLmx>#A}WdQiuYIXbw_ zYC#BKU3$%u&(CBf{sn4)C}k~5b{$X>{f_z4y2RLre=aERTw{Z(`2gpeClI+s)fo`5 zVYsFPc3Juks3%2OOALKgsGf#}2pQfV`$#^Ze2=Y>GbHg;_c|y7)&@~mC%nZ+Y09Ldo{Zy{LNb&} zx3d@X+Tw@R0qg>W7Pf&QE>HH}m}Cu%)@bBr$(KN+%ri?j;gp$&)dU@x=SN@;YAQK; z3Rw={N?)10r?-{9Gi>3Ilck?HGFK)&O&Bx7wMzdv#i8=yyTU`U@VE~>`HPT9L`)PyJImn@|0NN`x8L$D4?4kpeNHdwfa(NYTbWyS?m)pxT!xLIVxbn7YE@~$SP+5clM8WZ}YEGTrs`+hOgKgSxb;OGAH7af$(w6Jyoy~Kv9e+5{;z*ii2 zQ4*-ZT>;nsH=b=k`mo;<5OGrYIWQZ>EnEzf3)>Zu&tdTJeK-2y9YNZ&ks~0pQXeI7 zhYE5Iz?QErPU>5-b^wX%i2vq*KZ2}xU!IAcf$pN$_(uZPvk()$KMeL=;VGD&1yrVW zAR5l{+u1^trr#>tFrW&iV>28|p7}3Ot^-J!7S?t($`U87j}qsP#e!=`$FM*d2%x;O z#hzYeJ3NpHWQP0g%uWqDw2y;5w4oA_J8hbI*s$sK+z+H0`;TrT0Q3}k0fatfoHa1} z4g<)lMP*2@bz|jji|FHMJ>&JAk)F>xP2KM#36t&25vF~)&<*# zJ$h^6yOtL=Vw3XHh_B~c&i7@89DMu3BgFO9s@yZ0Hk!KtVrKTD?EsJ=b*=<*p_(Ci zdoeElEX@Ew%0-rI6)RCpbFZVFKe1+CeWbSXZm@j`(1!DFUju1$I&we`%E(HFi}}tn zAfH3lL+1SdfIW~$b+C68P2%~~>8n5GZVu&2u<2A0C$r<@#yVy!`LFh7X&%de@7}Lj z16oc#8Ng$)?J`gPMU_F@76>Y|3DgM$jD7k%1$T_4XhxXbJv*aKnW{E+Ksffoi3|2)UPW(Nl8 zxzh#R*!abZRQ_Gs}Hp`o_`xNy;-TMQ(~H;Y7nm6ZN)A`3lO zIs!i6`-+zUTA+?yrlA*<`z^C}IZ=LU)ZrAq3s7%g;OjJ%9nGM?o&B?EpkG)A+@o3+ zK&V(RSbXPvY*Qg$5om5{()G648mb!XQ)y1c0uRNOTY+#y|Ga3gX@C_S0W5oqN52i8 z)eStMm-l&oYKFU`maBp+Z6J1i{U;t7PkXum#lpqhd}|ybN&6|* z9V)bC1*o>1LbBjD&({|lzQFAQfOK}t3qU5$#x6zy2aLKUr$0`cBl5~x0CPs~l~^{B zxbGU^DZ-QyJ1j$gMim#tN|qA4>eu0xmsd(08;2Ux`f96!B{%|UW0!({T*_UI_u(Dhi@y(g}<S0_>93>rnY@#|5nCq_-3Vc;9Z)u)%LB`V%Ls)k4v-rTDrS z0Pr1!15aAgeCd(=5S<&=1M3*1K2rXzBZ_V3ngLkwBFgO@a1x0#V!liQk6jVhdKHpS zGBk1FqxOSSyT$+}Aw;+X^yfM)K#G>;pwM=9r*JBDE12QvQRwBcW>}uKi^zbeoF^Ml zSVn%aV{Kq;F!8Z32hav(w~OB;vWAbtF+1KZ+-MTfiCl1yw7&qC&s>$lX9A@`;SX-! z%=^Vj>h2uMOw^ zSDk{stp5U`0BoF?qV^6di$54bGt=87p6p>GEk2GPDmKq$Q0GFrxPjkbQM-2w;)5kH z`Qv;9JEpR+F5GhAh^I)`9l5J{vZDI;oz^CjpX-!6Yt^KV_nGUk*F1G6*Eb@q;BjPpAyZuTh3}@6=0`LKBwr9 zw^9q!!S!Okx1BAD6gnQ>x!HhWN{Po=Kvup0EXwH-ct&tXF?HzOM2Vfk_(L3H%Z+G* zilVjz+on^%Wn%nC+4eSNnft4dS`-C0g@A4H4AG3d;C`Y=Ynn-iQ0l%LFO>kFd=~zO zLQoiPdy)Vx4Pk7;$7-zIbqa9UT#rnkJ71CWSN@AH2(B z$B_w(r#$-NCQ~Iusd#$f9!EF$Pv~)HpMG>0;F$k@r1Hcw$^6a2tDvbxcBw&~k(@Y3&#`>^-{xOgJrZ5ele=~y4>Piq8rFRuWO>j%hD?a0Ys zy^(V9$AC2A2D5v^*Lx3={&vvy`GetC4I97MbHG&G=2YYZefa?Ln|> zmTc#XD}OJsBT-BvdJFfXXZ<+5qgUwD(1B)O^6~2vcdrcdQHy!+)^&ZW0yhfbT8eNI=0}rpc-O7`p(f;eqw=whm zx)7At82LbzVKxrU7_r-!mkKZ;e4-=67Q)=2OnFC-LsOdPj9m27t=Rc{H8Qt4KCeS@ z;a&mo%{SlUMC0VP=~aEi+aRY;+aX!Em82>W!0=>vWpbeu5}3OunN@3(B!BPAhM;1d zVF@ypAw((8sB?ZkUFp%}Clc^8u zZ0u-fMa=IS;d(LNJKdj9k&1d^g#>MwE#Ad`d{ zo$&r=NBM5xHA$7C-2Y5$v2b%PjwK!T_kV}~|F>Gsb?ZMf?0?@SxsCpxzhWH{1Sb2j zdYl~pGjFh$pCI__Sb$F@7RxC|YdrmXcA+MZ*CzVk|A^he6H7i@J-_oe%_9$tixB^F uc(vUBtGDax{>}FQBu^E||L2bmBX{aM_z{!y-uEBiM_pM*sZ!z9`~L$Epk4|9 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/firewall-rule.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/firewall-rule.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2d9bf40a8e9471dbc98533a5555c4de37f76e8 GIT binary patch literal 77051 zcmeGEWmH_tx&{iP!QF$qLvU-{-QC?KxVr=h?j9_-TW|~R!3i2@Ai z4*`K#VJj}KA}cOVrsC>sW$R!G0U;BemI0@szKR<;)BQ6Jwx&CSC&g0J$jj>EC`!KK3kZTn%yei?QX9B z+uAn@sD1NHHA5=YjME6(b5O4Fva~NMfo{;MKmm1LP9Ek@T0yuQ|7QTCxsbJ1bu%~1 z%!Hp1joe$-$(z(#Y6Y~k;j3=}rM_B9;qFe{m#)(@C~5ho4Bv&_<3;J}VLeT#-@$SB zAqG1bIo({-WHN?VNj&YPI=qE$w*|bF?`zPJX=-R}fHQg6obJJOKAT>bmLU+Xv+RRd zA(1w@=o)5(*gm%3Lp;r0z8-`~G(_zik|b)Nv(^$<7JfH+D}qZ0#q|mHI`~4t615N3 z8^U=TO-zL91M~z0TuCr8nHYmHGIu-c$6kuy~fpoyM2A1KTj7R-C7pwb;2hYIgU~86Qy!+C1|8aQ(Z6 zOp8f51&q&7Zt!kz-C*Yv2>QE5%o@gZD61)#&Q7dTj^BAgMGaQ$ zOuE#5K_?>2h+`Z$873Yw>;vscxsYB^b#ZULISWe|K{|)MLwv$`^6@7P#1@uKq{K(h zMIeV^F~uqT=#n@q^+gh&TmcgpEhV9CM#Yx)B}7Nofy#(nh^mJ=Nv4B}Rt-N|d7M@= zIX#TxYc2 z;tTtcWu;}d<%5OM7^Ve^1wrG4#gzr4h4T1jasa(_B1fwEcmr^0OmiYHi7+)Mv20v_ zB5KrnG-I4Jsh8zd0kX`be7mMklTL&8lZ&irW=zp9)hrEE4@wXj2+>0VqspdaR82vX zNfq#UrG~e*!PMvc3YY|%$GZVfB?GR6%00u>UKm+GR50hOH!2Q6ETpX&FY zIz$%5)5`R!*Gksv9(3bA@7JV%ZdI(2JW1l$+t3hH2q=9J0x|w##iL_!(e2Y!>DvAp z`uMg!vO?<1uw5MVTf?_l*?QSM*0*%_S1cJ%f>Hl=nav;1{jpA{E9=lAW;W_vz8 z=YEzjpZ#W=);!Vto*0E#n7Cm&FwZGZ){t_8ZUbtAW<%OnLa@Uqc@wo8wflX5<1^Va z*8|GKEeiY__b}`*!#8(8E5 z{HAb|eVsY*`Q|hI=f%%$lO`N+96hT>O`8#!5lTp~NcMQB*(p;5`+WN-`{KCcxFNW( zxXie9Od#f6<~ChVy}+i%Hn}!_8&IEK|JqhZU&qu#TwDdp$mg~Fc;=y{5zlVNsuOzw z4uSj)q0Y`5jYqOa#T()qV`3s=3Dh`L^Z18&gm^z9xSuiCD!%m3*;vD4^S0gdx@F4K zsMD*{w7IYDY+kZ%d_OK7lIAEji^5_f4LuB3Yab1%ojBWI+DJF3PWewAZuM?yNqk8R z62wW0k+Gy0cIkH0%F@b4ubL0wK6AJ+H*FvRfk&FhizhYP#6Uyf^NRE`?P^)S_4@Lr zSBrBe=`d@bbIul-e9DmNV$<+5@$>S7F)A6H1dIkO0D%()8@3g;U-U)vdl<-AGU{zE}Ri8#T5%5|NPDTTMqj<0Rn+F3}Pr}KM+Tc z(N+5zaVlI=O!l+e{`BN~)!;)F+|(A%DlUBt+r*Bq!#~cxit{<~E%K3SOVt6g7z-Fj zPxLH1?5-;300mtITE*IKT3*$2x=p52vwFj8&qtp;qL28Oj%rv9gp<#5jN3xKkUI|6 z!D_(*Vb8dS9UK@Jm?l|?UZ!t5BPp^dROhy7G8DPCihB=&wz^k6uTH17V%mpziWs8?iqZkC*NZ>7*_b}rvmg1+x>lv?$2*NolFVX2*h}GeQ)
@KdgFR~b8@w^tW&J3u6A`V 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 z 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gcp-pubip-ssh.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gcp-pubip-ssh.png new file mode 100644 index 0000000000000000000000000000000000000000..558745de3e148610194d149412ea596404c066d3 GIT binary patch literal 24032 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gcp-shell.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gcp-shell.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2fc3d1b5db2c50cbb421407798bb8938c7cf61 GIT binary patch literal 22858 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 b67XJTic9(n)5hh$&OKvcYhHBHZl4?#!~`MA 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

2GGLb$XzS1T4*^;nbECNuj!a4sxqQvu!~%LU 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�)YEa>&lfCx6yFX3w6? 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gerrit-correlation.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gerrit-correlation.png new file mode 100644 index 0000000000000000000000000000000000000000..4972e4670172bde3503adedb2d5ee4384baa6a06 GIT binary patch literal 61584 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:If)KN8USUUWJ?IaStvLDlk7i1Ssj7m>`?6#$#`| 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 Z(949LC5mbLGM@t;w>2@S8g<*S{{m!{7%l(+ literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gerrit-dashboard.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/gerrit-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..5051a175376f8c457c6f1237d783a5e7e8c226ba GIT binary patch literal 141826 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�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 OvNW~1j5GPi-G2gU=F-dn literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-config.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-config.png new file mode 100644 index 0000000000000000000000000000000000000000..83ffb1c36b9963acb3c2dd893a92543edd5914c6 GIT binary patch literal 222400 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≺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 c6VFvF(P`JHVf$sGLZ_TYcaE1E%Qr2LJ#7 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-rule.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-rule.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc18f54c59e9e4fd228addab54e7d7be3828197 GIT binary patch literal 198124 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℘?-rSrjcsdwd?k=NU0s{iDAZqk zPWSexY>u!YgFjtT&^%HE1E?OV91oJp{5MT z_*`6&tIf3o6<)418jJTxCH43jx8uDe`lrp74=>w1U44CMIPRPX7!7Aa%X85e_t))m zK{u_Lupg82xE@0TFZ*UpTS?jvrdtZ75~zJDqE;L+m~|gR6dUi)IAGz{R%YIwQqhbA zkLHFN6x{058g!?PfNfeZ1p@W#T=DT30*RDf*A@{lM^|6fTfGu9OB&z!ydM96DEnXZ zwfOUbk9_Mj#6lQ3uh4qXj!_J~Hil&PdfS!mAgh5-RBYX1LAI|!E&ue%9ZHuyG3n>P-dawbNgumj*K(sN zN^^hhz(|KDxH-#NFOJshhs^f(j@ssBz2$lj!Z}@+o9v_r^e={qrI2l=Vxx7E$SY^=`I4K5o zzw2{GWoxCuZag-+Z?ttIrsDA>E59YjV;^v?Kv_?_LI6w%TZ6jT17I*~Ad)+8$t zXs0?!s`CtemoN}N%a@s$7}(v7@8Z&!sM^oa1kwz8*Fd_wz!uAi8#BFO&HMF+&-{JGv_VloMmp`4_1nq=3`etoYCr0I(QZ+fr@%4mks$(1IQqE?th(y*4wg z-_uWt(5u%ww5@yTPL9sF++;Nrph(J@!%?~Y>=@ieQ#)W69rhB2;t~@RUC;824RiqR ze~u@^t>2)yt&ENb`M4@uQYommA01$S(<9eL_dHKb zrTeJXBzA}MjOy0vt#cZAn-Z{+diyO$d&GG945Sy6P&eC*W-4)s$v1ZRdFAAEhvn0p zN#x*dON!2E28QjKepE*#^Bm) z8)$&Ern;cZS=qqp^*Bk{b|hq?e8fu*O`v3;Y^?}{qI-9BQ+%($hR5_nrowOB zs!fNBOi6TPWh45$?0mxaTyF_G_NwjvSXWif^D^=3a%*j^^HABhmc(oaU@O(+Tt^&gunTZkrwfU7SgVhG%ET?~;NB>5O=wGPs9 zhq)X1LMHKgqX=(rY_aSLe%|^Xez@FZPlgImZY)rpUnjC-1F~9Ty*b#~Q?^lDxH;sT zqzlK>7?iB=Ozu#|;&E>FbR~z10V;E5n4A-)Uw1VHuZqXBwU%5RMsbisSma*IyNmmW2gRipyn7(!hDo<}H8PGnafVwro)x zuUKk#Y%yzFvQh{B#5wjnHlN*gTt&taU_qB%uD6n`6SP^hPOf{+e6IVUH%7Fd+7C^0 zyqu58rCw*&b>T%dd^E?T8u~(QwNeeXNLUIlDM&f|c_u&#lc(3D6%sPEDJ)%lsx7S9 z9*0uBZc*j8zk)c_jpA|r)?Srw7*b1C7C2z4QhPT&tUX82uDcqt%$LOTdJcoiUdd5* z;Ggu?1FyCOmVz-;;szFAqY+vgX2A$!DYidZRy&5GyReb*Cwq~;2w#=vVY4f#S!HLR zk6}i+jZ%&w6tiAt4)(Hpo{7HN6!rRB{T_A1qp$q%`8d+sU8rz{{iDb89V5E^qn=W$ z^L&Re&p48O(-edLoCWA-=6nW6$Qm_+AKf&eoVCA@T^mCb3}%9KA9iYJP#;M#=rq~U zn}SJ*h%FzY%*D(d=aa_bY916iXZj@)1h=ZA4LB(o{UR39CG@JdNu;uzD>95eOW^OQ z5VYkL7GmgGUy+GOedZP^>+_F2mn8_??(FIbim);sY`slt4G8d4SSh{Ha+d%^jx9CQ zN*p9u{@G-qbAw#D(Qw*KBY*io79=!+939`dG9J!b*SpfShAjPl)PO?o^;HxnINSGG zX?Y$n91?>y`(B7tA$U}6e|R--2DY=;a$?^eKJtT~wb*lhxsA-8UHg(t76}ItVloAT$!fGi z63N3DY&+NXjg2Pf&GGrn_o6_52?0jB%RR{e=jYJ14QH5>q8SwqtWRXwdz;e zEH9klYU)z@*%>m1nq3@E5>sQYVk_=D}C9sEmzN~1|I-ouu@-dxt` z?PEkFvNn$PjS(SMbl;1J=v3Sg0>zN3#5U6l+|TuLs^BK%zh^)np-^v7?29ZyRrdmr zPaqPNK2IP4fS!pXgwQTI9{NOcK!|Kn=ZJ~`Oly@02@)5v(9lkx~j%#mB z-5{YfR6OKzwIMU=WG*6U#L&M}iBWsjpb0UM%PD{K%Cd}vu%tDJ_>Iqe#kx$tTt;{K zN5ri}iBNkh)?wmpkxjH+5M>M1fI-JhO>0Vt!Y}hSt3Ib)kG{KK*wd%Lp1Zfg>%=RA zrFSgC&*tIcd*kz%dc{+FscPLY>_p0$bzzcS;81hK)beRzuad%(8UWE$~Cj@6c-JbeF*9H{k=Wmndb_F?U z@~QXB(%VOIf5g`pl^);Vzx{wu(0$mees5r4C;2ZF0HbfJ=B^rb{400v8={;;dk52>LH45$JPc&S0I z8dDDyaE4q z@ouITUYwXdFZDn4gV*;D`aqqFG^JUm0xn_rF~~nlc}@A2b5#lS2m|D*scoSpr~UQ{ z{XS4zU9~G$PB8Sp4jsV4-jTa!amQz_<(6`XOFjRA^qB~B<}S>*ONIZ3FKs;G%jEXG zJUQ`K6aZ)NfPt7%zO%{9oBso?%^>-J1hlM;h-k<7_H?a%?85T_hk!PMju;N!Ihs2A zmP=PLl2uy{w7Zf8K2tH^Z_<9tw7$u<@L5hd7;Gm zAK0TD(TCH>|9xkA{PJ=jGg~|uTV^^3MAkg0ATlYDsM_wLk^ucBhZ;;P|+(jt(q? zSG}>3l+h{Y55(1GN2Yy3Vq$u?1Jzo~?xVu7a)ETFi;?PwtJ4!F7;80BLnyj z^Bri7U&coLCwu||TvgtD!0s%GG7GQ|wz0S8cW`jq)3_*~DYpO$1E7dT#nPgqhdhb9 z1_lBhb4@kL`T#P^f)*=~eoZ!H{H>z-1qRz>iFGh6|LhEVbP*Ox-6$v?|1~%?ltESa z`pPakJzYOS+)b{xiHC{`>3FV8|J@D_8QHAg9Qx?*ZHSc)C_O#>Xia-#V_u4ET47cH zkby1$tCa7#tU8N29Z)Sd=q^m)9f+Dgj;*#_-nG0NNu?W+Qd9SD5(wMQr#EaSKx{|% zu16JXO9JV5GMHP@1MPb@8TgsJ-z1JsW$W+QXsw|rr^ zajUok3w$J_qihluR6610UUw7aZEqHAV?`PLV}OjL=di)v%ZT<{i1Yd@2_HW{o!1*k z%sIcy<2UD5qE?(c!tOW*EId5mxFETi4JWZP_RfEb9qWuAcbt);gk(z7evIw zh>0N{I^LfVe){r>tU&%o{k$|2r;v9Ycw+7KDxMEjXc&Ho@i&(O7gSDu`r>i_J^%Yo z7M+E{NpmS8G$t#o^NKBo7g%{l5=QQ5aIBGGz2-9WOzg7W^_=Cw8q=5iRX3EaZG?+M zV{ILn^zQ=^Xu*K%$JQ;Na*lj!#2B{`FNq;v4qWjAR@h%@tiSFrF5~P;|*Y; zW^TORzxR!HepG33!XlPz{=8goDLkIR6*kMp%si)(y}Ghe6@NPD`&Ko8o&8DLP2$;! zea+=sl3L!WXRD8=J6$|socmgQPl>c2=ly|1%N%T})-;^Wes8NFwO{w;AvH|#b%-Rh zKkK{iM6tXuAbXP3{`mZyTUi-|7A$_b;S19VSmRl@KO!eks|ToCC7XEiMoj!#FHx43 zcs4>;o4}`ewOnt<8mABd#{q~SS18kR)Ch3GBqTdAX<%QzY!w$~Fd|z}JNmFIjOF&<^g^m-%m?aO?BDICcv4g4!m6|IB&1q5VSuX6)ToNt*;Rfg$x z4Gp<(EhGSU-%<%@1X`mH!_^A%5qhhJIjA3(ELRvRFt8AelZ(@4&zUQJ0Q)2^gv~!YEX!i9hqzued`n}Q2g_P`SbB5lYRAz*l3V3jIV^@%@8rZ9dNk%8rYz2OnraY+*yE|h4RC3W$0 zhdfNgPk5cza{C5P%DV)!#pdbhxu=rJ-A3!t4|T2e{uc$n28e|4z1jSMXhXx|G;Ib- zGN-4fO;4!$N_@Gw%ke{RAq_Mte*d6!p^&VTtQ`<#AkMwuNc3 zO09xhcDX1-KuQs7=1rRcR3JiTl!r}2k(|pKlI1x-c+4;?aerU#nA2i(_`9p6y4i24 zWUo+BcY?-Nmq@(z>hZZbc;$Ng{V^5(9F9c#=#7mm$eng3$9avE9SLDfk&eeb3?Ua& zQ;`a=x;4E3&z;RcG7?*cwwj}sCf(B8s~>x#Xlt=@Y7)aZx>s6*UKJT!lOd;~fFb(s z?L4}8$YK{yPILou)o{i8z7RX=?=J7RPeqoIU4O_~wmm`*F3-5QxF4iB-%xSxh)ya> z(`;Vw2`gky!nHC67E0M9N=y5MjO=$)=T`rww0C|B_V)F~BBFS`oD{~{YJWZ}%+5tq zhJ5EM*2&v_d_V{n3*!VtZA2vnnZs$dw6qMV-f7*azcEHMUf-#2N`4B7>+L1fCyh~@ zY)*Jec&vF*E-NRPd7`{fN`Qv+2}tzb%gCo2 zQ1%tag{a_1Ey%vX1>ZV2g=IkrBw&e)g{aWXb`r$E;Nb9#=FPv@k8_y^l}D-D&ebLq zNPha(g#kM!PYvI;LPSclt1a zO8v4QqXGl+hlohfZJcaSO#T~c~mSUW4KtqF3$ zG|@7{p_qK59Nk4PY}Y2&IsS!OTY?-8C(`9PmcNoj07qA(^=W$?qm41b6DX z-u|j`uPii;g)oigc7H|{+ojO9w$bHV>4SU(OiTB~YQsR!!V!1c?%#rK^@X>~8rHh5 z$2&}JmH|F%;n=Go0RMYi4zue5D~LqFGQkA>^z`)6 zf-r5$ldYMVD*f7~0D)+>AyV2cN;S>s;J%fnYcxlqNID1mZ;x+#sTC565Sw)&!L%8k zd#Yj%SEz7%q(;9}R5clz{|KES`e2~@WMy@l&w06yg^WiEOsduWpvrZ8MAr}3xY(BF z=4Ume+5#n?v#Lt4UZ{oW3H-KsZolf8wM#Nl>Zer`J=3P!LX!EuigV>eH-GHP-mw%h$FMI=|12xuW`%k3WO`iJFX>e>#wTa1MJfJM8` zhq6uS=_ZmbpxwAQOW4>Hd72n@g|sK@p5FCMiKy zR!EG%!_MA5U#Y6;uww?P&1D>$E6h`t7>}E~-DLI`QSgreF*&qiicMUWD=^%c63|z$ z8()lN&%I=02|wh+3Y7=|M;>OJ{9cf5oZ&h==)9xx?`Et{m^X~4n!e@7Z}uJfmr{z% z)hi7AlHx5E!VY1;^toq#+UTNT{`38shj4ONQN8kFl|73Wj#{VhWZRK=6!%@l+;&ff}YTeTQsZx1p`7A_T(an?k`R1cG zw<<-6D^-d)qN2d?)gI3peS{EA`vYGtY7Mm9U!$A}`SB7%4M<)fQ>s~bsxLEm^YVK0 zgtPiXEvI@jKp}4MZ;$VYBA~5vmX58y>|7V4GT5Q^tZH!_duejy%Oy197u;enf$$An zn=)5KB(a$3pbu^I@eu@vrKOj1OIZ{6NCX!D$=!D%5#W|2y*}U4;UPH7SEB;jPK8o^ zlZ$I}JHx2GNJ_z@TicelAZ=Tav$+T~qNAtO0!l>-+M+jjyK)2MbMyB=%?W>2(T<+^ zV>r7IIY;fx$B(K)SWI?#kFrHQrfQ0RZs)H`X;{0pW=9I4^N^ex&oAk(kYUs-@z6OL z8u{&N;SaMJUj9A5E^E<)UD4CCxt}+B#6BTMzgB2@2184`K6s;D{YoG~?dx0=q!LxM zojeWj=dA)Q62X#d=bvgx{?N3|J%#z3;mehT(|p(i`)DD6vfm-L}cGA zSn;{S=30+@$9!pXCF_6+X@uHPEC0{-iP?&&A_8?`S?$GE+a={N#bk#ntX@QCZZ`B% z{rz-5dyG~%Z5wSxO3K@Hnr{Z`G^#HJBpRR{gyi{Du%sLpN$y=})p4iTr`Iz`fI2se%abtroLtjvFyyhrXXX;i-8R_CE@BZ|LK0q*Xs=d>>jJgPmQEN*W(~q_;OJgM}NNl^nr)?KFWsKk&Le&4EiiQ zI95n8=C?>eo7-7>?*UjjDK(|hT_IxtvAy6AHDmz>Gm?UM26B4*u!&K_1LLgZC9hwiETV;gF`$uPm7+se(? z$trseaWJz73Z-*>VSPI5Gdm-8ivWay?XW#=(#GN@BM}qa>S{Y$>oGY@9;c~6Pr@<# z$c*&KaQO5PB5rOthQjfITxnVn?rk0#^?Kw$m_GEM)D&QCq}zb{76&r53Issyg+iY} zSWJT*O{oGm9?xir@|*+f5r(EE^y+!Sifb!nj{U^eAzU#QR=4tLixm(%_JP;)81T5) z*-p8&Dclwj{^9VBNS}X2v4VPj^5Bn994B$~KPjQ`Zy%?|ekhv}?m{eN^TXuO7lWX@pMIKhPlJ)hWQg^al7c*pPh%+Q8Dfi3ysfXaYf3-%DFrfQf-xjhG z81Pxo?S;GC$VKKGpHv2?U@67I8N)+@hlHqTU%IpOPo%Pg>pkk8Ey1eBa8`-;EieZH zr|k-yh@L=%c!k`bC5mQxTF-G`Ark!|UwlDWr#HV~1a!6_$Ci{pMlhTxpgP{Mn}RZe zpnnYa7TQqb!wrPf@;hc`ikQKrqahs}&`=d?-qTsYYOPR#uCJywq4BRH18YL)w(Gsj510#HsM^x0`AU)G zo0s@RLkOm$t}(p$zP@1C&GB*w6oNPQc2}n9>v@!~6ehu52a_!m;bSS)h>a>|k(lfe ze!jv@IXVlAQ++Z+-Fa(R%lA3X>sAL+dQ`}xn*>}%RMrE#y=6#WehQM^zKWv^lOkB^Ox_J3)0H!$AM(cgDksMGJjPsd`fmHmVnT@9Ybo-WAC=kZ2w9uZ>{+~-DI%fW8%zH0GkOemZZUX8F1L_x75xMNw z`Jscj?x;{_5|_@|(Xod>nyZVFFWi4ou`L#NiOy+<04m%>te;y$u1KH?#Q6-~_t+Zs zyRqDKT(e4NBqq14V*BCmsbR6c5=1bCD({i%B{-mb3W{EEI>-cx&u-S&VCCC)ypOfy zg%sh=h2^KBG90q>^f(;b_rE^!y0`>Y(_1grV)+K%DH?c-+6?W0ySe;P>y~a41?oljkQF8*kkZKuF)5|H|5bdd73wzouD0e*tgmtL+CzJ3AdT zVko~fH&-`U$F4SVxRRV4J%=;&Pu4ijb#!TV=oso0@%PNofPd}6$j44PqG$*R$nM__ zTEbkfeTQ%1M`}kc$xUeR(3lD-FWo;um{iP*JuFMLWy=TZ3H+`l#Q;^*DI#1>I9xe5A9TOIQK5&rVEM3R7CC2ZiNmfuHYFl}?u!=hcEH;ZZzmpP@bj zJ-z8>iFwk^~sqo|GD%cj&|l0*;{S4NW8yye11`AjSX&+89WKyC_w zEjqpEYK4jxoG;Z``d&=v#Mv?nO<$Q`l23Td0Z%3)U~vf2UF2s?o=fJcD4$AY6_unM zWnq+GNRYYbDeB6`HaIN8qB^@kaVVmNeScX~+8dXg;Up^e0Z;T+?Pw5QV9rkH03>`A zDQrqFuanp7ra*sZX1s&skz1fR2+W8cbo0Qrht|agN1!ga(?LwZ&jK_M^jFW)Ky8;8 zyD~KTR4PD>0}2HMC7&<_g}xrjG?_iJ2N7vH;B3K?L@Nzj3AHQinO+t;j$CyyuG%JV~jee5Jbddcor}5uNHvSs?r14Lyq|Vok)Jo zuSpa#iTHyMAiH73y8;MP!bejQ_as4N)rqB@$Ed1^j>VQl|%ScHjRwu+XOEr^A^oJ{7C~GND>!Lc^exV z#cbH%X!mm~v&@I0y9P}k6og+6lgWWw{FV*%<3kkwT~rS@tkvo=iN5mV`8GsBR9^57 z9;XBBc;526tt`Zk+p|2zrE2Nn_(4kexk~eUR72TB6Do|YttJs^x4W+JU0y+pVD%2c z==-yoOyfLbIwx0k#R@;|uslJJ&rBz}aif0zpNsVKPQq=~>261oU0%bD>5dBpLp1J> z*Rf9ZbMk)7jRU$@0>-~JviR8R!y^PbKCZ^U5C`hwBu-azJ?>QjmDhZnSlUE(Az>?1 z(+rgcn`VT>1-R_ZNJ0_Vc?RU_%;yDPhBM|KWp@2iC9b%=-t5$dLrrzhy)(kv@zt*A z1LD&d+~CUYN$@6h1E9|f2cPRuZ3WVUzPt^xX<)Q`h4jn-d++=ZmTto}Zd-C>UgFd9 zi)DnSYx!+OgvDG>AFX{Vcz5PGmT!Psvt*=k0mcfNIC#1byYSll-&qcbBJQvzQArrK zqvmF5{&^j*m%?FLazTliu5W2tZ|h#D11oPwN6G%6_HtW4MHN?tAVphHx6EL#X#mH` z>2^;9A|m2&R}YO7xh1FU0mg)Ly=MiK*o3#$7+oH1mm^c8I-vaFH4wVr5rIVO!Z9n@ zRlI}G;r+iLcJYimkrmfBHipghBd%WafG&KuC5}6N`6;1A(8wF)r?1V)1)R{O zZ5Bb9^vG%HS+WrCKa&q5$nP&cU#Rw`K0#0@vxq7niiV$-xJigVQ$vEMZ*>b;78xem z1hF&mfKDAE*xIan3ZYgDD>y8NPN}NfC-nW6lAN76YD}n}`N{7!`B%vJd%b`UXELEj zy^BiN+D?zLtgQW(P%GJu&d%mbRZ<# z$FKR{qUX<9jriaudY*zhv;Osjpp+uRr@+sSuhc({{5^q}!-AwFY2)cQR{h5Ln7yeq z6B}B-l5idtQ}qA7HHv^g-G)-rw6Pc99c)DHrz%#h!iQ@h#+$Fc+H)axOlA77_b;%O z4h@r4>nZD|(^T#B;3BjFYW=^*IyKs^Q-4>%#EjWMEMHyOsi>%Qwq{(7DF@6L_QyJq4P;bUv}ynMRVrhA6sPz-Qo+2} z+)fNx*YD3L(vEltgz14EW zvUPgtpi^1;t-C0jMIxw1=@cJjNQ5#wWHeNT<7aR~{Vhy${MeSHV0)7Z?+%#xpISHJ!@ z&>A3r1_;FD2{yd5F34M@XhdvS$I#l})8lDldb|KH6!dYw={hPUA)@nx*R2?5a%t%y z+v4Jb=@=&=NnvNt>Nfz>`>tSM-g-OsY-8&rb)VS95x*ZO$p z21tcqKx1+LB)ebn=@E{Y{MG&?S2)5uGqd97S`74uzP`dLd?%(6r@)Fx>9UXAbuOL` zng5J=)*}HB4z76uo59e1C?Y@X-UHYz;gE2=r#sG2txA7cu|EYVse+&T*6qCRx{og@ zHF*FV{{q0ll!3cYCs`L68d9=YXhh4%z#i59APob<>GIw-NW?}%PAQNmg|)GF6rv&y z`EnT@7@e6JS$Di0m5>okKzLkEO>N`gP z4x!U~pXAR1^7DxRS%=9GdXyn+R=<$x6Cj;>aT6s9tq~$06F;;mmZfLyH1@x zrx}St>BOS%fK2<{)`Xi?47Mo!-RsxJVOI(GO=eFCbbM9L6 zuEx=Q^Df4E_>Zvjez(;hVW*Dk;qLu+&AVvN;irjDtE3%g&%5OFqywZKRvZ{hYclQ4 zkKyOQNk5Jg?2Ffr6Rh1?j_BGk&i6|St+;`!0`J+F{~610#k19nGa!%u+d9tJf~9?) zsv`UJ+ipqf`h(W}YEgp~TjEoj)nmVNF7|fIrDyw(qdf-Tq;vOO#&&IxFAGac_@uNS zv@$Z%ESat_ZeQEa>oScxtkoS(fw0r5D6rum3V}?cnJrR@P&R2~XTSA&E-~AYA_Mja##ndE^7HU6S%Hf}XbZuO(|k!{Ccb z*q3G-y6%Uw<70L4U-*P;Hk`NH?e^1X3f0iT#M3JDDVB`;?(4@_E(Biuj;OoL4rx{E zq=nh%-{LFkAuAPaG8!Pjra@U33GMd*h$h9pid{kGrk31`up>tR4uh2Mt ztsS3rES#hK;6AE9cfZvzY1*eKJbPl z`LR8SiLhYRU(lINTlGiBKd)CUB`9H5S2@@7!;&};kuodYl#0A4@Vdn_WG`pKH4cLh zeiOY}&sn#kgwVa$zd@|x1q!5%V$Lm>1txPW@yGCKg01F-qR+p7dZy5PSZjOU{C%3v z-rt$b(owF-A&+ua9Aax{C$L;EORkW^fhEvlyKWS~i>P;YvNc-0Oghq-p04@Z?AG{y zF_Ruduk~<(8@=VxJ*G$th@bRvPrQGi06RPx5fVw;Mow*by)|-tiMFG?x~eLnch9yG zmOxN2*(>|rxmZ>Qo<+off`B;%%iMcbqN;&fO4 z4Ri6q2+~Yxe@xvUkPS{M7(BeeMW1VLW6yFPhc;tx&4%}r*+oH=$Jl{_3{YvAB70O| zPbga$d>E!n(}H=GoK>X*=|iY+_fE|0z`@SgZ%}zF7{2M+$Hkprr3p=>OIybec)acj zXNge$vGWBBew-|O*Mc_9AVn>bkKgxlD%7hWWA#@tlVpSNKb=>D1qqEGA=f^! z+RusTx=VQy2(GveTM7m3seo?rc93QZlJg3EKvnd3%<@s|sB)~ykP~(}zRb*u75Tb@ znweEavi8+N6s`!@os+RLGGp4V8MZOG^lLm%-BK3w1q?r@{?HWD!?b<_i^wPjx%zNp zlt-!R?R=4ZN2Va}#q;ibUu%H4&5a5^AWTz&^?AH|nvi>l4L&*Se=DoT1XxxYIvPrH zJ~;jiHa7O+2@^v@L-H8k^z<^jlVN?#Esy{SdnfLehk-s20FFVlYH?*0Z4btkr}`9K zd&1)qhOT0)HWOLwFSH~Okfpxw6jqoPev9F()3cWz_WdwGi%WlkoHOW@qJQq;RfOI3 zD>b#$f#7jH2h|aNN3bT!_-+SRmA*2_l8}Gb+!%WNE>vNE5e%RyqbDIw(Qg%z!#&4n z*-mW*RygU~NIR^>-lmx2buJYI4w>ic?TgZjC>%7(S=diH2s%>rd3gaO+S`)h!{E)V zec5Cx6@C3TaJ3EWjP!4hEIG9cn;t@V0GI5M#ju)B!J%9RuJTDaX1596-1y&QRCp_JOK8?Cl{NL9q<^ z3xT_E-*zzUQ|4aJo7Uo8Qe`_{$I=+(?nKZJ!?Z@nqyz)7Cnl#mAKXC{FVD-xH2le$ za}psJETEo*|9#D$hsO~{w1H{O-5EV+x&9}CAq(HcwsV@o^J!yJFzm{VpTyYLlkU}q zNdD&o8~4Xsjd*3`?*O}i_o^7`rP}6O0L&o-TG-3}YlW(H<G5J67I!Lp zpyh~6ugm_K@2^pw6`o*QdXI6ueaA~Uiq~IE%NK`dfF;wF42uCs5og@5)QU_PU|OIN~waptgsb@ zu+(aF2UKMbY}PEEpT4M}Y3Am&elw(WJjrQ46|2l=3T&1w$R7dPc)A zxlu{rWAQd8a&pu(9ZGdS${=Gt+RnjKs<(kPR%+yjEHfcB5l0aig_NF&P@FNbjt5o_I(Wo>- zN3M7g9Ps>Lo_*1%tHbR;1-uH}0xB`W-#pkU#t>V$v5)7h166jnS@~rYT+nIcQmJE7 zdW5C)?lVAl7@CEQl(3nt7X78yyn=l{@EGJ7+Y|K(NuMv)Yv^YR5ChL&h~bDb9zZc! zTfpso^EYz%KX0S`PURQVFw30R_8KghmNm|OG>Iz7K*p&CJ2%qWfLSchqch~ zj(gU0>_iTwrY!D3^97C{+nsJeW2iNpo&_y_hu$C=cH^Kv8p?8S6dW08SdZI9hsR>M zJ#;M5im*Go5_a>3h!71T9Agy+p#tNV5HGSr7-G09HVS$)T(pRCYuifPDACUZo9Lv4 z1r>6LpDNvLMbA!lwLKy6fi@QtvM@HQ zZx?W6bZvCC(Rz-4h;d^XecNTdo6>vlSI0hkv;rs6K^jXVeSFkQ> z^?dDOeZgC(0>q04C&#q+HU^AbVriKL`cKMj8_AP(qmgkT2B^*G1>jtytF6pKcqjr7Z zux0AHx)QrxOmQ_MkyouQYq#~s3ik34y*XZ&eCFvr=k&udrs>Pn{sH4WDMsyAp`Pf} zc%4wy%8DrwSpDq|x}LNGL#^5hEJ;0QL_sM*p5rt8^{1i?i=2LQ!WS zKQFUT|1+Yn&4$OyuIz*BvNnHsLYi1N=vf(mZ{Kuav3$b$bTDkHc(}JJDB$@{Kg%0J znapew+fBJ^Asv(J$47cAa+O+}3^>bGsz{n|vjto>I=moy5a!P3Q#e7$`CHsIkiu3a zuF_IqpF6)>C@yq%NKJQWhz@uk-4UQ{~*FY&A$_6hiHd? zR+LWEWS8PLn3 z-yJ(k5~wiR9L9&snjrsBhpZwDh2Lk?V*E7f29Jukb4?P;QmmxY_cSzJFf=~iYai(QO?gWA{NkoN zlg|yCO+}txjy)$hu>HnsLh*jusfSb{g=wL$Jue}*>F*47oFvGkX?Lf1@zawT2$zIp zOKjaTbQ{Fs?J+=CkHAYbQ)nZv0O93Fdmp(a{9Rm~8E1qMT_yX@yJr0h zd}-x)oga5!+X~)go-o>?35IC!VV}F#ib@;58_`Xz6Uw3{W-O6q6-zVH4KnPcUC^{wPf-eWwSxG6-+S)w@s;Dme@#v8zM=7xkP$n?fzqz zw!}t;UqreWz&vSNvx6w$-UHacqc=zevHIk_W0?(_a#|0pr}w;|b9@ozJ{*3lA2$26 zOT&FGA#+>#6o7nzKtUUVC|3(!dzlc;n9q|P9ov`EjhLq3{bfq%*IZ@Y%+26<>FlMp zA}LA zv?w>MXHTsu#yqasq4U1%s6y-Wm!p{tHxoe7H;n#x?Th_}UGzN)WU!fy;x`v~r2D&a z48@0Kq0hu30dML8vwsFixqdYa+=gMk706zX)k!MNPXeCTb}gYRW6>< zVk=+j$c-HCx|Y8L*ifP0uz#|uey#WN-x)O%dQhoC?NnC+1qmTIZ?|5^pD zUlnhp^u*P#gC3Fa7CR`?9AxDt$UT9%X0T%6wQZ+pl8tNw+Ag3g8e%HzLw+{I+R$sL zd&NgN-rL5%bJ|@wG{G>qlT&Q^$;+mE%}Df(aRh6iy&&r<@pO0N&L)2j8Nz1jgd?wHruUhU0=dZ2ih<@ix)i| zof^7sA1Wj3R3Fph4OnR>7B`1x{d;&23JMBRyNkXS@i2Bi6CF=@+(r;E1u!|?H~bBm zP#CMY`xWzP?Y&Gakq&#Zpng~9i%VlI>j;)70v9g3E0ArYaNK(Dk6X7Gr^_sbnB`Yi z;qyyjQp$vY=x{u&MaVImGnlgO$b3(WA~sj79%j_#b+kNWDv|I{sc$&UdJ>L1;wrBh z-u2HdUd4m4LqLZToBKU37xO@pXJtT1>w2Me;ffLTfj@m+)ac&W!|)(Be#D1)Z}jGa zem*iolWnt<0yB;WPpGLMI7#M@ZmWWvTqx2}o;U$}E)u{2@d28Ib7Irv>PcYfVgPu4 zjB8;WHc@})`RZG(R<|YB(0J|4(xrwXtRKkh1w=MG$!qdZ^4O~QiV&@Jb7;6@I;iqb`Z*SeLGzF%E`{C%Z&&V@_{4H7zLf2+pGI$H+s$yWcHPcDd%kAJ zSHwLJrKe*NshSWb41LW7*1*3a{qN#37!3{4lV0vTtJmnK+~>7Z>?w696Vnkx6Rx=~ zu8h19V-0!dE0w_H=*b*-b?vK$i+fvAyRf`f(xxi37wA4#zQNK~>-t2vh!4Rf&u%X6 z?TW_xc9FdB8C1|MRGo%3(1JvGZ*!A{=QBl0W_~!%-AZWlMK-cu8$BV1whcve-z}P4 z;7PJz^x<)^ONY_ssHa~IBVt=z&VYx1=9ZMg{Q}X4CwpyrVQ*Hn8zMu)3Cf@23h1l~<6O-oZe08p~6A~1__w>A=)TlmvP+M4A1Pz;yk(LM-idssN zW?mSH@r5-{+mb;kG-c=-Qzc*t1F=zzI=Tcx+Eyoj{2H4ix z8Y`fT_rxWbDG#Yq4!0Hpj_m>AC+fqz%B)AqVM?Fn%JhCL{}RbZCgpApyJ&bYf{X~0 zL3RdF%9oiP*!{=G8B}pD07f1r$7yf zreSbubscP~Ppijth9oy5eOPdhxD|F4or`hnr*|UAa*`RLgkn#w#yzpr;78geqfYUpO* zKRCa-vFNg8$T*Znqk3glEu!LY6@GHim@#Pj7FTDv(LX1W zlEbdYnK>0p-^kB@Q0r`t6zfg!boiD;HMuA9s-fXjr9*~2X4>elAS-~phi{eGmXws_ zIxvbORqwN+x=qCr5lX26lBQ=)?jKUTMX2!{I{GP1Prom2&9wRB ziACvH^gV-=k4gM@Ch^WmL4iF#Zz9$t>bEsNsOKa3N$ZVV_3Je|mCGGxiy+WJ=CihGGoU>POqh3RqSQY({V3)igC8_<%_(7?11g79P7D+{E+50i5( zgoK17%IlxD+!#^DebqPUq*Hr*c)0%}*!98O@f9=TD`foDYR|zLaU!%Mnk8v`r7ffK z831mn4oP#%FXH?L%RL24_;E!B860D5s8rvcpDChmkAeS45B7Tt_h%fKII0%`p<=bL z`7p^Db-qZ>u;ZJ|*r!;+=)nla!%gsB4EsPjwonUi;ORHr|)E%bqxS_O#T$18c4;rv3&WGP!QJ#t0ihlmrJEDUX^jOLim^G8&6*#Pl z<3ec9QHDl;Ud*CSOI9=B5VA_P3}y<8`kuV=#wk?Qu%0Wfn{p!8Exdv~^nG`wK#Ok3 z&O&CPrX-YbMB|~}Ef?tqX&V(+L)_LC#i)aVl!Wmm;N!$>smz9ZHGDtifpjgWpkzz8 z4*3vk71xSDX9{8wBaUue8(Nr#!tY<*y!);l25Q-i>_^uwgw0b{f_@zxb|-Ae!rBSt zz|=a=K1I2#)qF%pyUHjI1?ZE)let9obW!UwM60&G`kws#6FA*QM3UolE035z@R-YX z^j-QVaC?9~+xX+10-l71Zqd~a7b-FeiuUwZ==HuqVv!X6!2~Y!slA7qky2By+r%I2 z!Ot7!+7XoGeZ80RyYrQ_88E==9<72J=?N!S=tdl52b6ubC^M+~&!mn(%v95chDd2o ze&228g1BLQBC&`vhhB=WVZBOlGwg$kf+Cq(0QAz*@ODIvmv3q~q4gp{VvRLk|BMQ$ zf|lK|7gk;Xb9}?qhMS5_FtS_CAw`MuLI4G);1&}hvzt@qqcmN1$8X&D*Yk%f>*z1{ z^zXd7QihgBTd@R{G8fx z@0e&O+%+9Xn|Gx9C?i^DN-f~Higd-pCVfvkqtc((%kcErTNDl^&}6bBN8SrMZ*&~a zl@^RJpvSa&u<>0cPHhLAWqIYpIrT7E>Fo_T&piS@fgpR#*9=FszS4YCHM0nwlzXv> z$w-GsUtffAN-W8O<-=3BeCoFd7&)U5UAlY|0qW7Tr7XsMRB;9u|F`AtZ;}Ru47pss zrUEj&?CMdvEo=C~H5^A`9^F0;_B10R}qAph`BtD@) z`}rwgpE0y)y&&;TyxNcRMM7=|YgUjRZ<5dZIH4!Bw?1D@+%*7No!qD&%tE^z|FU~s z`J4BH9y5PEh8%AI3k+RU{E*1?OCi5@{FFlJP>goMXcqK&BFy`=bdcGrrd9BNa*XX8 z_!A6;M+KSlozc8Qag24t1j)N)fD*Jvf81;>&HbFFC?;e1oHAdbZ^nsB3cB0>Aw|nl znUbUO7<#;hR4lcQ1+%*y+sWR-qCetlm7b^Y8#sna{x?J-LulKOmF+4Y758ud^H8Y5 zy^aSu=mwe@Rp&Ajm~3>YxIe!@{o_+phqMYV4@s$Ojc<=USOXMZ2-tr-C$k5R)}*Jt z;9OnR5CrYVezD#ke?~gG`R`-h2OZuNCUxQThvV8x+4}RiLxC)v1XcB`m!{o9z-uGi z*6KtMG=P>{+FofBXt8uH{Lcvs!}BhtTd)??9M18+`E75{nGG%jJFH(4>L61a#s4dT z|Ib~rIRbRL-zW9!q*S8Y&cJhS7B3gBloJ;JW9bSS{U)k0n`&N!Uq8qEM0wl@%#?XqPcqg*~IVD4%6`U&M>VWr(dlYv>9A0nGTqqERRqB znLY#glo1}Mn6S7eT%u+l4-I*KLvsy&!d520RTD0%s3?GijqAqMz)J-f5Oa0V{fv_S zck)k;@Zo;_OT*|u*Y%f^gZc!@_TGleTFG7XGFu>^cvsEef`%D z`=9G1sv#H|6l}w*UHen)lIxtC!vd!};ppEAiitD7_B4l-HvlVNg}qU$$+x zFd!t<)z#b|Aoq6b#QfQizC%h>qKYAm9lOs*2-@ zXd0$>gk=}_F;mM9M28_ASb2Hf&W*0^B|p*=$R-}Sa2_#ZyCcl(3pE9N4UmWzL#{uY zLVLKH15QNiKVrM9?Lm{rq%*{W{av0@U#CLBf{n#Au*io##y!4t*CYbj(R&O$<~?_0 z@FYo%t_7YRHOm91T|I#C!t0%eSrkKXY&wIym@O#|_ zR@V$&p6{mdIIGXF`MQv^!>t=BXn1hLP>9tk8n<7qhTXn3$#JV%$jmgfJg}tTq}&Y_ zT#JfQpZaab7p7a{>qB0WAnBB2az>zG)_0&@6F!L;bHvGTIo$y|d4=A(2W z4|;4l8kHIE%}Bs4tZR?~dne#^s&;G52UNF^kadeyH#K!_HvWnJ-~Hu$jc%KmI+{;` zU7r{h_AOVddAQ8h$tg@CEbd&)3|U9V=47#kFljHzPjs%a#6(tyGS(94jR}6^$LeS6 z1WyOFfmb!befm_+=BXJdTrH@jCjNu|K6g9AC#7-t0%8O@;c!TBvi?muI;25{Zy7h@ zwCr?}0Je$ak#Lo79hRRQ8;r}6^c)l%c2x#(DBQ7 zdxv_|5S|o|XL*gv(a}^TcJPzGs$&_$*Bq@ z!&RM76gJ9h8fD7u&2EY2i_l}UfY%Je#QXm46RY>|rkX@H2ga`e(1}mY$7_OXLacn2 zE->qQU=+Sn0Js$y$zE@$ed1#qnj0SrA}*8GXU~~0Gt@#DYi%BCyM9MHCKqlz9wd~E zsc|VyfXD8@b*AAzfAT>J(z$Bpj)@-!H;?s}^!(E3MkhjJR_5jc4`SI8GoQE-zD!w> z>JM7vQdcir+*gM)C<`%vR7U-c023v|VUz4k>RbPv--98MKzwwrsL5abQB93($g&NW$w;MV z=AFrS>LlDBJ0$!?;t)7@jc0~p!Nb8N1@x}VR~3=a^MX$@;rZ>_73=ap^Mqn)ewgm; z8zs&(o1F|nDJ9H~#277d-YG1YIT#8WIKw{scmaf2Au|hye%(2}GA1@~PmRm5F;{cR zhd;3^&6wSvHXIUUdPYaFN&SUzk9j@~Zc#*(P_hxPb`j2SxSc=8A;xE>2Q|in`Dy_1k6Hfj91pxNy z$A#!s;X)vg_`&w%_Ac4Atu3?mxZe#o8FUnqPdCIz**M*T7zf(wt|N3rd_Gv{W@ZPv zb3l=N&qfli&D_J5rR#f~cuE>->eAMqg!+?kdW(OG`P|rC?^L)rcgp7^7cQ{=@*uzUmwn8Omq!wSH302Bys?8dlYIMLdWMmBYryhtV z$b;xrpDpWG=1v9v_upND^k#5)i=cUbJ_G;dY_SRj4@(Ma9Q#o3gDWM2u;eEP#``Jl zx+ca)q~cF*)qqwDk{2FZ`ohwc9Wu2kDr{>jb?Y)XcNWk+qLo4Cfe%CYv2Nq#&_G|9 zL+;$bY%jeclCg;@FN@8dZGXb3GTdc>*`da4$5Hw52ZT%~f~7M(gw9L(3pS}fNTvLC zQpDrna~q}WcV7}HA(N3Yp3HW;3sC-aDPpn>G)aYW72kI~+M!$5O#oe&uVwgT@5~=2 zBUO=37Vrc8cQ8?KVmI^X5}Z$V>HN4IxW$8?uzBfT+Tt&uL9JK;93y-*qs>}X&=qSVhE4fB-A2&1ubrv2W6lU{CKgW5+#@4 zm%oHyGO3$uDFaYr;pD<9$d$zTPwwwI5q?Ki1%$`4#REM+v|~nSQC`ANurGHj76<)# zE!N-hgMc*oW~&Ru?=LbBWR^z71L)QJucrE!zRl}0EK2KB!~iMwT@IUxfh`M}=_W50 zt8t~my=IS}@Sy#IyA7J0>9f2Tkbby_|I{z&9k3LCNTzh@Z%{7(UWZG$OC}~JTU2Be z{)Y_YfXn<)ZLz@obTKVrdQiEx*!A*ia_R7+d3JnS#AH_{iU6U3rG_=;Z1&sZnu7D| zCJtUS-raH_i_T$;%G<%qu+k1tHn-ZdvIOWIh?DZ zK=7<3Z);M_?tARVK{>%CYgNM9e-cCm90(k(?#Z4RGjbUFsh-mxr^rJD1qj}<*VY1) z;3l_$ftZj4zzB62;EW~#dtDsVBcnGq>g}}FZbf)Q${RjSA@eKvc94Ap_HuEOxQ{-< z(r@b5>$2DEs_f;L?7Zw896I;!Na04_^gl4aEi)Es`w5nAyKej65|L90hB-VnO6p;N zuu_BHnT!>JhE77k{wgiO8+2yu42wm(Q~`XmYsYtQEiF8oq0bIwqdUN!pypJTbRfxDG6f+UUq0czPZqq z29YlD!wh01$eq7s1)#;sX}6;9~?5NF8p%mbY3W7r>94? zD(Ak>q+4_(sG*mqou3X}ipp#i4l!O6*z8s59E|*JU<L6R9hw_a;V|nJ{}^;i14irg=tcrk7Q5Bilw|mn z62)wvR8>Hi^M}8GhV*n$&1%-{R~lo6{V^FA)%AvV?6SfrdewcD?s&CpvLhhnT5ENz z?cv{7sTYRc8(OkN0H^Oe7)Lm|lpz*5L?RL(9xp{UoFM1u>wX+*)OKs?zbai%)s2lX z{p@|*>8}k`}C;gR0xdXr@%vV-Qz+4fZ5tuf(=c$!=4m#$#*e4?KOT*Q<08}wBr@tYj z8#sP@lQ*Q5=wk3L?WT{f84KCxk)%vmU+lFniL5_G8~C2IrsOYN4BMri)1A~ zQWGkh$$WiBuT(F~^7TAGIqJ5&WmL1#RrtieM5$>nWOQ(pcrdp3{B_ee)LGV5{?Az1 z0b36GDG7I*ECpOF;V^s%Ieu(Ws2iB>%e6XnuVWMA6P>L${pi^Ek|y*%dmlywmh9~2 zWhWSX@pR}_Q$}uLy1r1W5Z5%YdcPE^Ei~;(sv<9jR{`~0WzjZpL*#&g^>LwJ&C*IQ zabB31PJEZ@z8)JbO%W0v5*Eu5JcNGt=-ZtE!I}Q10D(9MCDav^8906dye{@{o5vHESy0sn|D1#8igHBH zv2wm%L#@Mutw##Oh*dwW`_?D;)t@6P1ZR4fVG5x}Fe+4^2mwyL6<8Rtj3`DXQfcSo z$(2QzzONWIM@ZS-+Ny+a9-A6Eqar6abl`ywiE30T^y)~3+ev!!Y7bPZSsF2JhSp2Q z;+iv{lz{r|AoB)}>N&)JB%$Ncq-u%^0T@ghz(P~q(onY9@DYOXf_E=8ul&R`^;!dj z<`BP2NuBjoRyiP>C#O!~CUTeHnKQOwb4&w&xQbH37$8m%*v;-UwL3Y|*m>@X?!wAn z8vbT(nFQP>8pyVi`JjI25K?zFS;)nC$gP$^lN3pvm4Tp5r_at7+z(o$Le#*33#&$! zh+9EY{usFJhOVv={5~x-z9`uszjmREs)ZMoq=Yf{0HbC+np6`^x1F&=um5U6oaoIT z%$b#NTf!3(LTXpx<#3Lxu#4*_r`RtIK!QUZ9cx&0iLXWdbw3y_7fwU)_?u}+HH`r~VK-=xP`3}iJ`%ofFlT&MVgiHX zM`zvxw-=QDsn)bXO{(CGxl%dWb~|jr*e4Mt1IG(vFEi6mzs+c_jc=t)wt}-=+SS8F zQ(q?n(P`BAyLjxSD`JwAk~Jb_QKo#=0}Kj=JfBjI%yAlWL#^XnL(UK5#_y;)xKiAZ zB@;3{4E2yz%AfbdpoYVWm^SwQeCJE(qYeeHO}5htao=VPs^YyJjc0w{tnIkf~hZ zcv6zZz#x%hxK^nP)CQ%bqnqwF?QNeFmV;f1aan8S-dnNe%_VkSp2FQN5LQjg^kCL` zm#2GZhzu;>CNFOkN^@9crKp&1;nV_d^HANoFl6HLLcaXGlt;z!-Qm|^k_z#Z>KJ_U zA2w>0%FiKX88Czq?i9Bu__jj|51D=4qBvQmF^A0CNGuN670?Sz@|Qm!npm^n5<2qq z0+9wS&Qxx-`0$U!5ddwTwk2=OF`U_?{%GKNb5(f3AqiUfzX4Gf&zl2b;$ypb$v5zM zMLO-zRv+hn_rKFluE$clrJaz0d~csCWVF&k{gIA}@>#W1mWENckx)|oD84!v8X%k) zd-8*8F<#pOP9C$dmN<4qtyYLwF3_kR77jCZi)B(-Z7_1@a1zLsua*QQ#y3yVTldnP z8xqO#29fh;M$ z?UqE{;dF`_LpWOXa;sQGHFTB~TM%{Bf``FA5HCx%Kd+(n`BU449+w1x+Hcb7+!6Qt z&bKmn(_~V}^}-q4VXh%~lIjn$!W4uIx|O;K#6KUVX4WP5ftjwCslgM9ejqV#^RXsj zRr37S=oIO_k|sTdU3x{SUg1NGrjdzdk5=*@4m>V%y!pxvQUA~EffUhm;>Rt#q1j~6 z-=#{uO`s$>1vOD$*P*WRHaGwc6z{2w^$Cm7;=jWI;b844q5c#51ztq#X41HJDxIxp!tzYT@ zyc=|a!8T`Lq8=m3YHj&izLtUmE2vLYd~)QK*;1s|Coi0p ztSV_YA2DD0FIn0lO`++u^LcA?uBRg2smYr}MM*fL3)2NOnlQnV{CW{Z z@;&|y7UgT{=$Hibb^D%dmRXzT!eT+f(VUxAi~<7zX-C)$?gIR7k(|4%MRYrZNLUYL z;&ia;Hd(2ukw(54C3%A4pW!H?Ss@Wa;=5wme)O2o&gkS{woLhx^~JyWsJIXdLT}9| zu~3z-TQAL$!z%=CC>S{6w1rTu^l)ip$xbkO*aR70AmO0B#0EOSSex)PaRJW=jf!fy7Uh!yXXH9|8ID9?n`Ex ztfk83WvGJaT2cUwN31C?nAO(N#}*Qr)UW8vQ^o073_M2zTvO3U)yuqdpZCOiR?h(%D1%A*->Vu+~0s zv}Dzf#PJ;{9XuSGgljw9W&MEMic`oVRzTG1xcp6~P85-qfs{OnjuN736p)a8&fboz`xj7K#0DdBMASjD;?-Y2V00lq?P z#HyIryR~(Wq}n?HY4oQxMlCI>-IlwtF>~~#VcWCxdg#N+ub`Or!symz=jq&qxx7&u zmqIR3$*qKVWrf`-1(F8MgE7JjoeRXH)fL_liH>uqWVm!L(;hMU8;hMDHD}=Y-3|pnqo`GZ^Q=!b1XyJiK@|+F18e0tWR0odHgui zAe!PQ3?nH{&hmem6wXX!QzeOe`fu{-u6|c%+kw3ICPPh`#J*S}xwo9p0}b$j>+Z<^ zsu;Gz@SGpnoQ8>=BK_M8VQT1ZDoPvVsvQAha%qG1zoDPM4}1I9K?<1C#)w0Q!XN){ z=J|hdWb(ghSE*_bt$+9YKM5r$^lv7b%<{_ff4bMd(h86&6ve#!3Ex;L|8FkppL^kN zx|!!|^!h)mmw)%#9QijJjom%3^)DyppIAA8IIz3W@6-P%TK{b4e4~T@T4}6`e6f}O z|33y%31D~YXzV`!yqx_j+HBJQ)!VdS40MYAk=Xu1Y5wli79Q9gp}4fu!avH#q66<}RQ{i%22$mm z@?(HlVmk0~@?1-eE-)hi#I2w)nQ12s=3;eJ20K3J1Uu$QZ!U{|prOIFUl=r7I29V2 zWDzYQ-*1de^*URAM=a3yYkB!$`IW@2`hSjz(+!4za{t@Ae%;oO6u<*->tN@b*xS~g z-rgcPFQ9@4?wIFPGVG=TonU*RaD_f*bbNd;-Qz-5Fbx(_LE-9zASTtb!qjn^v%=8Y zn*FP-a0tn7-REL8nEmm`cR)!FD^O2UP(VyhQ7~1e1*mrAb1p!I@*R+!#uGN@ee&}s zWIAp-85&S<5@iO! zqXD^P5Sd3&(pCPwxrGkJhhL=1vC6yv4b!pJ4ug@Ak-4zh=MpI3*orDOArqj112T_! zK+?Rrp+QR82exrw(Bgq-<6?b{bZ0PTdbiye=34qcU+YvoT1iT(0SK@2X?bw5?Tq#5 zsXacqlcdI;XQxO+M3y1iVD?B%%N|e+t3T~gx4%sDG+RON1R=jDb@hL*bZm4yi#r2- zQITCQ#~Ou2*1u+Zk*TPP?#%YzM3YRD27Z2UOw`hZo`TDlUbRqLj~jfOnJsGG`>{1{ z4O?VQdUfE2es^B*0wGY;Dy%4PC)#i4eoPn=x&*quk&u2>8nvCHUjl7ebPyi^TiGaO ziTm<=_Tqdw&I52BiQ2r*240}IrRmvi1bt6ee`ZtpJ?J~34+0oA0!T!>xj1YajShs3 z{Z50;H5Qw`2ya0laG2){U7cV1`XqrL)1fIc@1xRUm#ZOk#dLRy_wV1=*iMrJosZG5 zsBsE!*hEA~&pKbwC$o@GyKWut9v`=+wt9y~Mx^6Tjo6$;MSh31T<-S{48U5*#Ldkl zD~Rip{+C%&N%H1^RfjDyn>RkVIcDWz^2HZJ0?wm%VBGiOc$+Yu+hP1yZV{BrW>Vm-^n5*^TVmUyUDxrj`93X9}$G7ftym7eF#M1d<1}h#c!OXx3B;!-rb_9?%KZu6k=LWq+XA^oOyuO~& zkRAG7VRA^+a8+6{+Yd9_4|3sFK97J9R=v4kG9CBag=OApHELbx`isN&MupSy&g^Wx zgI5~y0YG=70{!t{Z$a+`pUx#x6i13oOadQ;K%j(+ZULumK;hi*7s2crGx@dQ#@8+= zbiVwPB`>f`7{HqUn6rADPi{a_>+v)6!@tk&T!atKC~UYGG_%W~8)CswN2C1dQVGgd zF9!wJp{&9ZIU0?N3mXw2i^c}jhV3NFQ2?!fG>eP+3C-ABvvzLPcB9P67Sf2$BGIG* zuRQA)SD$~`r@Ah{Af0TyqoRBbv@WUPv=R=YcH7Ka>nya{tGqdFcOY7BKp32J3h3S+ z7cjGPh(MQkG=;=am^#@MEZaQA`vB3ot-}aQ!@xDPPo_`_8IY{^Te-e*S$6vKV+e98 zpFP|A_faJ+(Ezq0R!sK0$aSg>t4%lkSXvW?lvMwT4U%Jq;QOH0>wdqqHly&n%&ktS zF;3ni9c>^dP*3&josP7E&gXqiwkWM=fymg$$Lek&AVn6d(wX^reIE&%30{C>5Z*KAaJ#&k~0-d<1dA?i_}OL~PG1CUkLp-%K%HOmHeg3qpuVeDAc~ zqwQkk+3zYY9@A`?ZNzH<41#FBKk+iAeK-Bq6oTTj4+#o2QAk}Kg=2>uR&h_;*30@G zjzQBYc|6mg8;gH5VYnMy^1|v2e)d`6F4oi8Z0U&4-6F;9#nWf5CP%}8n{+MI8_6)g zM{pBeFcb<$x_x(n8Ohsud-~{o-VOI*CN7CVM-8(5C5b_syiAF({o#l~x7{1zhf;j+dnanKNQvG4ajn8YU}~Hdk$HGdeTq{t>DvC$dOOL!P@QI85n^1_CTK(@&aE1 z?v8#|$tF5UhoOMuv$JDwH(tJUJy%d>dDfS2L{AsUT=MLNFBm_D)ovoTm~{BWkl(}! z-M~}vR?Gh~ZhkOCjhROXouD@V(te>XAfY?i_5rKE|#| z5gT~ERU+Hk__b49>iY6@fSXuPDI^qgx4V^~BHW8AGPZkG68-G@tL?0_qOuogt>5fL zeHq=jME8EYD{%$t_Pi#(bRQa!JvLe{xvuhV`RG3wRa+f%f7+;diz?zx+UkDvHSp zDa3uaItl+4wJ`J0NmxYb?&4x#hpw#Epfw}kmecnl+T(J{&|4`K#`<_*#p}n3{`}|} zR1w3q?(Iu(0~U$SaKwvH>wUDqxea{SJK?Xu{#lK0J)!sBNyTf``5En_Sw}Th0E?@f zZU52JX#VfJN#9vnq#ozBMKN9<# zbRhW4Z~fH##sAOn!=qV$nNlir&F_?<50Lb}7WQchvRYwqf#Vn39Z=cpTzO5&=r#gg zp>BxiA$+7NdLw|YaYRVBlJIm+2 zwRanzoLmHpX&-S>^{F_n=`YqkSPGEGySF|34%5*Wc66(4k!uutn&aQ%mFA&2b-i%8 zun&r1oGsAixwyIYkMqP*BQQ|>fqr$Eq>3N1=o0QLol`Uvab!Kd8B8&m)S?s#u0v&> zP>xKLYCzeu8FZVF(AfA80(wrwYrljJ$|?&>ji1r^v4IUH(5UDXGkhMav>!uNJ-3dw zBV#hS#VAR|12}BWaPs+`)(yw91aPOp%VhNQ7(cc9x4}&tVuYY81Wanv%OB&Eb7u@u z=dB(t-g`+pyt?jrN#3-9EOK`zmn@n*!NG5^$*wOhzQx7yc$|Kw>~o>qwIfPQ-UQmH zd#UF|oO6fsp#VC4_CZjFxDBAn%d2)$M+p6pJs60|I0t)i$X-R2kzp{@eBUpn95ORA z!xOY*-D7X#wQV**w|3IsxAGicTT`;@Wcss1CI@>@zH)JOr3s1q@=C;f>y1lw;_D%I z6cYV}LKzvEpJF2sm=US&JIL}72t&nhQfJYf)6?#alnj332Ydp85#a~dfeCqJU0|K~ z`-9ESK+K5RCD0^!H)>*R+2+dnX_1wHVT|l81^yUkB2W}jV%-Dl%KCxs*9Pfd#gpqn zXmk508Xn`kzMivTvcEs=`eD28LUQ+Dx76X`ALbCCPEORMDsV{YLsoN6`)jcYYa(Hs zADS+Cv0ITR1zl3eXAr_-cP<7WF1PkZ!s4iknA^~r>}XaEv#RMmDTIAqs_>NA8TR0Z zJw061QQOlgHSHw&UYStn=^1RrbUnwTy26!*ua(K(%jysJ|Is8W?2&j|9dy0B!Ih1w z5_Uv^7$uKwN5WnLM|9#~hj6O_27E|}#)3Bqlh%-+-}o#-JW>q>COOJPrit|S&x0=+ zLBsX$U+z`BN~y1l_qyuq4V7LdvfC21A=&UnR{F~%I5?7{vn0`^LSH5fP-tmNxo9Ft z7ON1MCIimh-SUlp<22SEj=HSz0-SlG?4EE!Hp@ zLoeSZBI}tB{W@)asp+y1hU0Il>o5<(J%;WCrjFGzlv1sQWl=uu?-ytqJU{!F)a8tc zMG{8Jx_2JDl0dS$#0Auvc9|y6GE^h}hVHql8w((7Uw?@0_Ue0BAoSU#o*JEnTzaMP zECexPWIO@ZZ2ZByD5m3p8{>fhk`nqbo!E#-w^4WY$|W@>^ThB9yny+Q$Pc{Q5Vj2E zOBMX%1M?2V=z8v|M3sJ_Y_<20C(9}mxY+#G19=k zx2UUCvUl40h2Pp0@Nd_B<3?DLJ;~OKm5U(4wxh!D5}wYw6<98yGT>(0p&ajRmxn#? zQs~J_6Y1?nAnCG;Dh1BxG^_9Ife&`c=~8#+y{Kpy7-O%e=!gUY6p_(1rLLdQ2VKxH z9%kTVK>&ElC!#-4h*8-Bmt{=ams6XbGbls0+B+w*veExwd1}#cM^XK=EpQW3W)#Q5_ z3ahL!@(mJ7Mh`?qSa|uDep>XK8+CgYX3FbmQ}NB`pyqL_ZPl;l_&3Y?N2OHA&|mh? zsy`nQ=FDtobi)~7cxr4OGU6fFkDyYcSPXS5TWoJ{&e}?DNEu?jvd#`;exHs?0^Eet0_DRF{r{$ zUUO^DCz>|@d`gC7v6D}~t7D@_XaNN!pwYnz7<|L8+rnZxB_HLJX9##Vn)CpRT9_0w z?_5*AG98I0uh24QXW=woY4a4OEfA9JZqA*=05c z6Azn42ECvnbN}U{xTSf=6MyKAGY-Y5TicOF4(Ff`nDQQF5^4?Kd)+$gDCdcfP(@%H z!H#Fx(xtHagKR!rZ$p?Lfq!5HvMswY`HB6qdqmCh{1hkz^jXA3G(`M``90xRlAuHu z$pCPA!|&TSE@;4s$_+KEH38YE{>&xJpPyMT5!jL_^*sfk+zE76pziWHTOyjSj`UJc z7rI4Pjgf3U5`8qM{X7w)ZnG$#m%hF(eemf};}B!WpQavsR%k4xoRE0oH{OiSI(KM_ z4;6hh2UQSor1+Eu{&t&jNlB}%O#EJ-LgIUUHS*0$E%CN<_r($0<0)Ts5(~mTK5yTdK?-%WCxO5; zh3B}nV!I<6=~2+4oGVkSgMk6Vi1H0vrY?7%D|7N5Z>Vm&@MDmHp7h2zhAA84rn9~U?#1TJnG zq&*haNX)bxhL6Fdf=oU!)SGpX%bmiC9`!f9_^C{V?NtDl<5c9^MBvlvRg=~3uRDh* zUau$%`DF~L?z(=5U{Z-)^p)A%+6rGG)_8x;gmBmrpH|T)roH+T$`;Q0(RSo)W?myv zb&nMT7%IH|Tq!fvYCmktOOncKRxUc6mMbx|)6%{l-tuI;3pY+#sCG4-6Yx+<9$~)3 zrDy%y(W65TL`f)2Tg%1CnOLXNFCW6Z1>58hRcytrF|5-=(F2%9(e%=mD6bqx#F^%; zYN(^iC1ighz4}N^c9g~MsVPirFWWa5*QKnt)W3Z4XD^R&8D!EEMNoQk_N!jYdM-1| zsKjKW%935&PwI`v&;un=VQYBIo1@Pu!pW*f+Qz-`AC`7WsO311M^ji1z6fBkJYP#m zf2r+R^I9u76`}8a2aSK!F+lkOz`!rROqR7n?^t}#I&M)A(B7Dxbu5OblTqfqDU_qgG9~sA5#`cELd$pu+pzCfs>WQCH z5Z=Gf%?+y2rxyA81r60Tw!KzXrvVzqK2-Fzkea8kaoHkTwkXR^GdzJZkq4=7rL@d1YkVI2 z823Gx7xRRZ7EeRaGF%6U-lccf-4Ttv=J>!RXQN2h4SM!VPT=>7zH|`jqy?JZC)lgw zAd${> zu;x3nklG_dO8YpJHO-Kv57r21bd0gTQ8l#XZJtyR%9-2 zF1fS@*q^6oX=~4V!g^QX26h^naCUBA9#!NeJ#vd*AIQlHnD$MrFMym0Tib4aOutUA zYQ0Ijerle6JCyB?<@Dl)PZjZQc3gs;xDDfNgw&bw+F`_3T;o7r1Rpge59`78oAA@j zJ4B%JStT=kKxE@3RPgp0Flo$>#4j(HLzQKuZwiNg&}jXv{)S*g(s6o zZw$@O?kR~cn0wio6uD*04usx%Ll(NINt+PYh;pQ=jM4G<-NPYCgz@0xtgbEvl_n6~ z)};?6KYK0DePi(s@WRl&&t#yc2z67I^uKA@n2K?l?K_*-9S+1u$qTcyq6Hp*{ zDKp&K1HEUnkp3A-R{2p%-jrXqjHg|``t5b=RLdvxr$v7>jl<>;Pk|Oe&`7G2 zPkgfC;^j=q^V3aG4v}I3!O`O_xc4kvOI7s)1_s95XGlWW|Do!d1MAqnZkwh-lQgy( zTaBHDZEQPfY&2G5+qP|6jcwc3jlSu7ukZc7`&Tme&dixJ2Yau*_S&;pkC%{e`{AKI zWIjHvrRHvfz2KKC{rx24aur@CN^J{4;ZixtAlD+7(*+4= zXbNDnC;6JXyEBlO8cgA+oh8fu?PEO_v7SzV+{eL_QcD1%OJ6xH-h9A9ceQ>j4^F#gXgFRxYOE< zo}X~a^Fhi(pQn&D9*L$6xI^D`q~mdBVa&Y=A1n0_6n0oX(Zlbe0YgL+IHIu%22?H| zUMJ|XpS$>?ej>H0Q)HbAp=wbo^rVuh>NaXhC>Y;YdZe$e?6-s7fs@_ z66{o&NB1GA&kfG+*FLdWJmG%MB4cbhl{{L_kLcJool~{7%gX;)zYua=?pA4O`#SrB zig07(=9h{-1O&u-C*vH*lO-jmvh}XaOvCPs}XQWq6EXU)yNvNrDPAL{OImf=6fD*9@lc!yZ2=C$YP`r=*p+JAJ@- z4_exh52S?c_WSsns$5X7!ieJ&$RVAYY&$KleS{hud+vFc zrm+k1b!FH7Sg(vOS9uLm33UUVRU$VM#4Nv+d}wLAW?usz%x%#Ech?`P6Ezy#D)h#r1Bx0?yTEmpustqg9SJ1!aAuWTW@;&Hfh$1cCK&P zF?Clx>1v{41KG^|CCUAP6~Es7={nQbJUOIzA>jcd$#$y^%VU?vNo$1tGKZn1#2W4g zT=1^m+;wha-AH*ehv8yDQaSz^b*Wd!>PmC0Qady41~(B_UF!_1BI(Vm$MT_jmD?U^ zL{gHU(kmzq^y-Gg4GjS4^-UM+LCpPO=~;)8%>zNR$bfpy*KP^1JyJqLGH_t$+@A+m zMcu`HtkJ*bUympI)b$i^xH=O)!0H7J{SA;|c{lQ<S8%!alUPnyGAj(iQuG`ghw9z)sRVF_e~G znWGRt{66LHot_WM?kyPMaC3)HoE!?+-#7g0JEK={!G!u(Q(~h3cX%HRIPBmROr1~u z?-hU+jK4q!&|ALFeHH%yhu=d5(4T>!t4PZHev&^o&3Hye&{=&cj|`Fie}`cZA~<$6 z)(M9wK6ovWAf&2$A%EK$7%2T>{2e#sx^`VZ*WXG?;QE@SX~p6@?|+wj4?KaICt82Cffi4$A2bl7r>YE1l0M%^x@on4K#cF8+zK&-SGTX%z;%I=Qk^sr(3>F@QQ z4{8||xWw59;R8V^J3KHoDYUJXbeo76*|#EUZd`0#NIIIr6-+ZRPbkTBhA~Ep_J2&2`m0U#ly1nUX!YP zCv{g=`W^(Qp8Ey<%)n1b&#cl;4ezCu5ZiJ}OiKv{nQ&xji()Y0-}i$77WK5CLmLY# z54EfY7O0}&=%EpYv{TM?9KtJE?@z0u)SwU~4y`GHf601m7|$x@|GH$<(3rY4>vHC^kqtN{L{@IUjej*tA;n`Dj>JC;gIJc|?Ou zq~$f2T&EOym6Vi?d|RTRQik0?~k zHlvD3$Yhd0uH;*~_NS`D^z8k~KT~7b5)6rhUo#1$RK{sooe0xsF>@ z3o{iR7Z}zur0!c(;L%Xo_X60K6y`^>va`L#;%N&{@LY}=Dui~1=-PkRP#rJV;vG(5 zNABzE+n>sZ2MTEB5gq~2oxT#4>S>-!fqy%hcs!4uj*6;3mWsW=_=fIOflYRMu;==g z6mud*cZ#oo$jj=+#BB$1q)P31#7&m0sAj43lxoQV4lK0Yq4p{FXj3Bng@isQ&|9=X z(#dH@0Rz*hb7|pCK8&d<>Yjzgjpn6j(X6bpDvVoD3bssboSHGt3ZNHje&Y9f_W-IG zuvm6%%`={@R4y+plo`z7cD|M_eprLAYfnf>(4NQ=N}$&P3&Z0M3g-bq0c=x68GA_{ zI2f3BYi}xUz5@uk#4&x+)_~=oCAXc}>&OFDjm<Y>sUl9fdyF8p>VI6pAr2FphhrrsByK zx;q(sVQ#^>zPJX*=Ca8H=K%4dFX7;NSm(9s#z|#y(Y7MRDLPkVeG51h-U64bOXj*? z_b%d;ywVLb+d{9r9;1=Y=rr&VpWOGt_#lBj-34slr z#&7#oB${L;2ot-F$ZfleV^U-%)WlAKZ0J4I>|izyV|9+hKz_}RIz-juNf7JL^@B;hivDh z3vUYbfr6e1+wTET3|?d>4%r6U+T+^aHtx)*CYWA^CoC#+SzU*u^faZkMr z%_W_~PItN)b*H|59Bf3`Lc<2{FIzQ=*;DL-k13HCn2YPC+si-Te}o&vf!$QS*F|I_Q%s^ zQGHv?o;fWK4WWJ~ZZe-LAQkvC&($#Fx}H@sr$bp)m7s_SRXZpEk!afHf#9DVecc_Y z;X-Rdm}rPJ-3j-5zy1)&7Be=xgM9$S|OLvO1RI@@hP+LmrXY2^v*Dq8aGGQ)2LWxtDvQtIF4L8Om(Kpn-r>4Gz`O_}G^@0ZU#z@qI(DSk9|L6y1+$IC|cv zX?{!#5sA*s?N9NvO1ca)OuU$KL5Qs*43xtqgRdSV^?PGj_-yTWSxMVZlT5d+rdV^# zhS(qGn8$wol4X_2%*>o_M}vUH$XF=ZsQ34Wyq{^YKDmq|W!zjmh>VOpoN>kfV;}Rc zyCXJG=!}Mkck>I#$1G1z`v_hsW9(x~UoV3JR)14=W%VaET(>~d2YLvR70DD1ct#Gt z^m?k7#}fz+MO62jb?_jQWZkJc?|bJ5XK;|q_?Ec_(muB_C+oB<*!T38R!QvR>L4D32Lf9lt_%l6|ejhvp5u8zG6EVD8^y={R;&~pcO1qHT8zu zdmyqT9}ldA8>3z7Nq;YKP+p^=>v=xxuMES3BOG@B+B$$PvCdV zUt4q9%C`x2`N3{aIl}_*2pl&z3MqZik&`nFaGp#agi!;jXek5?3}}&}CJT{5Xnve= zdYvhmD}V(P?LmJtuF=3B37EE&l+>U%!|rYJLs8=72|;SWjXo%HFAPKH@!`soj8 z^8HU1EVrJvjRLm;ws5v}Wk!^h%OhJ~wf^`>i^yKdNV{C?!^6}m!GS_5LhL{;*1^Rk zs_5vn+|LI|$$;z&H)n_L5DFq~Q9^bO(lDgzV2rF@{r98@tiKCJo~Nr)9~6k_F)_>#T_}hI7OUO_>eYl`uZf*I-?o4r8@Axb zcthk+boK^7Qb!J(mgUcA7G<}G4JMEe6YNmqp$6*eKbua~KgPHXPL?5CRZjHsBQ5I@ z4p&5S?KO|ZeIjVY+4*j-|8B~!+WW0R6h=DVEvgnIcLL^0swnlGi1ce1*|Uxpt;9bT z44)E#m0VW}(e95r7Wst^IVbLuV>1O`2yP8-l=zt0>ZW($>>_!krNbBZ-Bah+S03H* z+c)lJFZv15V`@rLkk8poa?|2!PCX7X@+*GSOpWXh3EXB z7t(Bz)z+q%oDxsBlPwur3^D?%V65`L-i^yhPqW%2B4%N^1c2CPLB< zf9P&^jcd6NzYtWfO|6B_@Zow6biEaA**)CQ(^jZ_hvo!Vh>&*A;r0{}K_Oz~O#T&;xN;j|SJ)La z${b#v>BWQhJcHue;P@VN2i*;J8P|R>DoY$?-#gY1mt2SESs#z>2Y)ItWxTW*O|mBE z!<`l-Lnmt=2gW8%oSOe(kEgK&J6t0^>Kk(?Z*{J3ag&u^YG+Whb8UZ#1qOq{S) zDF4|409O_ljDxQ28el%yE68XT9#ie<(n>FMiuaHaZ*1l|suNPpmpMFZRJA5 z!6_&qDZQDQw3%(`lb7iAM`C0DFsi%Q_X})P9%&+=Ykj5rsZdv#{_-j~GB(wJL*Q|J z!zsEzxUo$&zdXO3vKST*!)swmSSC=wrJg!Ll(5Cr5MV%Gs#6OHaxxL37D_3JBlJj6$` zOvlIO2YIKXzuZ4(q9kFZohXzti;(TjD%LhG7x;d2UtIpi@|Okn*Sq9Ed0X0oROB@; zN=5d1GRpmkh>Po8z!NDC|K!}dhn3_AP!16d^>oM6v%;UVoTFcB>}4i@5y;CY&sn3$ zO|ktP42{1~OB)Wr7AeQJ>>qMcaFb8I+Z!M|lY33R+c0lf49;WLoO9(apW;fhbf+G9 zxoqA-UMHgr=X#)a%A=Z|ikisw+w6qQV|}n#8C5x5X-zJIyvX64Yqt!2ggzULOI$Jq z@FgiH3roudv43V302)DompyW+Vw571=zYZgjPMR5RCtKWF-QF=N#gmrmBCS3OJO#o zb-jK{6^S7fHV#G%PWU zJgi%}#Ky+yET*K`=$HR)xc=K-eOQKtgPRUsV@0o3Xa2GVI*t3bwe=Ml>@MmJna8M` zm7nuw_nM_gJE(B=Y=_IU#@-ec;@~uM?>tIFxtTg^4 zR^8iUA6*nbTM<~{LjkJ9W6}ANThUUy*(%o6bAv zh?2Cbs_2gFR;A$>PYMTi=&S2JLzG;f?ynqZ`i3us150=j$A2)b3>ZWJxALW}ODRHV zKzxg~)BNKs7wZgLM*=xOf~0b#+)_STLtI>ZoSRF$6)2J$ic00t6KB3;Y@o>vuu+>N ztN~$D@2IFKQa7wgAI;g>*>!yz<3Ed0(`Nv~(|9->YJ~9;21kmHiXGTZwA>p>^ggeM z5H|IAsS^peQdU*j><&lQ>n~e5zrN-hJKf-2tC)yVC{~jzee#of|u{p8n1NJm0~z&Z)=+! zMC;9@!SrO1JcO?0>Lr&i**Q0dzPh?vQCaz=-TnD|gmsO)d3dAS|Dp?qu47>VbIt7z z7jRaK2v1uWn=GP2*`(o^D6`|Go%dV|$l7<5{}dW)49jPTIV_hc!j0L%vY5vKzP4a6$H zf{w~5_&vY?NGczC9QNX(A3r-I z{EEN}oyrZ|gJSNZfX=Fvx%?wUn-*peCgR>&_HNtoeOYy%n#byfi6w} z`lPO4w~l$l&T7=6$&cH(@{P9!w{bN;7LfG;)XiAKwN6Xbo?{5Q8rt zCs7CD5kLi0&lr)Zf_z$Ty!!eHk=t>+g9TZnwWY=C<;e-PQt=j@ z<7aR%OrCgRR@CRl$q!1}6F_h((&}Xd??+ifm%E*XS+&#kgh-`s?+1lMU!wD6$k*Ku zwAAw+paZg6UXh6fxzQN|gW-hCmJ_qY!jh66z;TsF(Xgldhj0Mw8t;DZ8l6HB1W;a& z5}rbij>@cnP!cS_y7BS%=X9=NP(cV!BqLF6H)f=!p+Wc}b6kfcVmOkNTa<4k$bQ#} zXaxX_DCp<_rxIUD#!T|p_O^J~Pg~;WK(aLHGba}dfK@6gZ)=Z^c8Z6G2iNZoz&bN+ z)NLviwoGZgT=DYTV^3mExJf_o`SwQ=*+YTpqXB=Jr?t0KE#` zTwx|z)kb(ct_`A~>+5T?Di|1ZPEO7nld7LQR)SpQ>j{T_ zlKSC^)RK~diS2@@R(IBsSiLtrZz!G`LJ>{IL~OV^4P9G-DAJ&36h(9!`1tTp80Ckv z5C`1nZvsd$FkDs@%4$;fxXH#beHtNT?d)KAo{w#lp!TaSE#|D*1<%D`7EwxfKTw!y zsa$Vw#RM#9R44xvCwvRc$Wu?gX2e~kqcTFWas&g?K6<9fc5k_+MvdYk(}5vXNd;o^ zE+^aO0mak+J}1oB`|QOz2oMA@{YYl9!(Lh0DDm)v?40cN)BHuWeCsyKChamY;n@TtwFB5L9G5I9F+Oj{Z zSxVo>+5Xlx_UezLF^&hdES*qH4ixhIOlz1~RTPD1T#uv1l0{L@&9yAQeepvw$nJAo z`67R9uq2hNdVc`3<;6oPqY8_>yr9QV;!(%Y)OQdWf;E5w zZ3)YKD12om`p(qbxT(yY0A^E+!IrC2+TB&GgK)rg%cld-~z6L5tIpq`bU> z+)daJo5#jaq+N$xTOdmIClrDJR{t$SK}SREl~t1EoR|a_X+wVH9>@*WwSJWtlAVodlhHZ9EGd7=5DRkLYm1&% z%Hr_nY2`=6*;b&dq96pq_WrdsbVny`t=)jy=eKIeT_Rcn)Uc1U^ObvS;s+Pcp6)9L zyEz|R;8XZ%gib_09tj{-x1TiVgL*Ajbbk|@b zPy3g!Ig)l-tIJJ}sV&%UOv%9>Q7p%z4=MJ4-FTPcIT}pY`XnkQ@(n25etG6WELBL* z7mf`_CITsXKk0=DEer!=ds9_g`9(0?>fX_1b9_UuXtg5WUo6_lUd)YEvrpG!sVtjK zMEAPUaF-yl=Op)D9u{vLIdBjYWroLpC{by^Mq7%10b)Vv(rQy4);Ftm!^jfGL(9Rn z)%9H%4!f9)i(yWl;l}uckz*74l;d#ab-SrN%4+m1s_a93YIFFwjo5i;e^{!&^@i+c zi9B5~es+PA{^#%C_jG`qto7vw!3NGHB0s_B!`kMENbC0yejuhqQLMU&Hn~1{{x3Qd zZTB{CqkZaG?#BpjJd!KoA)l-@MOmrKTN@KhxbvgmFabH1q;zN8Q;YObVA@2*b66MufS5GBWwpfaKrhDFl94CA@zU)sm z$2*r77f;z`FWtvPrN9al6|Ml>5E~0~h2){o>vC=zV_UI>e=q=G<=8I(R}D$1R+juK zPI_ifV=$5s@}VlcM58{CaPmMxus$&nn#-6F32iUA{`3=-=q-({b}*z!7?~7~C?niq zCY?|R@3SkaP<_(SWa>TEM012Po_=yi=Dzv+&(wp9T zm@i?{@six@`ni|NDzb+=xU{@YBOHF!1^SfsV?j}&;$spPHbHpSoY1z0hyDvO2P8Ui zgyYL*F>`|z1EykJUd(ZvuOZr~S9>_;6Tk&3ZKulx4Sh^t|K4!vJLYsB9>b;l(~;xj zlKIQiB(ha*vj1k(XKLqLxS*2s9PmcI8zus_aY)8ISfVfm$4l1oEy5L8J9zkxeZ=R8 zWI0br!%*MaSoW948;%>7)#J*T1l2ED?HDX}$OI>+Nb6?~Ha1v_CF&9{?n>e*^bldf zw+?roCX@d$t$#267Lk0xT`9evAAdQq@TDcW^pCa{6qa^Ihto(;?E2|RZ%4W{@s_Q4 z9v|cEOnryH8DT;DicXswfgve)7J%UT+Rd`PjXr6&puqOyGsF}roPq-5ys(~*&R4}K zjv!_1@g5>3iTcR5;^HCGnaUk6w|AC+VU8O|Y_$+SS?oeDDWc`mTujs@&^p~FfA$_w zpObYz<9?JXf^r?hYui>U_pXKGeNV3-VAEjtCy6)>ayT;&X?*#H*Ed5?`{5d`EVt>FPA2!tyxKcVphAn+2 zHh7y8JtM0Z%ZixOwqVha>9kZzcQnLU`7EjGhoF>)8!@<$8c?cqq*S=W;F zX;*)``LY){Ua+GcE?f+%e2t@2=i(GLv{?oXg=7^daY{W5wq!0*rbYr&7gA) zt@WqVnqtr{y={p6s34~sj>(*owP2>#=!7`P`bKSVQAcv~=Df06o`^s7N+L!%RY5Wh~!sF z{6rF+nH1)|pJ&SWBHN$n8j=E z^@HV+VR5wuQMA9+wY6S@edH7#Qm!-{K$v6+>QWU0pg@Yz_opUm@ZYQ*7b< z;%pd0bdjoe4Kmkr30ZBt=w)!&_2;DJ8G_K~B52~h^D@s^q7bK?R#-zy7W_C1g0K{y zM-eZsL%1+xYSiPASnT&37T6#3QwKA_rHNug4z`WL#V`GACwEa*`+sp#&!eO6C@8nO zvpV}gX8trl<8r+(xwM@Nc9ZQHp(2@dXLUgn6^C>z#G0Sj7CA%P^p4v6Y_{n927V-Y zfaN~DUU)Mtdl&WE&J+0yd)4dKVrmSNiC4hs7b~j@1)e)%=MUrFz7JzAQ6%->Jk$9A z;voZ&q8FSNr7R6*P1ktQC=pln-vqO|gQ_7PZgfdgbp>4q&bK&0-X8O2xbEKQ-hw(M zB*f`0j-g`b=UrET6a@Ev5L2M*O3L^GO;7!on5$XMv{5S{sYvrQf{zXZ6Js+wmsfka z;O#!*Zg>WtR1o=@5_BT`D4xF)yks8u_|5r+jRN6H&@r`vzF1{$RM6P70bUz%Iy;$7 zl~P+>9UAx7`>L-F)<5KTU>*|8;w$s@6(uK`a!lw(<=0dnlLY7Hrn0RUCrA7V%vImsF|B@BJiP3X;UBg^poj&r;3#%m%Hke|%aB!o%lZp>B}=Nls=P_2LiX zG-+N+bAED{eBKelfYQh;GhfB*wb@XE^kqf11 zB(z(2?tkPHAhv_turZu&wo*X+b|~#2s_L_PZsMEr`eI5ObE#OF2GOCD8XQqq>Z~3~ zC8Y9W?714%q;oRgLor)jGMCmy$`2x4>`}*}gXttO+JhwT8_jeC@Awv#!jJI{WrP)^ zTM9rQU<|@?mKIbgmqcB4Ax_fy-7UDkqg&h6Ix1bgHe&mA z76)Asd+-d;OXM;O{VTDeE9RRX04la~?k+DFyqG1XQKN$WfpJbzy|6!Ax!8{{9mEqI z<9xRm3#FlV&&4#4cq>p^;U>th}$7^!<0Eu@d>s#6jd) zXv{`hZ@Tc~C>@(zkQo!}qxpB$v{MJe?fW%pjW{&$hwb&Z)y22;o8dO{weCL*`LERm zu*9IQT*8z;e){(sf1R*M3OIu1!d3s>{jVQ1?EP+nZI8_xVB7oSh5#pwvjC8oIb#&f z{~QB;(82wi7nnvA_wGO2?|096)j@y7y{f|;MEmPMt(Z4bjtZKZUR3PtZ0?)H0NqE& zNc)YYrBp+6bLa3hjkS3m+o<=#q#Jqpx zJp1|HSy~#Qrsi}d!SYW1OrLkx?$(T{sHkYMNwjQP7Bl#fFRITd;sd{LFjsq{oe45Tl~0ecY)*%ETPr)Qe~(~0D=^*f2kYq4esticF?_13l(d>H zK8QrZpLlrER{J|=W@gr6iZogTsG{FI~_p(R+(%ba_oJZN^et#|lAeWu}{n!8n&^s`YfmAB3nJh%^ zHVvNl35smsEHyn{YR}l$>mB5HgG7b%jTFib&pSD1-iTw8cc8m`Y-BzqrTBZ|&1B0q zAsV4}e^@-9f`WoR0n^L2FvnCbx44#_?-(5VpUeWcAn|Dc$CWK4<03C7M`y)vlLH+n~!zvK^7=8Emx-@JO@yO%(QA@c=pFz{*S)qd503T$SP9u}$3h=M)Pb|}Ac&-3} zA*9V%l$Fum*XM&*diO3z*XNsfVohEp_oKVltGCb>{5#PG<=0!`ym_-D$*fAy`e^e> zaRQOYmTk|HxLd7vFJ4kS4*@=}{qqgR$Zhw!m_qeOF-CYCcI4349@;ZS_!05(;S$Mp zMorS~#im6RAPw=odB}9vCjvl6MPhq*r)d8b6938n_L+>t1WlVa&`5Ij3D9euv0i;y zN={&Qi3{4d6>){VwUbI=!}GZBhG9cT&Zg#jz1!n0taLlyfTT=1+uSU9+Q6~a;+uE| zFk|k`d!8V20(rehxX+({HMMOk+&dh64Ut1lltfX0x!h}t+EaNfKJqLK)1}-lu_c-$aMB9rAk#uc#6-`P?Ds4$r zX|}AfP-HzP4+-7l-eB}WVZB^x%9i2P)sFyfq_mXA>+wZJ%}=@}`Hq2+*{d}b_Y&rE z288CJ-dZPrmCR$){*(hKpK~j>{-D_%b$XMAcS>_g3-kA8pRt7ukevT?4^#!D>jjxu zj7TyK6$8p!S{fRHw?*aDnCcq7+11n$PTZ_@YB~A&#lNVMyjjqusDCw9YUiFR|m0vsOBSV)$=*r&%D@i7us|-_hSrLtnu=VzICRD341&H zb-~+D|AZ08*`d^5gJ;=CMMn7nqav9&f=}l19pr5^%@#Z$(Buo}(keg#&uTVba7;dx zC()a1+2Y%~4SDv3B_0T{6n(RNIq!m@%;{$0mws636^MVgosMU3ZJ zoJ37AqCOd!ZGqOdwU6C=ejKa4Tx(!3{Q2=tPVXU(ng)k?Pf!-^AX_9I4@`2E7fBOG(1=N4MGb$We z@y05Hyp`%<s6Kn0Moh`VSs3GWQmu^mufegiGGUbHi<>+R_29KrPvVdc83#- z)Ctu%8tNXFEZYM;p0>E3{9Si&GJn|Gc6a%`Wd!;1yz=lp>omjD)02V% zn&uetn@U{2{*E}@+XY)xEEs21ZDXB6Bo!x4fgn$*1p2pY9_?UM9?HH#c8mZulq*y! z-qp`T28mKh^WySWHr7B^Zfg3$s*9AhuG4BVuev%Kv^)uK9&{@*4mWbZI5FR1-z>Vn zJ($#B0qPBom&bo`Z!-}dPi?;Yl$NzGMdQp*Syclr7x$Of#z79SIieQP-m!nrMZLfE zADORwgi;_Vkm;(giX#08eco3cyql2_)w24!?LxUV1F0u+qaah&+?nBL@n+U?!M|H1 z>tY(Ynp{*rziCHgS|q%Gy_OX{I=`AV&DD`IMB)%1_4Os!BWj$bH(k>;gpxT&_hPTu ziv21m3AMbU0-P}~tRqDw+j@K6$@S($m8(VjL!kX@GlTkp02C9#yja&v*K)~*U!_iO zEh~^cltkBbFs4ZAux8&Ehay=43lDGl`6JrTV|GJq7?-+6G}gz_1^zBn5w^EcLX@mw znp&UAYoP;;Xe$RuP@QIh7PoQr<2peNfuLOwb!>d#N%2wcCMV*O@g)b{ZLA4 zjW3lbUS~ThNU2QSD?UCRY1%a;CI-b`u1j3aRKF-Qz!i3e{MD=Eb6>zA?zc1$-?a3! zrkEHcS2nql0sEI3TR=z@jy8E9m*~G~IIi2H?%xtuJbRp>pACdJm_7h%uby~9Iml5{ z7blmY1zD7ksKk?uKy)O)hpvNm6z%4jMs8EJ?fv`SX$O{~1HTMwAiO7{D_a!w$sXpS z(+X+-x<06fFD{5sL1AWne4^T9&B>OuBb4w6o8_c8(Kenw+XP(H__Zd)4E4lvxx57( zOe6A*Na@2&OXc|1er;Z5f;sIf^ATIu3OASfRVBeUx$2Hs(4Nv&-wrHxJd-}dSa}>4 z%s#O4y_lhjOf!GWOo}z5GhV&V%e1yj8}k=x%9{}x7GT1k8TqPrF&wMP6gtLAybY>r zSq`UWc`{j^*Bhgg*wU-`YFTVN(Vn})?@b=WiwqRG>0(_gmCnU{NU}mrnyiv#_L_QE zZJ5Ox8#g@{585$ji2ciz_6ifs5Yo|9kqI4(dj@J{JQf$!mf;m@nGgW7Ow;9L+^fvF z`wKVQ#F|PfGQMN&>cQRpqq1Pp1j3>F{ug=>Q5kc6;ie8$mCpk|15q9di8#NJ&PHqF ziFR?2cSJwMD4lOi#(ow31#n2dus-SO85&C1yPIDSt+0WEoF=y}jwZ-xaTV2Ng`rgx z&WW2vzanre-r5P1%%JS@hAbZ ztQROJo{{gN(R>s!P*=yIgl8MtvvX1&_37mV=1hAKeT|4b0?$@X{-E5FrtcBITzXJU zBuq$;OhtFVph)${4<09S_;I~c@gh$3fc`XR+$9GbexnL}$<)B!O%kdy+^xNeMw8Bh z4Vi0l4w%P}X<%wvOrg*Ft5jPbWwB@c3FHFtc$ng7zo#rQ5E?O%ZFU32!`< zf`dfQLD(MsmB{%6AFUwL-ET=&238hp4pK29Q&c&D$g4u#WJ6<Z*h${KYFt9h z>&mLAc%KcVxBb|{3n7MYLQ~Omob7<9hVd^^M(}qV$TJUVsP&&S=CR3QB4V zz1z4`=S)yjRQ#y$&06smqbx<|~BG3mx6+km&hxwB@ly8z4keH+L^Kwy(1ytJf7 zT|xKZC>>qrz`tC3K7t&zHC#%(_$+tff$2z<=Z7p<3jD>)+)!jpf+&j@-_z+r{&|lc z47t}BoJe>ovFS8Km0|6Z#!1fC?V5jK7=V`0t+DsA( zsBP8@Uqc-j#mB6O_R)JuIVrm)2M05eU0-P;tEtys9+gBys7hk6y%;bOk?2&ms~rt0 zH6`ss8&zacVd|<;P~*oXJmV;>6O!T0%_S^O^g+Db9sI{F=FjNLeeHE^^=yW{ZaAMkN ztgM3OVsqi(;#vW`b7OtYWWTmx?Z~PB(lZw^z0gXj)$?69wipMAUT`%Zj{5a+FY-U@ zIR}V+&Hn6{f4*xv);ZdTWG`PIZ+iDJr-%lKdG~U@K7kSW-wC~aaCA6f57NF&w%uNi z*E}ZBYB4KKTCiBU6(|Z2)6k%SfDh?VRK2VBpcar%w}^S;jOibi;^nR3)>zxu!qzvc zpw?h*mm2PJ?TGLCvZjEtb0^cq87}zRbkiJ>lm@3%q~m@*pu)z!FaeI6)?h^u+o#^% zekkZ}2My+0jfsSk(boO66hvyX@!d@A;`Xw`8(v&QRTY8+RZEKa6iIuV_+J3e>xU5E zUT?gndu}cwJLh88(iAEQQ=~MP#9_4LcZf!=g`bdQGKpm%8y#Oj^f93I+qI)yBfUe8 zR@=`jbfgH8m-AB{FGuY@Bj$$)WIz!&Uz84Ttn>HnYZvEqO-`Z)H8&2(o_wNXi#^B^B{Nf^prujZ?-{Rf{|Q5z3E+QuNSrF#$&Lba;OXqctAoJBJ?#@lGm80DAD1h^yG9t;ALi9ar&er~vcs4UVk<93Xi^P_j zBlWI9pQx*8+};i9T+M^Zi{6UohU4i?iT?I^eu~6v!w7 zQ5Nk7qH%x9eu9;LHuKD5^u*&H{5+2ABH`Z{@mc!s6Za7S2-YEBh}atitex8HXO*gY zi+UhUzgWeqI>qNI%0gXP+-tbn4gGR|9-OEf*2Q5 z7gk$M=)bfb01W+|0?g=MRgbVQ4<1!re10m$K5tzEwR-B8us8?i_8hu#kO41%v}A`GO!@q($0gv z@Sd5~je`raYqnIa@TaU(v>O_oW(XWMi!^G1>eKyJxN@V-_vo9;KU`rx!{3lMqm~9c zD}hxsxZ`SBxAl&)M+HJBkFYY^EJP>qK%+UArVkmfcz@4a^!dJrY-LnkVL{Uex}Ypx z=2^7J74eEkeFm0P+PuJIi&M{~ddq$_%T`|i3}af@07#Mnp`i-V@x47gpEx+02Av;1 z{ez%qF#gUEPb@D>Nk(Y+2KGQwJMWa|LpYk^K>^%`feUW=MoWCa((XdqpUU3k+Q@5Z28$_G}4-gh{$ZYp>hz)Nm%he(k%C9KU?4sC0A`G7v|lIFoHcAejffRE|Mn{+bx#=T$z-$vt~Zf z?R=S8?RaN9EpjG}+(R5k5csrbUJD5R=mE;Oj?Xu9kx5BGK+0%sEsVrRMPJrc$9F(3 z64b|!eOfP<=t&VFMSW%qKVKixU%%+;W*u&Ydpr^0Ic+1}@GvqW1LV@P&IzY~8_59% zG!l1%auCC}gPT-ZRwdXBX@>R|WK}UOC-SK6hG(Z*s8Ci~?CYSUDYInVD5!OrioQLQ z;YoOAUJIy_;s6<(-ud}tKy8pp)44J~jT+^H`f&h}*B~Y#(E+HlqDIvjhEyRyew2-^ zZ6{%h+Yux@o;*JJ{{9_-Kyv(`* z@fCdIT4N+2vCUz+ zxw+}N+8L0MmYzH|r)rf-WAg)uFWrE88E8v59%cp1(%1J~QUZe80;!CAsK{Cb6qG!I zYjkvU+MhrDYHDms+(w}Pi2wlIAjmUT%v4H=zn=j790>#)aT5#sz&h~fF2h3J=Xe7) zGLjInKijLbt?wCd_jyXw?pT5gX1e8BY3vRJq@=<@MyM-CM@PSY{pwt*F{A?~ltppg znks3?$z|kA%gTn>KPV=Q+b*j%!2Z5lsGpGXG2`0{&}A~kvZhoh!Qu4A9tLQqH@^X z-Dsyjp6vp3ONRTqWh?-crLUh~5!qu95~?NQ-ph>NpA_{0i z;~IgP%ZA|M8n`sVL$n|2JUl#}!P$TAV>bRN!2;oe0VF7~;h=<27YVcj9t2ZP1KbIn zfT;@cDoMezcDB!3d!EHL3rko^uD7`=&#%_`0Uk*~HY&g&iR3#Qs@fNt}7{S@-}RGjskYmj>$fE6_FQDU`_p5P{s8jg8-dp>O3j=b!!I z*uWe+OdPzbqGCQcN61@tHo+d}!5{~W&Ht7+G)Nknmh)3wIK47@0ld)!xGdQcph&%2 zqQOox-#9T9;5v6%T2#{fg>!W#Z=4q|S}pMSy=Pe-!snOgpQ$Q2n?KSrGB9GIU()A{=dIjWM)tn=zN3C$Tl>m(8e*Jfb)63|@&ROSLGMqC?s?>UFB?A; z8XB59G&Pylwzj!lek_#(a2fY1;=R=-o57Kh9-!f(u$v~x*3sw}5J347TweZTbZl&{ z3K%M!{OuuwIrN{gR$vJx{w3F>oG4zo%G5XdoBklC2n}OXgX%WTv3{A3(7DwV`mrxC(Os?D+Hek? zP9S4$mJ_fcS&JaEF7u-{RPLXrc$wO3{#(|W{UALp@C*T+Uyv>mN8@;~b+s5D3+999 zy1eg%E-CoF1ly>3X5{!;?p%4GE8z)v#5thlyObXG+1UL;i5n&OA|3y(v*xc}YKZ%% z5Y%L3;4Ul@5@APCZV6jNq!i%5U$(aLEvx4Hsx_Wi(3QO6TA(lWjlY?Y%a-#KBZP_D zY8&Q+(1B51JzDt@Bj&$nxBr*`;W~VWRB}iC^mB4GdjJIia_7VV7#d9<{{HLd#wIqoBL)waX#pHn z`LQiUOc;+b^U^bw^$qH%2{)S-wYQ@2UEu<}$wwEZ5;|#zV1||!QiNTDPwpcBNPf1hgM^0eyu=4P zl5sde3T5QRMimBj+Jfq?6efk~ReniOudZubCwtIf{BQdy8`Fm8FWY&@x%zs#y^)&m zS9W5LYn|g+wJqg{|p4a6Nr} z=2;K}?e~%=xI*;j?QJ9@Ap6`T8nTqv`7^4;CZam3Q&;@#WqPjr}ziIoP% z`1$88w`m%~t;?$#!14QiiN%qVS)v0t!egFl;dX3bj&basW4u2s0r-D6r=r+{ zIr@CX0TMO#cBw)OH#vv~HBUd!!PnD_Nx|K?E(HkKKk+cm9#@5@dbT>MO_PdR|z%UC`*Z4y)NumVW8s}+~$fWt#b z2KIkIz>GTM^29ZIJX+~XuKwgjG7SL*x@bfynWf#LIc$MZXT`HVAY$V z3(D6L5!|M@i`mFS$~sE4fbLho4}bP{faaI>mL`Vf;5i31-6o${x()oW!__;tfHFj z@v$ypPS4)WI{5v6N$9w6=3F3afrLrSkT?_O?>y% z5bPi3Qvz+Za`5Hnu$LmDT-aONI;-nZC(|W+c(9i{d1kObMlBN`Ef_u!LfZ}<8lEs{ zF>%-hxs6}N;@^BhuXnhw2ES4zGJv!^VD&7FFh_ECKo9&T%a3oohoQl78W73F1uw@=`w zi+0FaUhTFybfD-7H<$O^+yM+u`DmP6m~GDBJ0Ua++mA)c%~v3j8EriCIedNo8J_9{ z9v;wZ(w4iAvrEdQsx8spH+ zf#Sxe=P%C`&}x#PiIlaA%4$)bGyY71)y4@e(~aDyex`z~4qP}>bP2RNM#w+ZMZc(# z-wuh|Fp&qzX?Q4wnud3A7en{UrTp`7($%icvm??q$ zb}d6-H`c%Qos|ljoh*7hs1U>*=a;C+0O3tRVF4IhuEC3dpYHDDFXRNp-)s49hZ3O4 z5r)4rg{NMmb8|KGtMc&Z=p+QQca9pE(tJ`<2=8%Ng06C2irV`l&;?%XNTq6Eg|^qQ@;bw-R0_wMGCpORzXbaQJy-?s%j5|?sY{T%a;O6ISdh6Ytj zF?#pwb$Mw~8dRS#-u0b0?$@o%ko6wQp59(%PBGOGEfZb7D8>HZ&5x6`T4~;lBbM0C?y#q>i0b9 zA91@F{@BSd0TvbM<6n6;y|E<&EONOVKi`586QiQmDqS|Lh;=kHur~LOO2hk-=ho*% zgWNfn11!FqijdjVCcSK>B$!-RB`C=A2v@utWcyMPn`+$yC3K_8ieeUB(@|y?lHy#V z4fRAsc6aDbH?j?;v#i#YTa_6{4JX04>WA-BR*wv7`)fw70IStXFXMB~5A2kMnofs& z0aert*PQM(R+-yW!Vgh*tqaXFEn#NvR$ON4=Lo`^yBCeT8%CcjFA!*$kf{nOGE^?6 znCGTITpFV8#YK3yaSRv$rch@g{M@y0zS%{190W${Nm7uXjZ45jO}=_l1(3CL7tY^q z0SYC34ZV!IJfC8{Nt{;qJQGCm=vN^AEK4AXC{1+cB3yWv= z;6PETHlhl@HNspA8uf`!>@H(pKuO_cNFVl!%Hp#%d)Q|}nBS=4#Pa!8Xa1Z-Jb&bg zlFabx?CQRYubX3HCXWX8k_hLj;MFMWvo^(Luh|%eDMnq6ma6aJGcz*_lBj4ijtzCi zXHQrarZ5U%7c>^ewr&PdRF?`Pn1-w3a=0d!Vw3M$;fk&6N-!p#lv0YQZJ-z{j}16; zs?nI34eE~X9L+I+yAeE+2!;?`Bmk^Z3pY-Rx5Yx3u|&p@#*XFW6Ht|!^qg}n>WH?) z+}AxUuLF07Gw%7$C@+|j>sDrh*Ubct@z$VZ<7n;}J z9XaaF-)Tw4Hw|;hF_jG|WNAjYkZWgqMn+K+7LC+JJy=XZiZI<#k0Nexw3}2+skoRq z{ao@mpT};J*ZneV@KB~_5VRI9K9&*z5qXhU=zZktjp;3GscIW48jWUl0b_iu(i9xd z`8h2e9WSdJuI$Y8AfG*=T7!APg&;@1MA9#&(m*W(OKaqRw|Z%bJS70WVVG-OQ(kEm zrV4Fap8AH<1uk;JnPpU5LZmZIMp=2clFY%zN-_HifZFG-R=to#&(OyWu+x#JJu~;m zM2vd^g8HB#wor^IxCrhWjHi?VFTxE|)+AOlAiqtal#m%zNC60EeYEFR@ZgQy=c_uliR$`9lcf5o4fI6R#&n_L5 z5e^GWhG%Z~GaDaw)Ff~qv5tq}ia)Lkk!&AVzuh&f!X==?mM+TN#%+9HZc)0(zGlVX zOQug{p{3*Ar4MKc4X@ht$@DVr)3vX!U{gH!2P~)V8Zc-=`^?Vlf_|` zb{4mr|GN8u%_bL?EEd@C*a$>Xoisg(nfTdWni6<_I6BlH3y+^&+Ax*=4ld|DXUC)# z7)%cXPIwzh$PA{Cu3|#G1p3}C=DC&IA}kd`VOTi)K-)1}P%L2vj(b9B!P)<=QDZII z`7;PF4?H|LxR(nk$lHR)$Nb8-uvt)4dRXQ`xIgZAHR-IZdyLr`yA;{udtc$}^fx`- z@#-{>w^pS!?$Qi(Mi65umGEFd`V30WW1)Hug8~M0chF9Wf=^8Sa5*wbcS#h7k7CMN zsj|M)S2kD|zdCiXCEwg>@y^3(^JmQ5NbVu_)~8#FTC;~llvf*>U`1b({NoTXFlgX{s%cPb$&t|`04t)RtX zN&MyE@xXt0AUEgGpet(Z7;nU0HJ>#r@$ubVTR8 zeHEY$bP{kk|v+GPb{(9*>afWEEmLp9`~^$lJN3eiPB89{s=(D zfVHlJsT^F<(H}UyhZQ$L0|)(ItfuzDIa_WX_v$rso#>Cbs;0XNm?kmq{7mM4(5UtqPmZw<EpO)hxaNK?R2|2crf2lOKH@g`dnW|!+?X7)^NhnBvqSlk^o7_H;5g)~Kwp`9V zp*1~r)M+rqr-XlPe&8!1Wh{NNhQqvBVF%fUI*2c;x}9ULG5-DGzG!K@Eg`}b5yJdE zrN)sYlzQm1Oab-ejnb0>MFLyZV)Ll@D0zZ{r` z)bYpy2>1w2ybg&Hl~iHMG2ySfJzX~kRcBPjT7%i2iw%lD?M{qFt=x8u%~``=ttnU~ zR65+YBAvgCr*WtxvzSY_>CUrNkYF$HXa86T08zVAf!2f8VAHBt(fToXaEzHUZ{XtG zP*;^NE6ymf75fK{^uUF4PiwTm=PJlVkhIuBAmVTE)}jBafv1H&#XZT#d9%pX`;@5USw6{7-+fUbx7yXQ0sX>iIt%RSHjW73u0nz z4C-p}v(Auwq$w3kwaOaB@+$xEu#iNhf)zu~-X0d4)BP(Yy9Q4*HiobDT(QD%P_4(u zd$2k~k^zAmK+8CuDTpB01<(Lo#GL{98|`kkr;Bugok^}AXBHm(>`S$V6F90J?wm|Z zqCO1Hv{vtk0)o(h)@RO60Mshia5fOz~Fkk(v@knC?Z(Kw{yJR&M^M& z{IuL`N9p!_R6qe5laYaYw$YK%ABvtcOdAvt9NetkVlDIEyBh+@n4D;HkThBQlN{`! zh*(x^ZU)h-eX|=shh}GWx2MtXCW8bAe#?|w4KkPDBnuEnLG%0 z9q)G)mX1PtImBXxK$~XQ>oPq0zgPR-pC=~J$ptg@RtY#wjDSxUFrDp$3Gm^u53rjO z%@`@eBb2dqE6RQfjHae^aS=gwBuos|4Gl_&X!aywfYgs3ndFR)jt;2u=6j5+2`yT`xCq|uz@ z5N?jFegv+?*i2uW zWs+H}vV(QU5n}g;or>1{94xlBI5DcYaXcAThR66=SNbPt~#*g=?u)-oy=!#q!7a`BG@f`mFX)76oKJyJ;mB~MFf#(60(d)BAU0#j_TH%@2 z@2{UtodF7X!$t0+FaK4=s~M706=^}h96iuk$8XK!ThUhp*%^k) zmwga6?=g?W(ggJ%GTO-4*zDT;<)7-%qY@HaVwj1VQ#!!tnf_hRn~L!8d z5d3`ycvE9hcq0qQ@0gfM!hFUSZVB(u{~mGn4W#XUUi+xx-!=W8rESSffY+@PxmycNod-`S)7>=c@=oB}n$M*#cV@)*b~T>Hd2Te;-!+12l|eUwrWH zj!jyqAKjETT8wW}?V(@f!sTYYY4Y`9J{KGBVP|KIQ9dEv?A)k#lK;sJ_k#Mu6M>RM7As?GF{ z(jL_{_4z(fz<`vh5IK1Pu%Suv_5m}V?tK{=tn8ww;P)Mxir!Nr-?}U^(b4m69FlQs zk=eL3pF1e0RGtWmj;2>_c7?e+M-kv!KbN2=Q5d*>;tz;1dRP}|wwV27UD+`IWA0@f z2?f-NxznFAdKnIs<7v58A7bo%V`BI0j2DiJHmKE&<1)>dTQ@TOzc<~xb1i_!hv}R` zIW#1MW{zObR3Y>nQxd_=CA!J4iO)wQ94F9)EATaLxR?aLSKpzZSk}M*)$Y_t5}1ga zof=LJtt|O1C+Fn!*=(&ofu5d*vCgRM6`NLtc5*-UIDDMk1jeY5)xD#j#t zwDZF$F9a-!tfuBV^;VZ2H$4He;)u*}Q!J$}iWuO~tDicAZ^M8z-0Pyri_pZfBxi{0 zFs%y(N}p$#4u&v60tNJU#gInwf+L=5$#nuYf?xP@fp3s0vX(eN6F*V=ZlHO@nzp zJA1^If>lFX2Lwts0T0(SZ~Zn%>aO!V8t#W=xNS30+Nfnk8W#H+aZa@M|DFsU7opAk z-qr4DZ`U?X@`KmU&5($iva-knr>y)If5St(;bEU8Uz+p`kG;g|? z2U%HEM5oa%FRI`8-kG~KOE`-gURq%M9(^auU;&w}ChZ8d+f2E}ZGeXj%+jRjKImlA z%0|67tiMGA_}09U?+@tk8=0T9lIg9;&e$DeWhD)#^TZMq-lOPb^p>V-Rbit*w_mT& zZf1MEUnW65#`U!_4-B|?S~0FLgD$xLWdV%4XvzGNHZ1lv;AW!;{h{$A>nUWC6bnY)222b#sQzSI)QX-2v~9964c0OIj!IuxRSOco#vK_&&!B_$^p%GBgl2^%S?HtMmK z)(ejDc@yK0D4J(+zQ9sm4_n6yh_pNqQK*RE6R|)ANKU%tK*)}6T1IYAs8;HMjeVJNu(Qf^3YpjW zn$Kw7{Ykll+W5mux7Kp$%k{Nw*0vb2E$X~&y>tR!gZr&Ay~O9Cu*12}dao?hT6LcV znjvg2*AVjdzwhm#O&=mm?fy2@kQhd9@o>MyW@UE(b;9{<911dQ=BG#CB}xlYqkul{^f9Nph)7YTg<{^&f_DRjqR~H+;&)PPWf2rc_WC9Q=|* zlb4+>78_UP}-Uz?}t7sS#9V0p=B&V99X1zsg184W>9Q-L5 z#}4XT+~po8-&VO?Ol*XlBAeaGrKy-?ApBGcaLiOvv^FTfF_)a|aUey5x00mef1VD= z7|&~b6V`U3ksnBNTb(q3_+{KIv+C7ji?_vM=g*KSX;%8OF*xYypHm7|x{lwqSF3ZU zs2^ubS=eG56OP3BP)uV!v=+Zdi z@&_LRwcYUNrtZioIAZV57Vd(A-tU6UE{7jtSMhSTs+yaRiO>oC1*cnZ-Gv1!_XEIR zrrE>|02^X5MA*7F?X->sq(7sE6L09&newGXiRADDzxm{EaMn-04?X@{>jL5394DN_ zqht0*Nf3GHm#DhkP}v}tXbP#xSynIns(Lg#Yir6B3#B5KJ?-=I=&1OoH--Ld{pGWF zC_UXmHwnGU`1rVjWTF8TSQi~>yraAVz8+yW%W)5H%u69LlJe{~7J{!7yKE}LX3B(o zUvU|_^u@@<^h3j}T*Vt)NY+*bwlR@Ro%LK17Gw4<6!10&$$&K7Ch{}cvXGR$ygxh zskHScl{GE$xSqO#UZGyOpYq^(K`22|J9_JA%Ozn`-8k=ih>c~ei`-rf5^!)pj70n^&mWAzkQ0 zoql}Wp=j0BVllaP49Ai1_stU3p!AP1i;( zk?@0gt-}Uyq@bICUQpiQuR-cpx6F$03Y=tM)|PQ=d~SaI7$)qoQ$}gti=!WxD`*uv zmN8b=xKa_FT4Blg@9d4z=>nFJP0c3H&r|f224#VMu4fJAaefK9nq&4Lok%LbthQ zq^}K5O_f8{yuG-cNe&R zlWyU_=KeL%(EIq%C_*|gZ8LF6lZA<4-Vm zUY|XrKx#K0kDutguE^a*7L}UFoULVKOR)>L-egH}iFy-1Rcq~P1++-VaAJ-BdwD$o z#j6Pok9_0AjB zPhR~TlN~^3JV~`LH&FSJlc(^fer6u~#lKB>3r zmRHQ~rFVfrzmHeh6}mfRj!;AHLSjBp~^IvYmjwrRGbt4Keb>JaC4LBZ3zbgLTBBk zjcEIUGda3ZGc(gzV%Aa@GO7m6F_OJds+dIo{4aJ;l5PWbBlIA3{D*uNG|c*E7J-3G zv*p>F7(GH7b|VXC{A(x8bO@iHU8cg-14GMsr*{7~rOg#xT0X)>vt!sU3_r*~atFg%G>AhL3 zV~GCEt2WIAfJ`72Vr-WKFz4ggB16MQ0rFzh%J`%nw#BNU>$sI~1T%A+JQgS?sSbyx zWxebcTyRT+=%@QbuxYI=g`6Z`vF@vg<={y^;Ve$g7NZO-NAENt*{C9MA(Y{T+73*Vk;RsRDPI9!AuKdheo-pErjg|&8?xvPY!M2K z9Qy?ifJ=DAX2_vB*4LigPkB-oy=gHjkiVodHZ zB2Qy=sW)gyepA8BkR+RbG^w?=6JxB$DRb4mSuhi3H#gz5yIJ5gFI;baGPf_Cn^9ap zxqmQto4#g_t*CmCC@H9V!Zf*1JTWeGUAvJ04(uqiYd8O}n1`eG;D5q!*{F5KNa@JB zH@|b`e=BrpFB)iAu89Ak)$qYwl954UUtf>RU<>buf1Md@=}^PxaM=uh!wy-`NDNs^ z3~oKHl}Xc)6jmtUb5t~dYd+5fo}$|@g%rURDxHTDI2~PK<4qEI1KTVdjgZTS<#hDw z2eY_Zq8{ZiCe<@CBj@)Mn^Uxa*$_^DKEkGOI(S$#ju}cOGc_&skOr9kzAOweI=WV1 zyeS$e*1o;J&Ro!RE`L_$`ft+A%gIU0YD&u(Ek5yHv^8_d*lDcm9c6W4CL61x;>IID z^;novsUmAkt%1Bis(q2U6^)oUZ!%b+#2AO5>U60_>1-4e5m7)m9LuNYKt*u8!Sl63 ztpj2Az15mS0cFJF-x?VY1H$HSP<{xw%-G!-NKNV4QB`v(x~jwt9Q8a!-pnyVOH={p z=|?MxW5bR?%ifcQQrIXKggw^kV6N2UmY(BIs}~80F?e@tQMIXlQ^ELi;9M(CC)^(wG{paH9(#M8GIQ66eY03*eGyKHzg9#g`4ad5UjT- zDVN!}PL}jHahMA9Vj@@NrIl^+fB7c=#9ADJREqjqoRpaQ5D{L?wYPKjt*yo3uFCa4 zJuG-|RZx(4MU(5{_`(X}W1#YmNG6Ky&BHF}8Mhf}zcD`xMK{dv?L$s;LEz-vD2K;H z6hrjCJ?8=;P|$Q1-wnmHw7~l$a z1=QFr{Ay_+Yf(WRXyX&YLtyYN%G9XO{!>b;g##y|5PNBqnil&v)c#W?MHTQolgp;F z;N{7q0RGbW8GJbjM9oaoS4$@R6XAc_a+~Wsoo?tVV}6dh zY%VS?CbtqAc$N|P(u#^gtgNi^%F2a&1kEiiC1alE5MK|fo)G>_ zKS3nO(PuXUz-Ql4@iF7g&UeU+L`i_tEHV8hog+!0si_GWXI*WM{Nq00uHl$zC@L!nSX@Vb7rSJNCrNQ(M4kc)x#hj zB*y*EpFh{ypRuty(xwAstx5*N&vtO%@{DJ28mU*%EtaYUsc9sW8KV+&J)V~iVlxti z-JWl=fR^l}!^T^LrpFr!Jsq9#ZJP=}fInMr3qbwxnx~iq^pU3S&)AI?E3@jxH^zM! z#i^`mc4du>8cs;iLhrVEgbNKPXi*m4?C<%H|Ly~4mJxL3rhcPn1;IwTB99?~zwnSz zS1)yE9uXBI-V)YE6RDA_SK?eI-xMkOC2gF7hf4Mz7oiK@hhLt@w-iM5PCil(QA@EbzEFrY*LcQNJ53QVrY(VM3h$+ z2dFkhnE5&Yzh?X6vM=8aBC*aZZ&|}&tog2I2R|*7B`pEu>jtrd!vm7TtWz&-UMVGJZ4VO;G_xK>I zC%||ft>%#LTyT4D9-RRvcPyo$n2zp;ii!&3Nr{SHpa@uj+spk7+F%E>ISuE>tHoj6 zf+jIHH}^J*?`Ie^xuLz0S(;{CDt@`4)m1F^`8eIs5#zn#I6X5n33EqURyMY&-65o* z&dyJiFdJE?io~4BwAvg%0#wH2TpZ$q^>aJSQ)8Qb>Vo}xTX6LdA(#8i+~K5I_N6j(_oSjDzp@hN_C$+Y zti|Ch+oIzQr|sBNe@?E}evQrA^PZE6D%6qSx`4aA4D!MUPO?BwM5NYa&V+>mg#!DP zvZ7T80U_#kw8CJzYG-wUrpRKW9q5cnq`A2rH66H1eEIpjd$5q?pVPs_q<9O=Sn7iA zj}Id7-ofa2iKh@w3JW+5^gaeLnJs${_3=5M zRtW2?ncnBVSYl2s+c+&35O{;Lbtavzjzd|}3BF&I@ zzP2=)E)Y*Db)VhYLE@=)D5A0jKcGLi9y>^m&=1XN1mjkNy8R5i5OKkH% zlF0b@{NedfqE6l4-Ro1s$$Wg?aSE#|DgTI z_cyML9xt$E2SlCq_KS>LO?V?NP&^CqP4jq1ktl4gCDpezhYk2YnFsHeU|~26{_RiC zl-7233JSACiSL6WQF1@D&Us4<+^>4Y^h^wjM+z1|;^S&;_fOGd?TXCXxl0FMi&Gli z;>z2N7gYMAV1gi}K<&GW%^**p4$h300E(FC*7x1bNs%b)A2xfUD1{zrqK}{?pPJF3 zap8e*KAqhsX7p6OM*;dxOcE4dZEH5mC!L_>_|wN#PZyeisu))H$l{=Yh`6Kc3Z4x* z8GT|#%I7uaZ(r{4bY2G{a4Uj$cT)py^9}8+ zC`-bPS^%`Sx2eGwNLP+;-)X_ab2+azu_}If*cm+i-CyNFLioMY1=z~)MsQz&>rq3X zAmB2aW4)a_RMdSZUuf=~h!y=#Pf;Nsjq`4N1g|L9@%oHe7rfY_l*l$lS(tj8j3C*t zUn8b4J^b zTU}l4SuVGb9xt{2+3P<1(+QM{0Z^~yBNVQ-Uq%m4?C@LNjhv33NPVg$@J2yt#ua+^ z;(+V^4mI>8MxUgdssJ#dZ6HX&`rNm&0)u+C77P0n62F*Lo4Z>bJ!W)Zemg#oAV-yQ zk4wuVBFG5C{IKvf=9BKLISOCPI8odUebj~Y#`UN2E8J=(ki`&q^*@RgSqP@(x|nC>Tp>G zJ6>&~a>mB6E4SDiR+v2OsK7~YEtawQs;c7jw=OZ04$@M&8wk>0WIGOmsOK%(pInIL zOvRV__qPlo#GWP7Me{?@t}B-hq%~|W+QBZDf-<3Y2BL66iBpvg20Pp|({bjWmQMnl z(TlmLR4L~#GJl>pOzU%mN`!_P^Vrg0{NxZtn5?H)c5mz@O$G8fH38g@6NT#f>R$dU z=(3I0fci6zUlS9l#gH#3RBjf*YazsUJGY}TF_lz08W-@0a2dJZQg)1%W4CtC@@hcm zQxHfS%vXeAP%S!TYtV7(u?JDLGC`)ak*8Yzq;wZ%y^lEYdM@Fr=_fS;4lx_(E(0`L zReT6+^^rB@9MnG*SQ)LCT3bT`=@B8O&wmw26;OoS0ot3P;pJdpo;ygNXnkE%v|t=T z^YtymJ2wxa3N}?FCj=-xe*ZyW7^yg~`-dp$M3G3A0rv(fuAFSd&e9TX8yCQ{MaV9c zYixdU7BZe32y2OOb#skP)xX&vJI?CL!a2b#^-E%X_rFunJg2OHwR|~EY_dC1T<);I zja%4Z8D9HcG|v6;gmc|j%;Z?z1)eG=FOU58vVlvX(GVj?n%8AmJca;1Iz~M?!QmG| zk|pDJ2~3dr5j>RQUaYmix%<$Rh@qn=9dE@r9>U*wyZRwD&^er|?`<0E>4C${gAl)M zL3K9UVbVH@ddi&;_DU9=SdGp*|09A~r2sWWemt#_n!TvZ%j+vsbkK0py&UH$ZSC** z6boJ;XMeprsG6#dmnJ_jT-Y6wu25_CBB@_^d2`{ap~1{9bK_)F)9SG8+}7LrX?_!E zN(MRm*=1$<5FSo$$<^Aua7B*)n9GeBV&|rH;@NDg!^t(}HK-mgLPV?MwMj~Lngc^~ zdSug@NpBNJu60#qcST5TY5t+WI?n2;cM-<^%gP0=2OrP-$3BYmX*if8q*+ean@dbU zN{lnA#WG?+=?6BuYN5N$L+!f_F020Du59-f5@R#1>RrLPUEI;JN0G7N6&^QFMaMH^ zsWyu3;UM|*>&Vlv=zNP|B*ny>rXTNC=iQuX1N7Sg-Hnq_NCd0#Q|-0t$0Np0SJ6JJ z9pC#OL{M+toh_YiX1zf?3W^`H7zXbvKgh}RyucvH-k8*ym-t4nk;CD;M>6RZ&j#@pTYPakeZy&4FY@lD0=}^DQJcEjqxxOHBO!Gwb*E#1tryLZ5{F>W)vW z(j6cpRUoO-XtB@Hob0L4Y(w1}Eo8{fR&RBbdDFNy0a1IcV}zf7&RM+G!O89hUgL81 zlCaN10v%vPfR_)pdIFV7=o}-{7xk?5$<`Zw-@E&j%!m)br#LP?^`(T^!9fZB{g-OJ z>E~Q7^I>}1-yghrqz8dC8hp)o*P^6xZi|)Lw#V|($+MR}!5(5xH{aYNg3yD*SY?f` zw)-LvVr6gzsBW!~~J4 z_cc-<8_Zt9HHMqqUmL47WzRky&e(LuJC@LHptIIS3o3EE7?0k)W;?Xt4n-&UeJfg^ zPN`c=1*y_R$35egz5RXQU7VWnw!OkjE7lrQU`enBz<45_h3_&a&EIn)f;$r1V!zzO zc(mGvvdPuC!#38-d5h>*k{O# z1W6y`B!DBlQpjuryCTp@RR|RY1vQGFl>K(=I|=F*q+ou45tK2bo-|8R3i{NPZh`Sl z{o7=KrY90AU&tCa__NZQ5b?9)A}O){WO<_iM<@&(D^z#5Y;&dQv6|%__u1C{E}IlA7_z z4HvX=aq%)N{rv)flsL!sQ~>%j#Iv;OKI<{s6!xNnJaxrVrJ4%%Ksb(c4f}Ny6r_5; z^+z?z9~37H24}~gAf|jM4#JABWz6w8ODiig{FbzO6)&%^u6wmZn4Gj(dOG8~PKT3O zfhLHBkTn$*5#52*Se(Dn9Ud$pyv9igeR+Tqn(RU%kEGD|Qp?_KYOpE5)j~d;%hd`r z)%EegNA43A8LK|1pjvpQ~CpTQ{l^Nhem99}-O!*V}DO@x-YB zfaEKndOOw$`)G^+jOr2HPvwSS+;k0dlBBr9tdoLwt9{4<{C9g1bd;mz7_Rb#fdEV} zA6c`<0a5}6aL$gIL(;MUI6_?B@)y|BRlu{#lAWgQ(K|Y;az}ow*UfD|DGBc`$%NQz zh$Z09=rCIW9~}lJrUG}YG8sG zF|NP!zez=e-<&U(+WdzD86H^`9Vrr=S5!fr7t~@Dtk~REh(b$Xo8m9A97z%TwON^#Yl|EWe97EMog)J&wqfqk_7XeZhC$FEk51D z0W=I}wqi-&0*b~($b~$95|OIf8^C*eO&|oHhGEQ@77KA2GmH~?ERr0q(L~+~K3+~1 z@cRA0;6GXnL8DpZdqTv`^L~C{HH(gf(0W;MrKn#|1yVKm-?CYxV2s zQzlRz;)dci{?L&ZfA9Hn0=iUn<)g0mnVvb@6Eb32B;%zJH$5F!dO_O>@}$S`S40K3 zSia z)4Z5d$?A@<&om{lD^hgS^(EYBf+SS0llJEl5-TqyB)EJF=`MQwb<}@(FkhKHI-Y0^ z_s3uVPN@@rDhpaqo2H-$?qbmD{jkTyG-zF-NeZPosm5B4DWBa$t=l3dTKgNUjd30bTZzG za6o|BqVMuM@7`*AiUH&SY9_2>LpQYe?F{1%*t8-rs5fY8+p~PKiPQ5eWXkoomn#YI zNF7L6&&H*mZ%2BhT%hx;R!d?bkt^8j$>3BmM5U82`(X{dzK$FzPRG(dM&rSLV67&% z5mbB*Vf%Fnctou8(hF#u8GVu-;Vj+yXCRw!qZd)QXNGi@tAOmDl%V z(+E`ava29T=d&5Pl1gFaN7oh}=e;xM5?z@Ef0ow$Id=gxIsret`|Ke^zqYZ!`W!W% zGbpU7;O`b75BPn<4_0(HY=&+iOiot+mtN`AZs8tF%_Vg$}A7dp;!SM;X z0v-KcplZv@-a4;ThwE3&+Ubr7)^!@$spuH7gT%bpNzS*_JSZ;S=^A`!+W_M2ccop_ zav0o%D8wRobP8^|(PPaTQ0CTUx%4X~WNH9L`bbP$8!97kd=bA1yZf?R=1oM$gIgyG zvfgbOzgV25cEjRim-3#u5)V5|_G@=O8}(ay&QGvzic)uc_JzfXrLdL_5694FPWR#< zrQIZprJ6e=?yD|N{Go+xEW;#L95G(|@Kl_Wb6H0@G|%wrE}h`PtswotdUW;C8kdcq zmwl4EX8H$XDc-M85_9hh*HhM>S0xXp8Nbb0FO@mu<``th8of$d;o7zU;on5)WRSw| z;5Vr!IjO-PC*X{fQXUpu+)f+Lx|*m$>dW4=g#&DbydOmZiUuc(wjCrv>jhYsWL8ry zVGu4zi>jbL7%2UEV&~oDOnyg|{ju#Tfp;U_5P)ZobWwW{5yO%uzC*Bzi3-Bx?3)|v z=aja~jc}*Gum%qzZ^hf}QYWesPA8#!j{awo(777wL%@~?pU(V}bM|U1)z-tsNR%?y zrOs{i{P`p3xoKpde@K5E^U~s^_JPp){mE8nAww1|Il15G_3$y@&y0frwF{J;08c~| zFv3T`5lnt=r@SGjp;1{+K~c?@K)&dOlao>eT{mjWWwF;w%llXxXW@E=i8wj-OZ`@ZUB(y7c zW)dHHu=sAfLlU$`kmka06x2BM;J$m34DIfs>xXC;SVqWjf%H!xs5(|=mf2|IaGLo< zBRHN+VNBsGJi2bG|Jb5#d+dTUS*nmi0KjSP-B9P;A*=1Mxm?J|^qTuBGQ9cNP@GRL zz*vu4$lg0urbOAgvu6Sl)ATKnsu{N89p=A6{Z8)he9YG7L{R&Q24Q11kTU#4FC9%1 z2QBOprgYfI^VUl_+nDL;E(E9p_>+yj8;3Hh$cRnH*!*mQAsE-wzRH`49w5N91L;-1i!Yz7A#*h;gnKgI9I$YeTC1mh$=n`r(yht{r z+e_aB_|@FW6L%aH-JU%m5vG$JIq6?xYV}81EXdM@*!cXa-HkM2Y$o3fcrLP{_A{#GD1YO~frr8U%|3oA&-kMH(m z8e+~2%MJH3o`kA?LS>!i+fBW^+VCg=gzf_nx^>4C{Gk7c^5~!lk!>NE#!r5u=jgS$ z2x+>O?RePi-$s)S*+?lC>gx*vNF`?p8??12%B1lGuh7eS!S$dqvblnwj^}pVL@0T9 z3%%*`NY0iy71gpHG;JyoOHY21tBAF)m5aM|%c)n7>*P8{Hd-tNC8}*F`WKH~KK#MLa_;&0cBepbsWY*|q0G-30sFD*m02?`>va1)1q9 z1$g^932Mtmj}JjIrP2>kP=e2-bsaxRm&H7{9j}%^p1MaIm7BVr?mE9>eJpuc^$0Su z_%pg?704uQXpw8@bSx9Jl6z@}a#H28rIZSgHgpv=R?VWJcCbT;cO@<`q_kw05CkYd zGrK(4t3N`BMC>*z11th=e}3V1g1YH|h+n~h z^^{v+OrS1NA9`^DUs6XkG@Ia3AV1e}g^;Ii!avqe0JGRW`m)zUoLhNbedz7QPY~R| z9)Rx$cZQSn8LiM}Ppudi42L@^_bF}R~^m)|NcUak$(Dzy;?yVy7_@Z9hvyKp< z|CO8iwtV!hXixDUWeh5o`o1*u35$5wGSC0cjhF5E7w6kOOjTs}{?9?8U_m-@vlOUW zR{htXA{mqR9d7aue6>gh+gOhvE}fFYg*rPH~}F% zGmLLJ0ndk}SruXZBB}yYMTlrIB$Ic($P3jkZHPR|D&0@lC}pl-Y=fqMhUP7>zKq5- zmE&V>-{ufVsJ_WsNr>fATOL@6>MSvXo=6RK>7wfw3>Z<(O&ruZ)Ist)CKA(BBY7|= z7Q1`gFs-mU6lHlhR+#V9I-fK|Wsrr`H;PS!^+*UR0o%v8)Pni^+lDsWh5v=x?3$^Ses z%MSkfyC;EVrGbg!I@JBA_k?Dd?aB%%F6iG~QySr?p!qW$kt%B|GY=HV>ZP})ivKI3 zoe|(;+O6A&1p8m(biml>_}gj6(I`>!_pAJCKm$Um66gH{5&jwv|Jw2A`1yiek2Yw_ z{_A@A&r|AvSJH+>VE^|!{qsz9NWd#q=HF6F`CrYzKW_#cQ?M%y+x9<`{XZ}NkEa#~ zcks&Qw_)5Jmak`tcbVk)-i@`-%^X7iDMraX3s6d3tg) zeEv*~Zd`x{Bq*3tU|@dAgnv*WeoX$#!C4DJmmlfz|+(_u-G5 z-Q+!}z(@*6@&{yaz<5oo)h-DnTVtZ{`?s(DJ7*CbWh-1 z5^_|b5q6tdq2}zlXQsV3elx4Y8bPZAkLH6)Lm%FJ!j#|PI6QEXChT*DT(E5Wc6Kak zWo-@!;g~jGtBRx4bUY;pe)@g@A}nxp-kb6|+>-+tUokN;L=P_R6n z6~KZjourD3=ZB>aw0dU$dyH~J_eGoBkeGaZ{8|7F?vm{11~?+|xMsgCBaumdpu z!T6@2*iUFJK}#sDtbrLu1Qi3BFYH?&$A`P6@l{EsSSg=aOFH((v@%z|2W+402#}I~ zDGq=3)8}xd3C9KX`6w6K9&jomMy!}1eHeu6c7jPtnzBrT zeue$#0Ip^~Z>~Woehrp-9Bb8b3NT=pn43q{FjdLFX{cv97n>b@hk)O?o=`g@sp{*j zP#}Ff!$=)l%C|whiVc$9bN(Ir^DuY4<$6d*8>6AQ!S{|5)MC*129K*%i%<*}@M@%0 zSJIa7@NoQ1W7E4+?$AWW#kE=z<)~u-Hz+G6Mls}^34`PmUlW^#9(BgU}074UF z^=5tM(T5B4M~^w@TKhX~;U6hW1~^G$Ss7kxQtW$l#lKXF%O}FMF0L>3czNtcs7M< z`s8#p^73|SbuZi`IbaT3sQ1({KwiT~9&B;Tv|FOkXtnt{oqOvR+N^i7R&RHY%A+2B zUSdxc0J-PdimHl2#$)LLB(36Vy#|2@`IWe<^pn!^bJz4afeH<@1d0f090f0x7FgYs zV|xqHUca^}1{9xXwmT$5kzC!}6eGyk$VD+g{Rj*$0(yFX{!Aw%>JC|E1z@r_&$Uw> zbl*N0?PvP_4iQuB^^8?|g&{=-j5h-#Be8CGFgb}?&Cr65JNLSJR_~9z*hgK?LF}BJ zNd$?ylM{CSHB;D#AensY)tpDHrJ)0Bh<-PA z^h;l)sK{8ZU)avsUJ>!yk`u8@KTbGAB>Ef)o_|%vWI6l==%~HpIY4R1Bbg-)cXfRh zu;NJ>FM;;-eA(Q&;zHU*?#?MxQAJXb0d}JW)?ewe5MM7C4zTw1usNu>8nR|>wNe`M z9sRG&L&lSIAvV(*G9WRk=B4Kez0}i|dd(ecnB_UC&KlrBR&o_0`Olp@>5A`+m!!ebuG0$nP+@ z83ZE_Ac3c1NiXp=8%{s zCzHQP10t>%iAL1V)ipaLnoQEgs^>Pkth;nv;zp2H6P=k|-!-+7U*%?+= zh~mM4<0j%%tbp(J`*+%+py$c0!Ry^48TpUYwjn_>lY2U21uLx{m>*VCaFe|7)SQ@< zq%Q65{7A4&U%MPDo7E<-#-+)0tQ*u<^~8PL1?uONw~q^n#sJn}KDy2uI!S?{zVHTk za2>SeVta(0{ndU8-CEz}lk4MgiL1l434^O^^JI;T6lwhW$b)GfAtIs_P8KOVmGW7p zL~nwLkmQG#y_%-$-4dBDwNXsBMcC_?l^vkHjx-=m=Jv89!oP&Wr%y?M%pqCRu8~QK zW*~x?4YV`_Fmq#WW)2&%Yd?X;;fMcr0=^(BUrFCO-ESQaGFGCMbhIh<FKV06WP<%* z?5MnIb{Wuid(#P4CB?a`a7*u&iLm9zg{FWrlA&K?{iwtGNBr153BgWLDG&Ax{;{wUii7<{w zzeM`8DE5LVWAy9m!?4kWzZ1}l4YNVorOGJd&`=N$;4DqXTo*X=6jbHBkFH3d8aQPb z^6P!A@b(BywCE+nCPOtqO@8Ph7S%`D-%)uJuHo@ST~cmQU;X8@s6Nz_I1OEEZD^S3 zaLRd0T)9Aco7x zXeI@1yRo&;drh z@!lzSa8ji5A+xiyJ^szM7C*ifcOkjeADriS23W{z3Z}!0pu>6(r^2-=6^ne5LphIu zteB2{p=HDBm$%p1N+t6YG_D>3+0||}uPaDdAJ}aTV>;jQs<(Y@dvuo&7gLURZ0|!! zbnT#4bi1ih+Z*^u>^b3MBI(5)JJLHk`*HhesVDhG0|f=KTdbDx2bgp%1xq|!0@l>p z3*@Y|5Xn*+y(gyU&54Cc&(p6nHaWHS#gJIuf;?j+8T>JUy)|^V>wIEMfr(g#=-=QC zU~`*!LXe5bO;z!$4-N-hr-pm`WD|s_N-E{RWGnbVX|4;g;O%MoX-MzVmjZPbzqptZ zFsRczyv0RH;eKdjay&ak9DdTS^Jv#UaXOr?p?YUeN+c*KKF(DjYOflBFAQXQE<=GH z@kecDg*JxcFv=cG4p(`M0eNs~`-p%-ABQt}>*tEU_KP6ysQ=A#-d=vUZK?Q8L{L}q z!|3v@-+jhU26u{+cZ={>%gpwh4 z?RnT+FHQ$>_zuqPFl6w0hZS~UbTtV8;uMOQ_#`)eRMct z#aXV$%f$224jA_w{4o4f&w_(I+Lgxhu;F+JMM#v}I;fLJ`f(zN*?IBurqm0cCs9E+lb8E;0FJ}%nw)gaH~1DMxAaIscM;G7N-+D*Qv$o2 zMEwRmC77v19@U-7N+uQMM@Ui`+1w0hmwDP|QA+IB2^=&>C;Xj{l}R$(2-SEpi|p)7 z*l2E68qxpR6?e9M_i0I?vSr(lFDF34O+nO5!!v`$kKn3}6@}rx?sL9AGB*01^=&wdU`rsNsDA$U;d9+oY zD)0J!8_F~^EsP}2{~P1O;qg)VVOw*tHtbz%E9lS=3yHmuk?Z@ZSiqTk&=uf;1m|hz z-xIh)%ynvbT~bp4*;iUodf7_35#+Xox=9_1>3#>5`!=d2P9~F{4@ufbZq9z+D89lQ z{@OKG2B239wF8Y|TOde5q=TUt+=RS^@`L?n&!AkJTP70aCQa5i(`z^8n)w?pe8hGb z*gju5b3sf|)ORt^ckJ}&1UtnJQ5ExjOCe2xfq^Sz7O-cNLiiTfVucAV(Hd_zmZ7qV zsMc(EKR{oqd@YxtDmXSNd#}W3o0~gn^Pwz-?fF+>)cn}pKCU_|EDom=iuAmz>Q4h` zH5O8B+C=I^enAt_C@EEp#&Ui3-(~=yI80$g&*$w1iJj_Z~#M(gefsV_Pva z32IWvmPiSf{q_QdFm6TE?d~d_y}dyX{%y9}I_D(1Q|<#fo()h)lEub%whqH(k)mZ z>X#qrs0j*X`f2hxq@liE){*OG;APtfz)pWh^4=$gz}LaZR&Y4@B>|S*omnH3XT3)) zXOID4rp#cyuVmxoSp|H~9MM&cQ4w&Ix9x8S`c2t*N4_W zi|B5yL(JK$`0UpNwpjgwHdAx`i1UM25@*w9xZt`l6~Ey@jwuA zSuV-2N_jwCQ7*<`7C^my;M6uLDYi1&mIeudq{GuSTvo%|BSmUeAbA?=JjSODG2Stq z0C-`G0hpAC%D~huzqh+#9h28z@Y^Q`0#%#{e2;oxJl!Cu7#vurf_T!HBiwG_zF2H2 z3V96X1{H+m!&v2h(cfc;ub<%_cl(4>HLO7l?qtb?UR>(yA!E*0V9(q5nL1*A3o{`|bG&Pi4x-i<<)0Q?tzqlCbkR zo{fi-v--;|bZ>4>OfrEDIJ8&;I>;+6H2G-RIO1HN#Ti+~owRQxHQ*C_m`y#xHN?3bsU@e2bhm=F=l z2Nzeu)5`E~EY6~my4~)MS^Qu`rdz!nU{W8_{lqtx;We4zk=SVWeV*`5(aRo1C$%zMRf&X0M?+8IHPwpy! z#_WjvmsZRBX(B`^xw%S>x=TCacmNtx*IL})(xEA3Wb{!S zp=%0_#&)0wMTlc_$9B#ii>L=HNVlYifkUIwRjVD_(RI7%k+<%#}+kX%#{-F6~ z*Lok7&c2~2i_WNBoiAiHpV)Zw+Ay|#Aq(aRvlEw;1)~6|Es3{3H ztJKzd0_8W~pGN6ZmDqpuelir9IuY)CclR2w-d?1CUX$l6G=iVZ@ZiP#v!#uOwZjSP z%6z?lcV50_y9LifprUQ1_Os8iOOpR+pM_=F2ALl1w{n);ligr3H;7z^DXkY&tUo0>E)7&SMyp-MEeIER=t;<27HuGyRuG-$6C*|8(CBHMIW=@ zm}mK-$Si59SOp$IQBZc$&zr3xPAhgRHE=uRV)=$>I~o?J;d-09**;WJgbP!11An&7 zI@XP*r!Vf#5y4_?GU7OV1LHfXDjXhFsq3qEnqPi{p>Bv|6_n(>!#Uk=-FDsmZ`nh; z?=Nx`5pYE{utwmUX%oPG&A?R+UZ-Hk@lT&AEtrf1U$O~LN6#+ndW*~~FdsWnf}i~a z>g)>wgu7AK1Bb3$5wu(gSkdi1+wV9G6TrJR$cD>|QOTUpR2hanjpJ@(iv@<1$A6-W ze^ykCH3%3LDvO?N?L(;f0cm|`Xr_)OQyxRc-^yXEXX~y)vXHfki)^9l*YEku_CLZc zpa|p!PZk>+DLSae zxMtr!g6C(TI+!V(6Q)*`89WZ#Cz*=YXHX9w2QM5N`yj`<^YRQpi=7CrT6~g_vV8XV zsOTfs3v^``Xzpv5q865yB`jxpEUS*sCN_zJ1!96_%M)gL3k%YCzDsctgy%9)+$3XV9CMYXP^t@x*< zeQmNdl*ZsIlR86S?byTwlqb#P;Pui3f{Qxd&OhB9Uv~)Kc=Yl$s)0eaWoA%G(WIW0 z;oMZ3wnN7l&cV5Llt@idYl}@wr!F|Y69f-O(#}b>`$l?H|J_>GO#xabG%awy)XY@e z6a^7MBd3$_oE=r$&9FEZg}g<3uO0-u7Ny(V?P(_OpZb)b7f!Z)2zeOO;8EHn^w~jJdHU!uoPg{4HAO2K$Hpa*%)xFPSPBQAi z?9X@ZOD4+erjdB7JaMx0?eBj_OGBpi0nZcU#C^=-I z-QAh&8?Az}cEfhZ(%t%e-z}8Y4kO7>ZxxbPdktqKx68r3vMMXWVY%2G_WZ&@^_@k6 zgYfbC=V?~?yjlqrzuk0|d2v`6O&AV041v)Jpxog8&CFy&LCnkDHe}0DDO3W%!?R|l zP;IdSyM91FAL<1F3{0L&V8IBps80-^bT2C-0e)K{RL`@bJcAQ@cxF_0P?5`V1os0~ z0Q8ycd}2>@rmoNsz}h0w3d}hbIyM^y)F}p_mDnj}7pgRsoARqYa*dy5*$P#3FCE)> zrBQ!nZ!+U5YrCUU|D+o_z0%HJqM7(=a0MsDfdV^SxnqQfjI| z#7LqS7#D{RdBJo9;BKP&1ZbZ^7Yg$8r?w(^B=@Ro2+kIYL>a9;>fJ^;KHiWMvjN&G zm>7r$5mnVY^_wF-M3DN^ni@9qI<>b^`FJ1zcysWc$Vcs71<|L5dN?_fwcE@!xw0U|{ho3+{Y*;&Ch5B7Q*8B(&- zO8+v}H}prhNIOnW4GWI1f*~OxW<=HB1cL@fMV3fmW&781SE8~Bh<#?m}ZPzC(m+#06~<+`gX{5;#3Kj{g7Bhs7gUOpP7 zBm1+5Q^y6SBs394GvrXUSm2mHhxy~H?mj}X1|hep>FeVnPXdY&1OhrbM3b_JsnUv$ z_ZMT}NsgrrZ1)T&tB?||(g-hy2V`+d31#gy?T=puWi_=@3699~{klNK#l#@0PN1qY zB#p;X^F|nr2UbU=EPeWt&luRG>^=cxRnItK&-K^ey+J6a4|A3R^>CLl{9upMGe8Oa zP48yurcx5UShfV)vKX@T>E%gSU%xUYo>rq=lz!MnUT<`7W^xL&9eTCUSQT-p#+esr z`xXp!a19T#b7%9Z8JB-+>Pj-iFT}0ut4y zVz>YJ-A(j?0JT`B~u3p8P#i@SRfj}wU69y*y5$__M?gw=xS)a)V#xEfw= zTcWf+_V)y813*O2L_$s;JXg95C7&ik*M4r!5Tx`(clIoJFp}YNthc}G3aWrgzxEk! z6Pn*60*9BsYPo(olE8lkTz70G<6s@nOX%!%3umUHV5v|o`e;&wH#u2#>R0d}sDV3l zvpwVWBuWg7Wwore=lm|%jdpy@pV43g9vSnHGb@JVm? zYT5~TRZHKlgILMAx&48rXE#=O26SarR8=)x&1@p7Mu=;WIO(EtF!&a@T?d}}6%gC( z_7aC)WxfNUx_DPK@g4i*8_gWv%Tt^BNv^K5eq5rh|3FT31q*8$5Dlrm&J?J~aJW4u+NEzBAh-@} zeqg63eUCq+9GMT8cs0|G!bPdL@ zNoa-8RmvWA`6P4YO@O$cTbA_`0p^;_sqh$HU?lnc5k*8&&z#-7A!(q64`u7*L>LmG zr-UUugH3E1U(NMC%XCP6EdEr>{Wcnz82j!RfeMxfr>3H9cX1H zauzXIm0K0RmGT=`x40g$)ShI277NM^!l9PQ#J-EjX-V`Q;AC6S>+O8sGR{7|NhC4| zU5yt%Zu92v2YTp~_0z!W3`z8LrHQwwis$iM&@g;7)8(>Culs9W6CR8?xB1c$z-JCr z#iIMiitXzT?fZoX=Ij&kW5wHRS;LvC`BWs(U15R+QOJpZJ6LG9M-;w2u~&GLiRZ0U z&^7uySY2!yu2*9?n9%zBXI%zqU9hH|K6`O0!JFdPsYPDo%<4d`nwFOGUKGXpQ)dFL-(`)DT#?-3z28TD?7otr z(z5s5+w(Em6|f$yh6zV=&FNtXH=&*~6d3vz>A0>OnF9n8{Ul>ufm2`hVOx?nQ^(W< z-_^UwZz1fEL|6>dLks49y12c)EG`W+BCE2k3SH6AP%9FSFXi1ENW2ZkR#(wi39(qL z7udk7ufM|gKa%3l#F^`I&$O!dIa{lV;CY_+-XEQRgQIEmy)^4O`DNgk_v2bpTvWOX zj-MT>BjqqAK4FL9*e{A#YvX6HlJO=Lq`A1HxI8TiyKW31wRcL6uB>GJg!}0n-xm@! zOpMxq-SH6{6wQ@fqW!c9+lGRREA$!6gC0w6)`$=>U-gTju{o6;n%2bjZ%A;hDR}$i zsYvo?tJ+ZZNqG)R`S^G{l3ak6U{Caph|9&yA4MbNihu0t@+y}13X6ttyElcO;}Z53 zJe$OuI(-IZSnEC`ejzXG)Yg*M`%;(h?$e%8iMwZrXUfqd>)!M1(T->7!Ph4EVIGdh zr>k-|R7Bc)9m|6+xye=6S2sl`Ow2aAgYa)HNj>ER?hX~fCK@juxP}fDJE{clWg*T# z8Nh#!G8rk!AzcQp+7olgCL89Ji@GLmjG8sfT9klm#CKPq6Gg(uj=+_SWdmkaf$*F5}YT_7afU-0xPHK;y)N6o#&iC-soCd5*$7ry^D^X zjvZTDT;vxsS&~@K%lPMZRBQPAHoaX!WQhuH#Rv*t7k|X!uXXlt-`LITOp0bmN~z*O z?Y|)$NfT(5us=V6ai|rO(V4VP;oyff zKCQzK;Ogw4*kMx;@yc`LSAG*7CgTsBPt*xBpvawvq+p(4)Y;5_dmpKcD6DY~r<3YY-5igq{HJ;<%0PqJ0}^Ud<-Q`K$Ekg))hX*APd?6dE~VylSYGuKQq< z2do~6FMK*WGHOjnR}yQ{Px!!x`lFt)LIZJ%Q^o6VTdcOeZN);lnu?Ym8W_p-b6d$t zB2*2a5m2;WI8Bkl{2WH|09X9=etKwwWu-6`MyqVMsX8?cg^9yfi?vvgsxs@L_W5$r z1Ipx1La^N6s;>CK>{ljh!Famx_OR8cO3}=}Opn@k;D87NXt@J9uQ&2o6Kbs|Cn#*fFt zMoivgTH6~Y3VWtW7%C<^OKD8zhve0@(Zb4(ptB>8_g?U@oPrYZ<(+lcnS(KB0)}4- zzFPIBRao_$XI+DNt#iqqpkdFHw??nHUgtsl+3)~j4?`jEHQ*+dP5c!3FLnl9AD$x%L85Q*B9Ez zE!iQeM)C2sXONeN9T9RuN@a-l^IIDNEDZ^Up4umoH#JdGC4FOu!m9ijzkPWW(3xQw~m(tJA2ay^bAq1E&I1N`@_~-DP>z&s)5hx|KI%n3sC}xI3t?Xg@h}WjCJQ)R9w$z>KpjZGA7L5;5mB>rw`G zsBMPBc2M7eLUt{9$LTELoYG-GHD)<*d(%2!S<#9%Z)+yXeluHgSVXN+&bXE5eo}0q z(;aeWD#m&?s)^V%_R)ngeZH#j(S6h9;VBb#0)x#C>T@qW#u=KDj@{ zpLw>{SGdMfv zvaiF=bdF4il!h~Q{vhi6ZlzCepp7y@r{&?-6E6xBjo;}oFpefmD!iq2Xf(ynUT>Uj z$dq9aQ6YNtif^ttA|V7EurNSKQwt-$4>E$HRc?FVUSv>}T^Qx<^z@{4tJg3qbM_BU z2dufim`cWdqLSAJHAQNnq@tx%27{Hbw;%B4=o}i~L!X-U6EJEsbao)+@Q0qYd6>?H zI3=JH?+KMh*_<8-joPaZf2$4uSCX(j0I4x5LZHiN)d2 z;)CT%Yecld6p}@+k6VyKR?@V{^lWR%^|*{zZi1IL9aJX$$&&q#TWqMD(h;i4spN@7 z#W>Z2len*;r^aY5AMsmt9%i>Wd1%b{K%PYsB=f}!@(fat2rF}ojE4_T7B7t z?T=!OmGScsaZ$QgwItMnNO5SsSz;tMkCi6VlL{!BumN^+qSyNNs zBE(ej+j#D_L+E#jd|M(&MGVQxofe?O99s()$pAY9=DOy-kxTfz8C4b8Sz18r`^p5? zd_Ih^c)c?}Opf)b0?W{-GY-DW1lpI0G)aTF&QK$2Ntg29+CdO??Vh(~46we_UZ><$hV)f&^~ zQa3dzJ&yQ2YzjguEzT#xlZv(pg7TZ;9GqX+JAls}TDQN2(aH?v7oi5pzC&~Pq9ZBm zcGdIE5R;{rwYP_OsvV4Me_)a^HYrY!U+bBwWMpI{`wYEI;2pd<(kbZSGFjrIz-9KJ zDka0A93`3;gR7HGrEhtB+0j=f&mkz1lFcGd(#_jj7H~Drq^_x#J8w^km_B&r8c1~` zYE!*MaSKfpt@c!5Yd(Q)p$_v%JnH9DLrYU=cB%BCZh5@=9>&Rt?=o4}BgZhN61Maw zymq0WU>-9Yo1IzHs(e_Y-hyhomG?(u(k3@Udu2qOm{+|W z);Q`E{C}lzNZ?i=zHTAx8bMlGX{Ou31d2aCk2Mdzn?e&2abML6dmKCc6vG#NLI9b> zW`zWg^+AA2*}9+(%gKP=MCT9_o3CVJ_FIE{SE!Y_fv~GIget$ebV@xAzJ^exy+dVL z=``q6a#Z&d1ywDE=EgmNMPrhyQUx`&;ilbtU67)Pgp{dIPkfhMPfn-op}l!u49)bj zMb)8WsQ_D{;=Avz$f8Ud%OwRKCc}$Tx$vUw?xDUz5a~RcQDvIQ_G9DVDa`w~PID#| z@E91F#rnG=*djP!t$Jm5@^)DY6Jyp3)e&f~t$}NSYpbKZayv1+Qs3Vp76O1-{=D<^ zm=Jz>d2#V+W&FH9_4R*-!l+P{3UO`ILp-;+A@ljintLna*{B>u zLMiFC((0P|L@5nKzFS=x<@jA@>S8XFA}9%M0pqcL@*_4jyfW>MAe87S%93NB^PRDY zDUEJSUKd>`sdTm9C1(p{gehJ1_w*b-6P-f%*`un(lT zLV;w@yK%pjRjopihK>9(KJkAyhrk|jgA}Q7UVqFeJ~mbk;9gSq3m3y^XAYokXh?y8 zq;G?koR?TX<4O4_e$!g8=pr0CnEn#|8{Hv#8hYgZb)H0Ik%dp)YfOZWQm#f? zkUhJtmSz&b5KupUSW3y5_;w+gfCT>t_%VaLo(#L*W zTh(~Q<(G+TW{HshdAXel^LfS7c{#$W!`U@`g`Gq{5O+cd!)5<~wy%3Q&kEjrf^<0D zLY7+XPH8IP+JuY4=AtO3{`}&BiK835Lj`~n&+l-An_M4iH`*zfJTGnXV2xo$)X$La z5zb)FsHi_~_RN`ETeI%>`w#Z@37q&72{!UDec{XY!TMtRiyy-LC)hI=T@5Q@j( zM5$gMhqhE_mI6v*9k7seDTdRzArHzL-h3C6uYd#w5Ve_6I{kKdsZzPzA~_n4V$3GP zpuc)=ppg9ve$8N~_EC$mO88!NLCl3hElbpN6np;e^JLT8S_?9Fr9@81!;SoQ3jPEa zRHe|twH1>ASpk1tI=9s!?@fV)|c zueip+NX@M)t`=1LD_#fXD0g#mRP#K^6 z_fY;CCpduWP@9a&?*Fkn@PHd$7+>kpFhhgV!1x|hu`4Po&t)$Why8m}li@+W?N(J+ z6MOcYno@`byGk^nOd;@RCL!xqFy+-jzFO|ai#q;2lFl>%KG;;(g2M{+3Z$!Imx1`- zo$N~fTJ3+`e?V)%4#|YQ{wdx+q*my^cbtEY*~AGbtywv@<+J{~T>kmgvZz1ujcxM|9e{L`@5Mt}WJ#3i zt`o;{!M$1^6|?r=W!ZTmkg2Rcmb>G!VEXvDj7LGli0a5#MMFjDzst1!qLPwrcNC)Y=p>jSWNm#Z}e3c9*{aqc-E zog|X~%q@SP_cCl>^^hi>#+#}wJ%DrwQPPy}G?}xq!u5Dppd&kRWUsZ2MbkIX$Ul@(M54OKNmZknG8xyJR(I!HK?v;D8Ryy{4ODWupB^T zx}T{%Q{XIH=XDfMx~>5W%B8CDx{OIlPM!-pnXtcqff}0F5PvJd`QP=HX-OzcMIY4X z?}%$?ZYX)`;58zHCsbjT^RztJ{pe)C13PmMr`Y_mPdvCU@36Tu}X5bdmip= zCH9@_bcTlu3=nMOFWNgzmO+<=T0lh6IS*#6Gpu@ZOsO&7tYCy^4Sw&MIa+_OEDa>| zI2=k6=j9tkrj;=VI3R+XvgT;HM@)erxpTwGCiXl%xX6l|aisCM`(DDr4D?TjHA6hb zwEKF6T^flD3;96WzIyQ_(u5Gh!jS`GTJ^7j8oDLo5)w)!*EeU!FJmX7qLO}9_z9Y+ zsTZZyStTkJ`e-z1t!-Qy_;yqO<*9mso004$-z<*yhTwV|^2Eg}FLX*s44IC<`ZHB} z>omj2n|(DC4+s!8)Hf5dwS^w)8tX|5u@aPjiEaK$k%zCuMO|1}uzL}By7~2V&Dl>n z9if0#$K6kLu6nPN-p<)EyJveiHZf8BZUjT*2{AqU#}5mbh-OiooYsMbh2Zu#(>lyj zAdY-0-BXXr_8AG2xfGH54F1SjaGCtU3K5iAL)~UwlLH+WSU=1r>O6GBiLTYy>{s-b~_6iIKMp{Wsng8r7tOW){qSB;E< zv^2u|<%jKGzdW8W2}u4;f|2^cSJtE15UwA2AwR$l#HuvK*ITU%=aZ7w8q8}~`x>#c zl0|%h!;&;I3Z*?tUou=L%F#cVrc;sE<3~=52qu8FXH>1_oQk7*XiyZHi_-wJW@*K@T&&{fZLJk;8}}SjU*Rd*Q-cUd>xR^;11$H#yDKB zK%8^ipUxj$p2_^W;WLqP`Wfq;m6MMr*KsZ;_Vv+x%8#%g065d<^6H9$fPf#qnpQhB z&wh`{ir9LvTFS}@!1f4K-GR>Sw8(WE3R?U& zZsD+i+3HEXH-94e?r;(!{#+@vFaj4>y!-u~ypgLLo59!rL)lw~#j$N&xHtq29w4~8 z2G`*3?(Xhx0YY$hcXxMp3GPmCcfXZ$_CELd?!U|5qPwfQSFKuW%rW25o&5Ey)$qnb zKtSN@2!hHT+veNX)Ehl)o?Je6&$eF!4feyEzt_qcKh8sh3GBs_K^Y0bX{a)Jy>qqt zI4dR0%|99Eo9b0t2(7od5(6&iAZ11jTjmlT&v)*M&1$T~6BKM-10aiaIWRU((QG|f z`u4C7t{Q_R3h+-DgwQ<$(Yn|N`*QV=_c)N>h=uCQ)#*oVD4+)&0f$;C%T7Uz4ttOg48f9!+f=hkln~NHVE_u;tRD zcSDx_%2Ys~u)XcG&h(&#uAHf^$Ns>}p*hWCcw}T>ZU>Q@f6HL0a-`;CphZMDyxDzt z%(T6#Zw}k$2N*NtV#BQ#4z;pXIqjkD1)r#`z8<%!|@qE0WU8yN(EE&hyfKHWhbt3eF_tT008spphQ%Nsp@=3tZi^RMxTlMF8CtH z3G;G|UdCw28gC+%^*xQvy5KN5EFSvgF6huqcukUj3l%jkp`C=7I1Yde^E;YMWp_t{ z)*G+NkczrrUxhHDq6-Ykrst1Mhtg}^GOvTzuHoFBt~5aR^OT@W0icd(0AL=`O^|IU z>dPI75^oihML1K0ZUf`) z1KJma6EE3G{};;&Eaujx4JIStjuwLcOs2>zSF0gmeJ$0gPfWy^wnMX{bXf#IKH2BjRPswd*_S$VXgw$r+ z|ALCe3ii?a)5AK!Mr1zy^bndOB`w0@t;c^uwmyW9Vk%oW4>;ZD3|$;em`V%_V#mQ);x*nYVZiDg&a>8P4HT+lALrkOqg zjTcM8A5XW;G|A2Yzs6n8eA3#gyx6rWlggIg4}Tz_+tW=+S8j|{m4xgL@Y2U8x?mlU zPkY}S>|pJP-CU&Pk=O%aOMX%V(&|UcsEUN`2S%o*IWnrsAXV1-Wjsy4Kcir*_cwg` zf*lQTuVb65;TD-qr{b7LWhKN^_E*)^<++F339p@x=Md`bd|HL|x>YpvzZTa%EU;Gc zWLjk4?!}&PZA`D6P#1OXB2*N4bQV%Ibvhh#>2zp2TeB&1%#T%7tvyGo(pOcUJ&%@L zxM}Y%GDWFRB8u6DPp?yh$tD{5{;> z>0&Vid_?2!>2x1RtZ^UL=`jCE;JN91Q|cu08{)Itp0d`VsTbZg zwg<-hS9@o|3#GAhem>!|1Dz))rI$LW?g zkS;-%y&YY0^?j6PSl|n$4EM`7%V(ptO>{VNcav=gkJewLb`Pg1EXFes&#z&&e+m9` zkSgZy9TuS#C$BVHAv(tHYL(hP*3p_V7aBZEL(b-O>h6T(GCDqVsBp<<13mZQ z((1Cgak}~J0KC97V zXBYdgV{y8x z^~BJ1?@*P}bk9@1?sGF0HG8iuN*F4xst`Nf*^|7{sPH}zqSv#pZ2Y^dIRNxM^Y*h? z1LztmQ_f#ORP9z-?upK&x=taHrGm9FQYMW%Uy=YKnR;LpZ+!RK}qPx7W(1CIy#S0A9h!h6Bx+P(!^&oruY3ngHI- zI$=JAb~Z&_{n9EQl4@3BU!5BDZd~sZ+>{;eKr7Jqj0Et=)JArp5Du%LhEAb=!y-*` z#!WJZbTN(mIRMXch3t}d$r{$t2!{Xax6EQ_T;l3fU3KH};^sNSEX%84>iqAvHrtuF z`=X%Z1&Ok64rG|=$$L%#h|ozNvC7)u*F=%OcaFRd8QT@` zuc}HLwS`(9hl&4ooLV4K7InkLwLJ6MHdN*hmUIRs`L?E>rz}5zGCP_yl^6zs+H|JI zEDzC}5+4udJ_9K{u4xlyD?4`Idv}y9-#0R~co2+U%|g>GX$qtgQk?PG@$WZOS9j-* z>s#2ZHOciVNoB%|=Xx=ln9PV(Cqy`-Nsw%edhfGL6K&!miu zTV*mTJqrTjak#$#)QXST01iWdQRIpKZs0c~+JEctE0|!7YNvcKIs+pxwEY{H2C z0FI5t^!P;w>Evz}vLlq8!E|zWfQ>EWNBd`!PU~-`UN>6eHw>&vh|qGF{Q2}VGb!!H zKM}fp^14qSuaAmmXIbTQv6~cpNKH4}+Ckut4E`>D1Ixz%-5Y@ZNdzh7qj5Tui;|Nf z?bI$sxj9Hsi80r2MK@QUr!|}k3lEIOp&saSAZYF^pTyzrQMLO7WpQblC^#@V9LD4Y zf{QgGQV(s^k0qhkm|{s|(BN~+>8Zo}x(1#o!s|U`p-_s|30L9aq~?Kbug+V-lh=(!lEJB5&<>0f{-xF`V(j-LJFfZk;vHF z92kFNW#f=%#-flJ9QR3EC%2HP!Nf-?IoS{%-ub*MaaBrfrYc{yCd7--K~UC@4`D{^&b#Qv2kvI$}8X*438qY=#O_x`_9 z2q2h+0aDUxSXDe7OuZRIzs5!`eH4q#e?^%sR^sWUyZELS4ibgL)rjhN`u`)C*h#`v z?}EBu$Z05)E{I;GlDoi9&-}cjbw(kFW9(9f*!L31Mkgk~zESbI%0K##Y*P;ovBUu` z8qe#qlkecK`D2Oo)IJP+s-|tzMmsP8ZY_=UkaprJ5Xd67Q#8qxMCSklOI={L(GiU9q|4Cc7@&r+4NB!qvgx2YuXA^g*X zvU9L+!WbC=O8yiJz}|)ZbR>@N^N5_%gGfhGYUfx+#o_{@-G#XH}V z7DqrUQGgii^*@C~w$~2B=Kly)i=Xwby$`36pRMmSV2{57m0ToJOB_p1&-->*7@&lg z^-HzJWF1Q5ahCq}bXK-h?MnpYr3vj>L`6}~Q&2J++TT=*dP9gxA}~AH07&~}Pnl1j zu5O2kqo#j+axEbcAeRAX%$<)YiH^FhCzbYhM0eXEANi6sH9rgC;@bY-{W><-2n=i! zXyP@UzdwuNv(o;`LqyZ2Fv)=wlL*9tKVXyvykKVUJdTHT^qpY-x}p!0X^Iu`3r&>$ z?RVPD<~0P%NBr0SIi@Pg7r^VpKh;)@JkFen{4vt z%ND0^ruZZ`Ha48zz1Y3)yFPxe`o7@M>UL`Fm%Jae9O!0qiy6yg@k-X2PUWiCnM_;y zK2ck5v;(H{TeG)kgumet!qcFG1A_o-1fT}{Qk0Y0?46vH;cb9J!OOupowr(+GfnwI zN;(k~k^)S8AfM?SD$M(gaWOnRJf6e^h@UwIeeH#tDmju&9FI>*hzklL)o!*Em^aL> zl8qyi?(S7`y_;HCNZiq{F{N(J$?=a}ZEkIyK2>KvlJ)fvp2tE*7Zwi{pZmuCq%%J8!lIXO8HUNK}gnXZ2Pw2YQP<1g8tp034x!XeQVMCCAk7;_wl@I55*Yml*4 zR)Bu<_TK3!1ho(JmoTcmL<>{!kDr6>{`}&9W96GCVCE)6ag->tEKE(|jzX$x6{OM` z1k@YVXL^q|JTLNqrh;yXbI1!?j=3gVT~4pPFBO_?kpR*Mc6rRgIAyZCe(!wU6A0nK zv%pr$20=&)K&h{kauuj8#*~#&^Sn;? zdA0s`W&*%ii3B56ozLWV;X3VZjLS<)#djhPo4!>Z_pIpbxSWS2pdgx)VPRW%@&{O5 zwjTm39j5dX>AVPa1sO^S?TDpcKT?kOEK3_%TseS|W7A*2E08TsAScr&U{oZNpN$ADQ#@rHVCf8a2fJY8?oQ@vx}&F>v5S`d&#eQP>sY(n?^m+) zCmQ7zuAgoWzEM&hxLi4|3=F8Zd~Z+B6vsPXbUqniXs_0?pUwsafbCDRS-gUz1Eg~` zaeTI{RP)~)SBt-=GSq#(A%jr-g#w|04rb+HBV-_*l{iX3{(F7l-ZJZT3y<540hikj zg!AfQ{#>qE5&qLB`TkVe9U9}OyTyX!_jK)n(utH7E9w1S3|k-2)3pX1k~R>|OXB#9 z4DAwmdO?wOXiMR?QNolXp#_zNTOdKB&(womSm=i$pXX|v%-s(Gv<#<;0&$hdI?A$G|C*idC)D9*=dAO>gP(k(?qhkz_N@SQ+Y z`Nsllqlf2i`IItzmp_!$o`x%qG^ZraKXQUeIcZ6cjQ0{Z0%qz9oCH^Z zHJ&wu)dbGLdkLYL*X3{W+iN&kHj*-;C9BXs!4~{$xwtsLUCw!~m{F~vtIdIt ze6i1Z&!HLjbtH6b@2yy5zNkSEH=ggGrOreEzm5*?Tk|2N+x!aBt^`sl{HL&@CTMgt zGzB*y66^KGK)S8v_u)Xe_{GFQ-mMqf>fLkmTF>Vx#rcD9?Y){o_|#@t@ZuzFEFFhD%j$cNC72WTy-hwpZN=D zxC;b1SuT>!DAzg!a1uSP?!gWThdamRBoPq^6mv74I@FA&CrU<2G=(W+^FRC1vX@pg zVpB>!9qIq*Eve4_i4r#(|H26Ec{2L8yzKt7(iJl1HoXMgOIv4x9;kJpjgCx&*y^Fe zUfvLZO9?L~F7er~?9;d@P!O?UzHr{myHuY3$CQ!H3HC~J0v|>HD*F#bg8xLg`%7JN zPme%F6F7pEdj?lhR>U8vJFKMdYS8VruR_xJdL2cFpGl_#X7U)*OcUi zbTT?x+PtbxT>-2Vj@w~y#ckOo(fRrAPO-mFDKmJm+SYtVGjW~&%zwabywyl7ck+vA zn3|I5nn2GjP&qaEr|ONln_RQkP4k7t&soPhkN)(^l2D-z~7}>1EOH{%*m<3>pZ!XVMCtL9zdhwNr=`9(95c( zau`EE0pX-Jb@r=1V%AdgAo&oP*ngz(5uRl3{K#8r6E7;z{ee=fMx#N5#ul67Gs$CV zCmvR9!~Id=%6e_4FxxyN$NyAsGf9{^nenoY>N|lMo*b+!M533SG5qc%yV_pAk(bLJ z??Zw;YDra_96sI;5V2clw*an}n2rpDj++O1v(rO?+wS(zxo^Xm0=yQJIdw4}Pqvz7 zx5NH(T={U`@AFk??u0VPj*T{zI!%EyGj%}JTYRhQ+0W=TRr9mw_4xR7iS+<*p7r>l*g$aY}lr}%iHCJmsrqN=>ZZzi_tX2KTq7-|p}UIsS1M4w>x zTdkfjB&Np6M4>g~7m=TzPkNLpAH+HvTp%1AuMgusyoC>@L`!;1#l;yX+C0gy3~`0q zB)|CvpCN)BRsXm8!v7-dryF?c(?nXJQ9#r1EgI+iV7GFQ^fxA|62|$jkPx_u0A=s7 zg|}Z~CrmdoxI9OB54!vi-GKcZiJHP`nCG@f6wY2n`m@U!TwZ*~tCRPz;TFLA@~A8!C6)8x^Hf$le9)_Eq9=;~47K0&90EP( z$FEG|y8;2mtvui(`|$^h!f#KI)RGV)e$v`mFQ+9d5%kDS54a_F}yCr>;X zUH;G1AHcuL@At&+7??>cAiM~ zOif;%a*s}hU?OU!(;DvRVTv1M?3qlX-ANK1m(A1gN&h!C#PxKMBQoaEbj)nO%JUnv z48iq=vGP|W_@x1nGF)yI$G?5xTDD1?XKB1+VR86_vV8GkS=w?cR$vYZn6!U7N7c z4we6mgR<{_%E$-3edwa!f`)n$<1LbEl`Qqm#VJXMlL)^pi)4Vk>65w+_D+Q*w7At@ zJq9u#mK_0$IDn~HXfyZ`aOh33kCM*_ zodfsq@Q_n5))K2Fn$mIfi|Excr_Q?ITKsc4u}IC&_Vq@mgKJvAi(d|3i{ zxCwM$Yb1|a)dA4KzQe7t}!$4KiY-9%gFAEXC^94c|t_&UBB@hq&>xS@O2mry+ zsnQzBNe-)-%hP0-LrbJBJ!(L8tlme7zN$OOJzU&hrGUd__u4}Q8th$Rf+rv#i8&sO zXaD?3Q7&C=Y0T5s@aNj#z%#pw&+QNxvXD-dS{8t- z6g7UBG&Nk8`fgaY%#ZzUY`8aH)p%NIbkSPfoVGrDJymltw5=`1%~jbX0AvgE{URW@^ttb5s*F zkK2dS@oZTb(YIHHivaF+wb}p>RO!B*>0P@RH}vZG2pT=*tZERyOXcJ%bnu&E=uU^C~DPXvS`K_@pSW*BD6V z659(pAn+rw)=U4JQSV@ZxP>JQ1QgU39<1C$!1-3hMH=3EAZ5O&-9FFq!n04_d-4~Y zSq8Pqe>W$<+Os=Dl%Jj$bDO7(H1j#?S0s62b+vHX9a|$SdL{B*<%A1nfKgGQNl&kJ zj?=0JauRY2Gp2?%{jhfZaMmYrb0^5XRkTb+uNuF2o?^2S_<2Voxk%XKLlCxKE1+H` zCR+0O8Dl$4;n@PN!Eiz{UOGhgDcjulO_Q8=x8YXN9|jOS4stPKEwrch12{i2Mu5d< z{DZn?N?rt=#F&nTLSa7V8kA-{P;fRghgnJu8_zG$Mm7JRX>EEAW=>)}trdmxZx*Hv z!r#8>;H>n2V#@*ZB@{$I{33Q`Y`y&d@!kPR(}0m~Lf7CZ`@d7!zXm%?e!v!I*(@<5 z^6%2;zy3PbC_p-9^$jfu{P!8~-&a(C0v}niO(l-=@0{>oTO6PjeIH+aB~3*9zw~C{ zgn(|k;4%_xwEr17|AS(_`D?qoNmAqdzec@jYyi)&@&D@ry0gErD6IT_8&^F4>uU!p zYHCGdk+y zMFaD1ul3?x>;f#9D};YQ0NAhaR({Ho5+w}<2^pD4w3)ggTyr?o`Mjat;myS)iLtT6 z*A_b}8Y+^)18$|mIYz(sc5d6HMu2U{>HUW$B`rm9DDpkOs>-+T)%9A>V#RoLYyyb4 z-Q-$^FVXz(FO-e-`7@;?vmcEz;Ftrpjx4fU;pQqZNdTt0?AGM3fu&;8;Iq=;M^4)V6m{V zW{Q#fhNq{a0ai058@Z@@NnV~I|H{K>)RFfb?-IwP$#_JAcFPByR31mpeccX;p{OhZ zBqX-csV)h?Tt$KL;qh=R&bzU3yapIjU}2BHgMWXC2@Pe;2t@aK*zkU|`5p+3K)|P) zMa7VqLw9LOMNdsmZ7B(RwivRurp0JSQP}1CNY9Dq5t~YQd2~kKr4mvU5#C3hJUEfJg2GhLcj_MMN- z;q|`LaRBI`xY`_j-ll5=KJ>MfCw}Z)$z7^k}B2jn(E-o(hK7A&wzXZY)lbc;H z@WOkfcsW+MqLYfC)zvjDLiQE^8TJT71Q<80Zt?|^0sM+Y-Tifziv+cxjO&23|8~~V zWyqDB>G3Kr+?;}ngwHCZjODxyCfwILzF^t-So-5G*SOlM?ngfSN2?QJ{(H3$^Ka8$ zpQ-h_;n_ZL40Ffi?ogN0CGiCn6(htlug;PdqL1{&<&hGRrs}ykIw8^7p^qme^)AI( z1xB+&(YNRO9B_h;P=cu>x&ejz1Zp&h+zIetTrSsHLAdk0z>r7^EXh0J1gT^2*Efo4 zMbSHYX6i6H?QqB%w%q=Fl7br3GTw(gOS{hr@$u7BT{QlP+);EzMYCe#RF_YmqBHZg zC*`dFG>)fn!KrxQeT|(OmN9P*{)Y`YF){sgyf`WYwO&N+ zjIyUw)R^mkCuaY~AYevrbml2w3*Zk#*2^7N2nT4z3SQrdXcp0hTFcAh@qFDtjmXg9 zC^$Cf%OLj-^@?E5UR&ypc4c| z`m)PHcl?6P^LW$=7B1%Il7o-62?hWHt%E{Zu%;>4|>8`ReFc3(>m0|B?RNS9h?|->Hdzi>7tF22| z#f8wp`B9wl#ceL37eGF)zjnXBp~W1q_MYony5Q-lC8trQ{NlJhJE~5+AsCt)k8jt* z#rIbaiUb9XheM(ck0QHp{|rcw#c=hgiC&2p>|7iR8a~!sn;)wu4QGko|4c~E1l@yV z_bv^l7e1U0+~Lpq6G&4(8{?Je8LN0FG*$ar^8TZ@-VszgKJYdqGk-ye!XYIlHoOig z>-2s>`h3#&l+xXLFcPiC&c)Tklf!4d(JDxrSl`s7><$31hgWCeYU9^OQ?)cS3NgZK zgVvz(rWK2(6f7iCWBnf=-Keb}mg^4Ydd0k>ZOGaIj$v7Sc^>HA)?qeA zD0ci|9PP0IuGgIrd_-eg8qVm1+>flNn_NlSBUd0pu^<^Jt|cU-KQPA}T)Wv*7wOT6 z@kHF$93(1@(_NN>@*OoJ6&9kWIwv-;b8yBK6hJ}(fLaK5(<3P*sqolCJC1Vs1IX$T zHKDYW1Zi;oTMj-Xw@QN^b2^NWS}q|=OX^9we{_y5R>JNJ239|KEbh-2m1lEUbxDzf z_e~{@gP3JWF`63Wd6T2#!D*EY`vV|va^kz2t*b7V6x}LJl9FaZI5AYCTOjz#vH@Sw znWSC?f)hm^siCOKlPXsJ{8^iUlB7jQ`_sRra$*4A@KUL?Zr7x-bH=l|(0;UN{&BM_ zd(>i@DQ8qqSTO~bV-)(y)BGxUd;l@kQRZ~y$G6$?hWq>bfV-9NXQpMYPEPRZ8tQtC zg;+Ez7{^+T-EGb6W!$I2q{w07b=kWvuC9tGNS&-&WSa3DHT?syvymD*FPS`T?EdLD z4?q{lar+7l9!Isz4MD)_=!TIKD*ff&&9X$*h?*Ma)JsaTV@7#IREwLu`kT95EMyd2 zr5TrRYD#Jex4XOhsAWV|RFuQ!aH~C@RJAI$EX|Tp1pAoQ4l0VA3sj39L*Ls0=WLF6 z7aC?&{lTewaL4rjz;t*Jo$r4M7e3)0m29#RcZ&+MZ?iM^}*J@XO)#8H4WmR?=@88)qa@vUnaIYylilDXZO(w7ZrNIO$I7fnjl9P; z6dYV0uiP9QOWi03LZuUIX5xmU9RiG_-$#b9aL8y6CI{p+JTMS&zbd$E+cINno$smrUfTAD3l7FMu94pUdZRH{8Si5*R7@gI-u=5vU~-qN&+YtNq;z+(#r7 zR8=x?^p`s{^@WMDhR~5OnqAE)r?t}Ra5Wh*F@j^NHU*;i$r7X#ZJae**H2oN5uU@= ztsV_>)GD~ME4{`J%U*~`N*J^{qDTRkCuvG*do9|})#+E{4=Fb%3q`9U6}0WPA3br? zg3Ag~mALa9yF>7~4r&LFUNQ;RLM_-LD?aB;@K`d!NjBt-2GDeZzAHrFdbT znrz8+x^+p;&>w$vrT%xank16z$v?Nkak8}i%y_`Y)+NLeTcp`t;kC#%O|JO5`+zEY zmzs=C8HSQna=$&5LtJ!(kME0w-Tx=q(!4#~ zWQCFfsjc_;*nA!Y2>2^)u{4fZd3n14RT7ixJFnq2g>un?DcJ-ZW<|mLiAxOVv;9>1 z6^qFph?`oo7~m;39StPCO6YnI5kW*MIEo7q%u18^c=5n$mrW1KTnNqdw%~;#_bKgc zU-L57-|Rg3Ohkh{9rz$!v>oXAJGkOy+x3ZHl#L&v*Y5f7Eom$33BsvF{BV=xQHid| zS@WK#d&ER4&lHe9&Tn6tZ};LZd@`zE{LgjCIx zco>t#3SHl?zB%7Mu=>&BbW&yvd+00|kCCIiAAN{&em*@G#?G-eA z@2oKA@Vmt05qz#G&@9&|@_VexM~Kh&0gt1N{m`XB+uIZc4^Zm>CTaRLi9wJa>)E$$ zRvSBmHTHTh3=GZIHZDVfA{r$t2De3~T4+pJBvpw4qUrj2C&GgWNV#jErH8*w*l$zd zD{e{xn$@_mtya5C37yW0T(-^KYw*JCwAUSqBi&&n3$`O%Fc2FD6Dn?&Rr$E#e}Bp+ zaL{YW?-G~*nc}=HsISb*bjn}V@x-UbXH8ighrdTs0QkJffdEoiVTU$I$Z2AvNk8Ey zSeom?z3uaW!yi{H4rch+T(x}G%PxL}GG9uKC{p+1KaKfzX#u7pgluxWjFQV!v@P*% zZXiR zro*nVIb&yQBWZ|joVn+LXfw=m^Kbov%<=Uh#^j)1Sc;R_X-<5;n6Y!M{+*1^+}f6#_B}~Q#u&Oh8t@~%7t?YarPw_ z*7`||IahJlki#aaIWokIYq@Bhdxz5$OZ{p$mCgvcm~GiMke9QV5C~tBxdy5u^&_4Q zts(X4F=z+g(w*ujho`x{L#^!`b7ONe+7w@6|2G3A28z&MnCru6sGM0)eY6ycrDdV$jHXZ^rK)wOSodT5)b-yt3T$v-YC?}7hYku zkjcUC0oBrskz>0xnq$~jUcY9gv93vlQ@X*QFSOc&*?y_ryK8jJS8b=)$nD{sLF4rV z>IYhr2o_m&Ke-|H#`hM6vS|!~qDpk7r;&a(bOC{9B@|XuQ|L$b;8oUmZw_L`C)Q3o z#!NZ`d(5V&y9R(GB4Mfds|S?4Ge-?JGa&Z)$ts(e62E`!6SQ|3_d-ZgvI>M;n(>Qt13TwuSpsoHlZ;u7e{pGd$;& zX4xMw`LQuPg{2Gjraq`lCASQCRD<>YyF|U7(u#_V=d)U_;XO1LXR~}Q({-7}ATOj^ z+1utvlJW0*+XV_&>9f|lKu_WG)$I|pn-8gg1KXE{`^Il4&RdtrwLN1EtVn$GHO1Cx zRqkG10Uk)e@|;RmvZ15+DN|BfvhRjnaXsmDr>?T!hRbk!GS>9RavfC0jlV zgypuL!5Uj9z2%EG)4A$rv+$RRM49tC40`@1#CIKgT2y~ix()q%Wo}Y)cMdbGA&@Q0 ziK!wqZXAc|$UsB*%ZAdkm7BL7dAtGC*kFUP4;(^ZHF!O-W2N z5>M1BBI9xky?kxv*kjH@YU**rO8h9eKV3H#Y0Z_*N21fxW#C+8GitFIq*lfymHN{QK=7b_inyyRD73Htw_tsNKwd{_g zmZEcc;r6R@Ol2`TJ_vUEltp?uj@-MJ?_iF2Di_cuR2j4@fSaUD!Pa z_e*>DbxIj_ICDfK7dQKIDriNvW3b|iUwkTd#3NzS>UA23_fsnM2E&?kI#PaK1$9Kb zqXl`0H?2@9GL&Z*)VjMq-X8icyU89sPPY%1z630_LsmIko)N^F3-`UVwC4&|G;8IR zaz_56cRvH6q|+H12g5R}1f9l((Y;yl6W!i%U5-$GVr62r4k-KZ1;bdMuv+zA2;x7u zGv1y4&Hy^Ml!LPEOnk)g*`4H`kPnzRjNX7apAy-N=+Q>zn3ag11y*ifSgQG6bIE7u z!;%aHzVX4`QhWv_Z$2G_cn$p-t}unf+vLIN_DGQ_kN4}+a>y;ad%=T_2E>tcoG=LNwGC4m;V`_K{N#Vxu^uLW806Drx6CxxGzxr(E*^Mi7j;OC(GB3zR;oyM?IGiv`D%@-w{7Wl$I0Bit`nQxn z?q)QFTjp`u?Ergl=r64++gkVwX1sFXkx((H7lN5swb>kGaP_qY;`bEDHa@2jLpb?* z8H@Wa*|=M4%NCmjLY0l^RV8Ad-}={{RtE|Q|FK|1JS9@TA&p1pW!U3|Z!j`sgGwA^ zIJBssovJdKoYIm>RZ8IXFBcg_CM~FXa?C%PxL8rNe@4ptUtoN+h67;@0vUlFiOYQ} zn#%J(lxUGWHNG$v^GUZ_vb;wqWTgjT%BfhXp5ky<DTeE6J1?t_4Q;cHNc$Q->WaoZUsF^eDfN-ZQlbr=!zb^XN$L{jzJp>3AMM z^<&H>XdzYnc4l9b-%KCtH{lD?CSL?19;fif`zfYIn?1fa+(SrBb>xlU3jD&0C|64U~le>Z;v;e0EqPIT6s0bmy!ld zwZybZ=6K+h6r;Fuy*kN9y%8(*#`dyTM%8(_7ytH?+47?GlH)|2WYAr@xEG8GQBUt%0mMQ|W?(Oz(h9uTz0L1*HcS zoFiSs)|~YVHqH=nVNjiBnh1-Zn>T>exJ8=IUw1i!8-5_V6v|+{T&yF?TOR=I9Q+cf zLz2HZ55PGNO|DZ>$ltY>TOT+?=n-ad7*auH^2E4eX7IRndZ?63wtPQXuvGx}UnZcS z`Sb#q=F3MYO2)^SV$C2J46eKTGw_c~%u85Mjq=%aj-dtCCeyi8Q@T3oy*^IYJ^g%M ztZ9WsRJe8P9a(KRM9NeuaxQO>S1Lzk6Cr?DOoJRZf&I>v&T7(l+9vLoZqTq(2GoTG z6eJ~r>6Q|knvX}?)kZ@?S6^&4m-^HOZU{JTOL;M^vAVj7{A zaS&k+clEdrM4AgN+<5KACdS|v@%dt7(j>K33Hq#=#lsrhm% zLTrZ_S9uJGvnb%vacI~pstCm#O!S(PDYurP&V#Eir*eU%P7n~g{_=7MlNJo?l+~ye zkJb%|%H9s|>z?<9muNETDeB6RBO+tMex^K6>gUHh5)W%Unh4LGug_dNn^R4j^!dBZ zvh2UE)0deqy}}g(r_+w4?|NP);(x~<%$YNGr6&qpyzTBvz{S}VK)NmQe1t4IyOvzo zcD$1_^#$hDeCo1R%Y2DTYSP>&Gip^ZCzb&pJo3#eM2_%|JUBRL$Z(%l zYakPV?_)vz^vhw$lk0D_Z~3~G;6s3YH9a{c^FZCdvpB>U!s^J_(vYP5 zQ9vN$N~##Uh!7)25%c{P&ghdm8p;f6%*9}DpW>&52^s|zDa1!KJUsDL#>W&U_uN_( zTYg=ai*+Oiz3sJ`d1g;D3~+}iXK(3T97ZnT;`db()O;I+9RGY+hZ{d2N2LkB2 zaGmE~o9Jj56vV$0Q}!`vba&JdWRZ~WqOuaWS9=2S)}5~R%%j)k#+^J$m(wqQiaq8> zsbbhjrw&};H6C7fhX$J0OeU;8O+|gkHc`N{((ibv6&F{1RZq;~%d_ubAB3C|%HVZW zN$7hpv<@AiY)Ud#k&oOI7AnFImSl_sjk+N*Pf`&p*3odF914 zXGbgF)R5f~$p*c*1R(gD>KlW%HEOws`qpvNv(F}2m4~Wnt!`{jh%za~o4ec!e`T#_ zdA}!ksPH{K5?froE}X4iwK*5Ozdh?+a)VS>ss1+lLbpV*lB$@|-`*U5*Yqi&KiyX? zz22VHvcak8sjc!{3)iYYs|YVEaP4%lZHL6xR`nHTovH%$^)l6KQO`M=eyRK@k1Fa) zCbRbheFlrZ5LVT1>ndT$+KTq*i2Ph77G3!kO?W;})6>R=0Lbu(WA1I5SJJT0~Z$ z`Rg$yLVw75SnWmv>WRL)wG=1Iz^mN>r~pLy3b&bFiw-;#f)oP_2VNZhLiK@w;#4fm zI;(0Gz)KbH<8d^d1^T66=v5@qe{;c0T11_%oA-dO{S_Q63-_ zw3rhtuQkzkK4Z)_|Gr&gmKA7B;-?mfZmHl--ZEv=jK=f5)jx(&C`wa1czHR{%{|C^ z;n{=XmFTTQp7CFf{`~*6b(K+VFx!?ukQUeCPSN77!L>+nOK~k;XmCk!OK^vx#U0AU zTO5kJ1q)IrZpHfe?!9llKX3lbkFm4QUbAM+I%oFq(dIwg1YaiJAin53&zGm?QDJea zlV-4dvda)if>#<`x)+`xCB~ksLeKDWI*cbx}9#)K0m;$ zaz5jJV9{aOWnH+Hx2%#LIfsVe)7fJcBsO|uY`Vgx8rxDGcy1-I=Zq%y8d6nmSM8%? zse{aV;p$Ab!zf8UEw~WSeby6Zp9LWcS&Kc#Nut6665puPBVYF@VoMG-zUEToVq=@G zs5u+`*Sz%_q^X0D*;OAnVn!v^&hv= zwEQ*%Qm2#KBe%kz#<`5fBP)U$g`N)Gf(xEyl=Bm4r6Ld-?D`A81*Ex@r-%+`w~4kK z`7u7s&5({kGAXn5YD~BN*M}AfoXtEr8;_Se6HCKFJgmOUoYmB)4&JU`oS#=PBT0#J zd0E0Yd-vXIj_9TFywAb}2&?q<^}*UJvnfA%R!c&j9-p5#MvV-!v%|P(!_@cHe=SXS zni`tm{J1_00( z$k2DH&D&8p6%$1YR3Isiu~MwmGg+z7cecOFXc2fU%k?Og7FWv^FPfRwr1NPqan@nK zHQ?D3VG5wij=RVCVNF+8*BTLKkv0ZrKIXQ)`Uz>o`d*$}?PGOwaw|)a z=7Ypp48ellz}dTw;--)HqF=iBm(q_{_3q!f6j5`nb@hq6n-$J|0tXnaSrbpVR0czF zm)z(r32<8lv9LHX)>=S@Sw9xNPhsEy)K)tuUN9O!i*lzZO{WID)tpd*1I|;$h^{qv z4FGZ2_w+)~{xF0)-^MS{S)bN<9~xZLxx1){303Oj;~Gq64}Koh9NouUpR26tko4RC zqP&A-+MYg`iWf0Uzh0GuOSgCXC0K0$H-*C(pvRRFqdIO% zX+7h-&mu%|jT7RHn&l2&nE2dq;%%Hjdpg1Dr)BTM4@z5=Go|dHK;O$l|6?J>%TCAi z#Xpdq2@0W+j)f+)J%QNJvqyogI6|GjPl1XM2?`2kg0su#xJs~xM}6u~%&1=(Q$^2d z0BB6UF$-$HZc2Us_1ogn!VXO<*m#Lun1Jb9B1P&elAZpKJ{&)+aW#8SGiW0E&I?${ z9p}j%UQ;{$PS_P&in7KU#``XPEcEC86~1I3>m}VW;k9yi;o2!1v7ngyMzq1$6Iy<@ zp-76VtrhFrHE}(<WyK!0zFF6~*t+D`KLUym(< zC39=~#(&^03hh#d#}XfWHYu*YZ2MowXmWB2;Xi&i94T4}@{Yu9C=0TULARKH!@eHY z5tT`cdVP0uXu8MijQz7>Hlt3zYNWSfuAf3>2IB`ax|*<^5E&O&qFqp6#P9E_AsSJ= z149DJY6drc=j=~n%7hk3-+8-(*O70dt}=Zb9|HR>x_o|TXO&B6((YAbp;U z-&{anLxt&iE~V5KSqTkmQIQ!{%aO+z%(EFHzIip$LV-#s)P#WTMv#MPiv{-Q&vKGV zpw9{CXE<`d8a^^*KIhs1Y)Cd~?>Pi;G1$4Z=h-jzj}xV8uiow*S4GVTuKOb%mCTI& z8B_vbgXTU5v-?k&L2jOzur)ONy^AD@FJ%}v_{i$8oI#&B=7=N$a)$U1b*4FWr+RrU ztay?RgBIu`8PGh6E%K<}e|O-e2`Yv2DqEqOC9fANrL93I2Y5=RyXB8Wwf)jql;S?i zqU68=>o82I4=2U9Xi?^M^1qaQy6o(Udk4{J1kHQ4)N zDYQ?wI@sDRrb}U-;-UEMN!hcJMxsTXe_kfb`@}7E9%3h`bQgqbkq<+0|10p&vp?Vad(`zhJQuRC~5-n}lES>DxhYdkA$^}S*jmr^kJgH$6uxlyi95|rgg-zk~jGdc--!Iu%IKpdSH9Mb0w;Z=cB$C_oY*c zo`?Vo$AbmZ{ije0Yz({YR74iau&Sdse9n{F5+#;o^X0&29B`_EEWo-gNEv;}*@+p* zfjM80xa>13opZ7RtS72>p_w=qCwX7nCE>72jd*|ahL66NNge4dEG${$C-%V;Pe1Zm zQtz@#7j%h3Cy-Zw*a-4-da#~~C=7Q}c*qiFOGqEf2U4?LV=1#xx=hPIO3-(|fQx#Tr(XJT5e!U>n*MYuXOVG0 zt0J``5tRWyKW=K^Ke(P~z6S+;w(F9%4hdUG3j)c=g5?UBlgbpB9P*9Rw2-}c5g%i^ z;2%17$`QrVvhEZvu|TY7;?Gj#6Bv-`vKtjjWo_<9a$~ZH2UL6>cKTj&rbk2&Zr)Hv z7%MCTVCM}Jq=_c%iDM-+CcKrtZH+8qkpC#2p{_Lzt z05K74jCM#n>N3T+n3w%}!%cqKpVqZZ&>>0ac~1Z73H2P5ccH7UUZkj=MouwkiUXkF zukVW*u2j=$yNeeobPL>G-Z$#(iNvQW)p%8z;$fSIx+Og9ytrI@-1>ZG zK-TM4tYiJ!?eVU)s)GTl9+xt{;G^>N`C=e*mjqvE<{qZcFN{MeIuu1i+x}@Mx>JdA z$%3F#fTX~vre{DpJUq#PjaTnR{Ioc^VpvbKr3-Oc=4l%UakOl^gh9EanAa^n9%-yx zT4cFLXTE3`S*8B+SLxbw?sD`^m&Ls_nc&P8E#q*dL9M~*TC~BP zrE1X5OjTEs`AQ9)+m@D-btyhXf7t5##;-TFRBam%7avgiKpJ7JOqCsGzEjsa5^_c_ zu=4!QNSLmQC78Xzi50RGNVx!p7~t2WLI1X<@g_7hQWYu3*Mo^P)Zu^> z{ZlbKB9t~8g7EaKlf(yko;z7Grh1R<`zf)#xal~M@+gL0c~`h=mo|_%@$uq&iZKw? zPC1W4J!*(tuE+7<)Y6A0Xi`KyGTkI(_bc4~Aj|nfT4>ifoIherpDf1Np1>=08LyFE zF$qrfu!c*8YdW+)Mq#+}to@mRx)pQBR@?dn_e=qx`hCLSv$3S$ILbKdsap6NuYqA> z$~ZHlMJ_Y`uAmU9RN7a7a}a_gUwDMkrlRPEnM}1Xm0KEYA-Uod`1tnW z4ci;Y!P6@FrWV&VJ3tO_ms?*FZOIGcfFeNAhL%R`&s4gaT{xLEU!+W6@VKs*kU+Bl zr8uOH7cxUjjIsazT>$1Zx7`@|H<{D+C9)a!Ow_D3PbxqTBhaH3M)D$>$b}Z8Rb|ZY zrp7n}S5EVx??qNQ6N{rf*X5sxoaEouD}Rsnx^Hb;c(#xds0pBL0@0QqeDR$0{Yyyo zwCI4i=|k~OSxAN&b21w3AWuWrG>Lo_!q*-OrYy(;WgP>+xW%6`1yEVZ<%yH6-(bXb;G-6IehpZc{z)UP7nW3gTH#m#|xJJ)pu=O&Y0hP^$Ec`@B%A z(_2V-jjHaoH98!oqV_=ol{e9@H^^#KXZcTWE{M75maf&Yy69 z`7PLgIR-udF6x%_a2+-QqsjqkEThV&O_$XrVgUNpY}*$x7&?qZqDk=6H6gP@@cAyA zg^;6Mu6KB1PiA1-npT&4pKLx$?M7Wk?mel;DtJ4A;Fyp@Sr{#Pn$raoUs`ZYYWk(8 znZP8y{UiIxH#GJW_9_bA>3N$ShC>`E&UtW=i#@5m%JY3EEM_p{^hn*hpH7g(H4EZH%d^ZYCN86w&V#k+)q%C65<&bdRRpYxX3 z?MT03|BY5$EEQ&Q6N3WZ;d;5@2(BZVmQZC`wXz)Y+&p_{YRjo6PzE$GuqS!H(X&dr zv|A72Nnz5=)u2@cW*|520YnquZN9jf0G^mw2{*(xjf-nxES34|oR**#Pb3EwFMo*r zYrFM_J!Us!3iCkZ$3r^YwlAc$)zdxHgKs58U5470#IG~V{Z~2=yrzqOZ3&=c2JK0f zX09)Muf93Y2To}PL!6Zq7h{4MgJD?;)$apYFHj>?nbq9khSDN)Xd1^QpS{!{L0gat@ zhKq#+bDT@gAfJ-~;f&F?#^a)v`SHUQm%m3+9^Ci^I3ko}x}^{2v)<>+RH-Bq9Woo- z^G=W_smfwJqOE4UAo@;@7A}uoRgS;tQ7e@a7~Zlc;9ZK~i?U{sjg$T%{A)zYY8Gx` zd50&vB|Grl!zSPbk5|plji{%W4E89a&8ioJ^cV-)4O2=s9EBPqo0NYa7LtX({tH=p zn2cZhq#>@&zx26lBH^@3+W<2Ep*=4(kjp31v~Gl)gh6D}Z#MlJd13*ypMLedGyM0L z+ED!4*LWt563em9Gsl*6i)Wc$`|9;^~cy_^&5_mI;1$uvivhj}OTnfWd zJ&k(?XWpb_FpoM{#?tJnG5a8Q>}dw7W*=xdVlOzupLHk7y8AZ%Yx*9R4Is3N;KE;F zEI5UNFS1GRXgX<&k!sMH1`yP$v@OlNJ~i5gJnVk|+3H7ow!&&tS}2y4Y2C_6$4bYA z;d^gIsM{;KpRpMT2BYTQaKVcgmm+zo8u_nEk1~;1vaLVO)~LIw9T~Rcv@*9cw?%g5 zMhO5I5UroNwcbu!J(dl4d{*|_12`|2vW#RlRl1bD;2G@$l0OnQBgIf%C;%NAYwbQd z8?)TL4#RKPS*#o2>fc!WFiac35dVxjo};ykDDdky#y10I_c5b9$*q-2VN#bv;uCnRX@fQZV=8{@vs zMsv)oT&ROP0p!Iv2`b}T);3sKGp;u!?vG^2-8XXvH%MtLz*W8RM2O`CMw z#G+36u$*>`IGH1K2PRMhtc;Qj{iM&QJ#REvciUEk!2-(kdjufX)po;BR0K!K;G@Rf zgeKWocvtq(n`*tyB>fzQZA@lIQTk3UaWl`aMMZdi%T?f2>`y>yfN~F^gFcohpPT+q zWU4nXiy)LKr_);OqOfqC?5M>MVEmheYhF_P(+Qo!d+||zYbz}ZM17l{ zzc4kuMVPY#O;-qbaC{inBi&Rd$nh|6`^5 zKgJgH6Mj_%FK_9ey%c>ubiEj1`DJsGsWOW{3EkNy)R$3E012uJvU>jo=8R<|oJNfk z=V`S*?^lSZWzr7s33+;SiFU^9`_F{W=%2rQv*N}!^41%uH{(xl*m>s+F{ci-Q?Qs0 zCoWtHeuy=PBbzUpZJM+Hjq(|+yCBoEWNmEf8`CaE@y@C$KbBu+ZT9c~2pF1tKitGB zmZhiS4E7XDvj{#z8WvWsv@CHrIaa`Q+ezLzUJVD;IR=!Jc4>Oeb+^?dSC3BxT;2GL z8&KK3JD!>x_gM7zfg-Z;%QQ@?HwOjZKhDTZ0R4Rqm-WS_MhlaYl8YX$Jq+q25IR2N z?pAp;W}SM<1*(KYWPEPZYJQggrQ*4oWCNO6ue04g*!-{a{?~_&1nySrf}(!x|JV5+ z`Vv4z|1|vnBUG|eZBO#F3el0AMdu~8iuq1Uzo$1@rs58g3&+g^gy5y22z8JDxc%Qu e{j-=A@CjespK^iKLC+24xu_~?D%8kXg#8Z$&Y&;= literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/server-metrics.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/server-metrics.png new file mode 100644 index 0000000000000000000000000000000000000000..488002e152c968188ba7ff549eb7949157e1db62 GIT binary patch literal 32120 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/stepwise-summary.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/stepwise-summary.png new file mode 100644 index 0000000000000000000000000000000000000000..256733951b0c017fcedbc8a37f014cc3eafed7b2 GIT binary patch literal 150424 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 VM Instances** and select **Create Instance**. +- Under **Machine configuration**: + - Populate fields such as **Instance name**, **Region**, and **Zone**. + - Set **Series** to `C4A`. + - Select `c4a-standard-4` for machine type. + +![Create a Google Axion C4A Arm virtual machine in the Google Cloud Console with c4a-standard-4 selected alt-text#center](images/gcp-vm.png "Creating a Google Axion C4A Arm virtual machine in Google Cloud Console") + + +- Under **OS and Storage**, select **Change**. Choose an Arm64-based OS image. For this Learning Path, select **Ubuntu 24.04 LTS**. +- Change the size of the primary disk from 10 GB to 100 GB +- Click **Select** to confirm your OS choice. +- Under **Networking**, enable **Allow HTTP traffic** and **Allow HTTPS traffic**. +- In the **Network tags** field, add `allow-tcp-8080` to allow Gerrit dashboard traffic. + +![Screenshot showing the Google Cloud Console interface with the Networking tab open for a VM instance. The primary subject is the configuration of a firewall rule allowing TCP traffic on port 8080. The Network tags field contains allow-tcp-8080. The wider environment includes other VM configuration options and navigation menus. The tone is neutral and instructional. Visible text includes Network tags and allow-tcp-8080. alt-text#center](images/network-config.png "Adding the TCP/8080 firewall rule to our VM") + +- Select **Create** to launch your VM instance. +- After the VM is ready, you'll see an **SSH** button next to your instance in the VM list. The public IP address for your VM also appears here. +- Copy the public IP address—you'll need it later to connect to Gerrit. +- Select **SSH** to open a shell session directly in your browser. + +![Screenshot showing the Google Cloud Console interface with the SSH option highlighted for a running VM instance. The primary subject is the SSH button next to the VM, indicating how to open a shell session in the browser. The wider environment includes the VM instance list, navigation menus, and status indicators. Visible text includes SSH and the public IP address for the VM. The tone is neutral and instructional. alt-text#center](images/gcp-pubip-ssh.png "Invoke a SSH session into your running VM instance") + +A window from your browser should come up and you should now see a shell into your VM instance: + +![Screenshot of a terminal shell open in a browser window, displaying a command prompt for a SUSE Linux Enterprise Server VM instance on Google Cloud Platform. The primary subject is the active shell session, ready for user input. The wider environment includes browser interface elements and navigation menus. Visible text includes the command prompt and system information. The tone is neutral and instructional. alt-text#center](images/gcp-shell.png "Terminal shell in your VM instance") + +Next, let's install Gerrit! From b11c3513e2f962059d2aafd5bb43126644bf1af2 Mon Sep 17 00:00:00 2001 From: Doug Anson Date: Mon, 22 Jun 2026 11:33:57 -0500 Subject: [PATCH 072/137] codex review updates --- .../gerrit-on-gcp/_index.md | 4 +--- .../gerrit-on-gcp/benchmarking.md | 12 ++++++------ .../gerrit-on-gcp/firewall_setup.md | 6 +++--- .../gerrit-on-gcp/installation.md | 2 +- .../gerrit-on-gcp/instance.md | 8 ++++---- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md index 56aab8f164..bed4eb7271 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md @@ -1,8 +1,6 @@ --- title: Deploy Gerrit on Google Cloud C4A -description: Learn how to install and configure Gerrit on Google Cloud Axion C4A Arm64 instances and benchmark its performance - - +description: Learn how to install and configure Gerrit on Google Cloud Axion C4A Arm64 instances and benchmark its performance minutes_to_complete: 30 who_is_this_for: This is an introductory topic for developers deploying Gerrit in Arm Linux environments, specifically using Google Cloud C4A virtual machines (VM) powered by Axion processors. diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md index 1b322afeb9..6906394e20 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md @@ -123,27 +123,27 @@ The benchmark gives a high-quality performance view: client latency, stepwise co CPU/memory/disk, and Gerrit-side JVM, GC, Jetty, cache, queue, Git, REST, NoteDB, and receive-commits metrics are all present: -![Gerrit Benchmark Summary alt-text #center](images/analysis.png "Gerrit Benchmark Summary") +![Charts and graphs showing the Gerrit benchmark performance summary including operation counts, success rates, and latency metrics across the four 120-second test steps.#center](images/analysis.png "Gerrit Benchmark Summary") Client-visible correctness is excellent: all 47,863 measured operations succeeded. REST query latency remains low with p99 69 ms. Clone is the dominant pressure point at p99 521 ms, and push remains sub-second at p99 288 ms: -![Client-side Operation Summary alt-text #center](images/client-summary.png "Client-side Operation Summary") +![Performance metrics showing client-side operation summary with statistics for git_clone, git_push_refs_for, and rest_change_query operations, including latency percentiles and success rates.#center](images/client-summary.png "Client-side Operation Summary") The useful capacity signal is the flattening throughput curve after step 2. CPU is already near saturation in step 2, then stays around 99% in steps 3 and 4. Latency continues rising: clone p99 increases from 221 ms in step 2 to 550 ms in step 4, while aggregate throughput only rises from 103.3 to 108.4 ops/sec: -![Stepwise Concurrency Behavior Summary alt-text #center](images/stepwise-summary.png "Stepwise Concurrency Behavior Summary") +![Graph showing throughput and latency trends across four concurrency steps, demonstrating how performance degrades as concurrency increases and CPU approaches saturation.#center](images/stepwise-summary.png "Stepwise Concurrency Behavior Summary") Host CPU pressure: -![CPU Pressure Summary alt-text #center](images/cpu-pressure.png "CPU Pressure Summary") +![Chart displaying CPU usage metrics across the benchmark steps, showing how CPU pressure increases and stabilizes near saturation levels as concurrency increases.#center](images/cpu-pressure.png "CPU Pressure Summary") Gerrit server-side correlation observations: -![Gerrit Server-side Correlation Findings alt-text #center](images/gerrit-correlation.png "Gerrit Server-side Correlation Findings") +![Graph showing correlations between various Gerrit server-side metrics such as GC pressure, cache performance, and queue depths in relation to client request latency.#center](images/gerrit-correlation.png "Gerrit Server-side Correlation Findings") Basic Server Metrics: -![Basic Additional Server Metrics alt-text #center](images/server-metrics.png "Basic Additional Server Metrics") \ No newline at end of file +![Server metrics dashboard showing host resource utilization metrics including memory, disk I/O, and other system-level performance indicators during the benchmark run.#center](images/server-metrics.png "Basic Additional Server Metrics") \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md index 4b30438519..082866aef1 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md @@ -23,7 +23,7 @@ To expose TCP port 8080 for Gerrit, start by creating a new firewall rule in Goo You'll use this rule to allow incoming traffic on TCP port 8080, which is required for Gerrit access on your Arm-based VM. -![Google Cloud Console showing the Create firewall rule page with fields for Name set to allow-tcp-8080, Network dropdown, Direction set to Ingress, Action set to Allow, Targets set to Specified target tags with allow-tcp-8080 entered, and Source IPv4 ranges set to 0.0.0.0/0. The interface is clean and organized, focusing on configuring firewall settings for a virtual machine. The overall tone is neutral and instructional. alt-text#center](images/firewall-rule.png "Create a firewall rule") +![Google Cloud Console showing the Create firewall rule page with Name set to allow-tcp-8080, Direction set to Ingress, Action set to Allow, Targets set to Specified target tags with allow-tcp-8080, and Source IPv4 ranges set to 0.0.0.0/0. These settings configure the firewall to allow incoming TCP traffic on port 8080 from any IPv4 address.#center](images/firewall-rule.png "Create a firewall rule") - Set **Name** to `allow-tcp-8080`. - Select the network you want to use for your VM. The default is `autoscaling-net`, but your organization might use a different network. @@ -34,7 +34,7 @@ You'll use this rule to allow incoming traffic on TCP port 8080, which is requir This configuration allows incoming TCP traffic on port 8080 from any IPv4 address. -![Google Cloud Console interface displaying the Create firewall rule page. The main section shows fields for Name set to allow-tcp-8080, Network dropdown, Direction set to Ingress, Action set to Allow, Targets set to Specified target tags with allow-tcp-8080 entered, and Source IPv4 ranges set to 0.0.0.0/0. The environment is a clean, organized web dashboard focused on configuring firewall settings for a virtual machine. The tone is neutral and instructional. All visible text is transcribed in the description. alt-text #center](images/network-rule.png "Creating the TCP/8080 firewall rule") +![Google Cloud Console showing the firewall rule configuration form with allow-tcp-8080 in the Name field, Ingress direction, Allow action, Specified target tags field with allow-tcp-8080, and Source IPv4 ranges set to 0.0.0.0/0. This configuration enables TCP port 8080 traffic for Gerrit access.#center](images/network-rule.png "Creating the TCP/8080 firewall rule") ## Specify protocols and ports @@ -47,6 +47,6 @@ Next, configure the protocols and ports for your firewall rule: This step ensures that only TCP traffic on port 8080 is allowed through the firewall. -![Google Cloud Console showing the Protocols and ports section of the Create firewall rule page. The TCP checkbox is selected and the Ports field contains 8080. The interface is part of a clean, organized web dashboard for configuring firewall settings. Visible text includes Protocols and ports, Specified protocols and ports, TCP, and Ports 8080. The tone is neutral and instructional. alt-text#center](images/network-port.png "Specifying the TCP port to expose") +![Google Cloud Console showing the Protocols and ports section with TCP checkbox selected and Ports field containing 8080. This ensures only TCP traffic on port 8080 is allowed through the firewall for Gerrit.#center](images/network-port.png "Specifying the TCP port to expose") Your network firewall rule has now been created. You're ready to continue with VM creation. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md index 7886669329..664e4ac33e 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md @@ -72,6 +72,6 @@ http://my_vm_public_ip_address:8080 You should see output similar to this: -![Gerrit Dashboard alt-text#center](images/gerrit-dashboard.png "Gerrit Dashboard") +![Gerrit web console dashboard showing the main interface with navigation menu and project/change options available.#center](images/gerrit-dashboard.png "Gerrit Dashboard") In the next section, basic performance testing of Gerrit will be performed. diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md index 7124f01b3d..9ad0850e26 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md @@ -24,7 +24,7 @@ To create a virtual machine based on the C4A instance type: - Set **Series** to `C4A`. - Select `c4a-standard-4` for machine type. -![Create a Google Axion C4A Arm virtual machine in the Google Cloud Console with c4a-standard-4 selected alt-text#center](images/gcp-vm.png "Creating a Google Axion C4A Arm virtual machine in Google Cloud Console") +![Google Cloud Console interface showing the Create Instance page with Machine configuration section. Series is set to C4A and machine type shows c4a-standard-4 selected. The dialog displays configuration options for CPU, memory, and other VM settings.#center](images/gcp-vm.png "Creating a Google Axion C4A Arm virtual machine in Google Cloud Console") - Under **OS and Storage**, select **Change**. Choose an Arm64-based OS image. For this Learning Path, select **Ubuntu 24.04 LTS**. @@ -33,17 +33,17 @@ To create a virtual machine based on the C4A instance type: - Under **Networking**, enable **Allow HTTP traffic** and **Allow HTTPS traffic**. - In the **Network tags** field, add `allow-tcp-8080` to allow Gerrit dashboard traffic. -![Screenshot showing the Google Cloud Console interface with the Networking tab open for a VM instance. The primary subject is the configuration of a firewall rule allowing TCP traffic on port 8080. The Network tags field contains allow-tcp-8080. The wider environment includes other VM configuration options and navigation menus. The tone is neutral and instructional. Visible text includes Network tags and allow-tcp-8080. alt-text#center](images/network-config.png "Adding the TCP/8080 firewall rule to our VM") +![Google Cloud Console interface showing the Networking tab for VM instance configuration. The Network tags field displays allow-tcp-8080 to enable firewall rule for Gerrit dashboard traffic on port 8080. Other networking options and VM configuration controls are visible.#center](images/network-config.png "Adding the TCP/8080 firewall rule to our VM") - Select **Create** to launch your VM instance. - After the VM is ready, you'll see an **SSH** button next to your instance in the VM list. The public IP address for your VM also appears here. - Copy the public IP address—you'll need it later to connect to Gerrit. - Select **SSH** to open a shell session directly in your browser. -![Screenshot showing the Google Cloud Console interface with the SSH option highlighted for a running VM instance. The primary subject is the SSH button next to the VM, indicating how to open a shell session in the browser. The wider environment includes the VM instance list, navigation menus, and status indicators. Visible text includes SSH and the public IP address for the VM. The tone is neutral and instructional. alt-text#center](images/gcp-pubip-ssh.png "Invoke a SSH session into your running VM instance") +![Google Cloud Console showing the VM Instances list with a running VM instance. The SSH button is highlighted next to the instance entry, with the public IP address visible in the same row. This shows how to access the SSH terminal to connect to your Arm-based VM.#center](images/gcp-pubip-ssh.png "Invoke a SSH session into your running VM instance") A window from your browser should come up and you should now see a shell into your VM instance: -![Screenshot of a terminal shell open in a browser window, displaying a command prompt for a SUSE Linux Enterprise Server VM instance on Google Cloud Platform. The primary subject is the active shell session, ready for user input. The wider environment includes browser interface elements and navigation menus. Visible text includes the command prompt and system information. The tone is neutral and instructional. alt-text#center](images/gcp-shell.png "Terminal shell in your VM instance") +![Browser-based terminal window showing an active shell session on the Ubuntu VM instance. The command prompt is ready for input. This demonstrates successful connection to your C4A Arm virtual machine on Google Cloud.#center](images/gcp-shell.png "Terminal shell in your VM instance") Next, let's install Gerrit! From 2be6b53c9830d0e9c4745999819e0a3c4420b2dd Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 12:12:42 -0500 Subject: [PATCH 073/137] refactoring with skills --- .../learning-path-structure-review/SKILL.md | 2 +- .../vllm/_index.md | 5 +- .../vllm/vllm-run.md | 22 +++++--- .../vllm/vllm-server.md | 22 +++++--- .../vllm/vllm-setup.md | 50 ++++++++++--------- 5 files changed, 58 insertions(+), 43 deletions(-) diff --git a/.github/skills/learning-path-structure-review/SKILL.md b/.github/skills/learning-path-structure-review/SKILL.md index a152c79db0..08b3aa94e4 100644 --- a/.github/skills/learning-path-structure-review/SKILL.md +++ b/.github/skills/learning-path-structure-review/SKILL.md @@ -29,7 +29,7 @@ Use this skill when a Learning Path needs a structural review. Focus on whether - Prefer direct relevance, Arm Learning Paths, required tools, foundation knowledge, and logical next steps. - Avoid link piles that pull readers away from the task. 6. Review recap and transition sections: - - Include concise recap and forward-looking transition at major instructional boundaries. + - Include concise recap and forward-looking transition at major instructional boundaries. Do not treat a transition sentence alone as a recap. Note the absence of a transition as a finding. - Use `what you've learned` for conceptual sections and `what you've accomplished` for task sections. - Avoid repeating earlier content verbatim. 7. If the Learning Path demonstrates Arm-specific performance features, apply the performance integrity checks. diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/_index.md b/content/learning-paths/servers-and-cloud-computing/vllm/_index.md index 069912aca1..765fccdc43 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/_index.md @@ -7,12 +7,13 @@ who_is_this_for: This is an introductory topic for software developers and AI en learning_objectives: - Build vLLM from source on an Arm server. - - Download a Qwen LLM from Hugging Face. + - Use a Qwen LLM from Hugging Face. - Run local batch inference using vLLM. - Create and interact with an OpenAI-compatible server provided by vLLM on your Arm server. prerequisites: - - An [Arm-based instance](/learning-paths/servers-and-cloud-computing/csp/) from a cloud service provider, or a local Arm Linux computer with at least 8 CPUs and 16 GB RAM. + - An [Arm-based Linux instance](/learning-paths/servers-and-cloud-computing/csp/) from a cloud service provider, or a local Arm Linux computer running Ubuntu 24.04 with at least 8 CPUs, 16 GB RAM, and 50 GB of disk storage. + - A system that includes support for BFloat16. author: Jason Andrews diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md index eb0f2a17f6..4ecebb3247 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md @@ -8,11 +8,11 @@ layout: learningpathall ## Use a model from Hugging Face -vLLM is designed to work seamlessly with models from the Hugging Face Hub. +vLLM is designed to work with models from the Hugging Face Hub. -The first time you run vLLM, it downloads the required model. This means that you do not have to explicitly download any models. +The first time you run vLLM, it downloads the required model. You don't have to explicitly download any models. -If you want to use a model that requires you to request access or accept the terms, you need to log in to Hugging Face using a token. +To use a model that requires you to request access or accept terms and conditions, log in to Hugging Face using a token: ```bash huggingface-cli login @@ -20,15 +20,15 @@ huggingface-cli login Enter your Hugging Face token. You can generate a token from [Hugging Face Hub](https://huggingface.co/) by clicking your profile on the top right corner and selecting **Access Tokens**. -You also need to visit the Hugging Face link printed in the login output and accept the terms by clicking the **Agree and access repository** button or filling out the request-for-access form, depending on the model. +Visit the Hugging Face link printed in the login output and accept the terms and conditions. Click the **Agree and access repository** button or fill out the request-for-access form, depending on the model. -To run batched inference without the need for a login, you can use the `Qwen/Qwen2.5-0.5B-Instruct` model. +To run batched inference without logging in, use the `Qwen/Qwen2.5-0.5B-Instruct` model. ## Create a batch script -To run inference with multiple prompts, you can create a simple Python script to load a model and run the prompts. +To run inference with multiple prompts, create a Python script to load a model and run the prompts. -Use a text editor to save the Python script below in a file called `batch.py`: +Use a text editor to save the following Python script in a file called `batch.py`: ```python import json @@ -137,4 +137,10 @@ Processed prompts: 100%|██████████████████ } ``` -You can try with other prompts and models such as `meta-llama/Llama-3.2-1B`. Continue to learn how to set up an OpenAI-compatible server. +## What you've accomplished and what's next + +You've now created a Python batch inference script that loads the `Qwen/Qwen2.5-0.5B-Instruct` model from Hugging Face, configures `bfloat16` precision, and sends multiple prompts to vLLM. + +You ran the script and confirmed that vLLM starts on the CPU backend, loads the model, processes the prompts, and returns generated text. + +Next, you'll set up an OpenAI-compatible server so client applications can send requests to vLLM. diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md index 68b848503e..5b2d439b1d 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md @@ -6,15 +6,17 @@ weight: 4 layout: learningpathall --- -Instead of a batch run from Python, you can create an OpenAI-compatible server. This allows you to leverage the power of Large Language Models without relying on external APIs. +## Create a local vLLM server compatible with OpenAI + +To run Large Language Models (LLMs) without relying on external APIs, create an OpenAI-compatible server. Running a local LLM offers several advantages: -* Cost-effective - it avoids the costs associated with using external APIs, especially for high-usage scenarios. +* Cost-effectiveness - it avoids the costs associated with using external APIs, especially for high-usage scenarios. * Privacy - it keeps your data and prompts within your local environment, which enhances privacy and security. -* Offline Capability - it enables operation without an internet connection, making it ideal for scenarios with limited or unreliable network access. +* Offline capability - it enables operation without an internet connection, making it ideal for scenarios with limited or unreliable network access. -OpenAI compatibility means that you can reuse existing software which was designed to communicate with OpenAI and use it to communicate with your local vLLM service. +OpenAI compatibility means that you can reuse existing software to communicate with your local vLLM service. Run vLLM with the same `Qwen/Qwen2.5-0.5B-Instruct` model: @@ -22,7 +24,7 @@ Run vLLM with the same `Qwen/Qwen2.5-0.5B-Instruct` model: python3 -m vllm.entrypoints.openai.api_server --model Qwen/Qwen2.5-0.5B-Instruct --dtype float16 --max-num-batched-tokens 32768 ``` -The server output displays that it is ready for requests: +The output is similar to: ```output INFO 12-12 22:54:40 cpu_executor.py:186] # CPU blocks: 21845 @@ -51,7 +53,7 @@ INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) You can submit requests to the server using the `curl` command. -For example, run the command below using another terminal on the same server: +For example, run the following command using another terminal on the same server: ```bash curl http://0.0.0.0:8000/v1/chat/completions \ @@ -72,12 +74,16 @@ curl http://0.0.0.0:8000/v1/chat/completions \ }' ``` -The server processes the request, and the output prints the results: +The server processes the request, and the output is similar to: ```output "id":"chatcmpl-6677cb4263b34d18b436b9cb8c6a5a65","object":"chat.completion","created":1734044182,"model":"Qwen/Qwen2.5-0.5B-Instruct","choices":[{"index":0,"message":{"role":"assistant","content":"Certainly! Here is a simple \"Hello, World!\" program in C:\n\n```c\n#include \n\nint main() {\n printf(\"Hello, World!\\n\");\n return 0;\n}\n```\n\nThis program defines a function called `main` which contains the body of the program. Inside the `main` function, it calls the `printf` function to display the text \"Hello, World!\" to the console. The `return 0` statement indicates that the program was successful and the program has ended.\n\nTo compile and run this program:\n\n1. Save the code above to a file named `hello.c`.\n2. Open a terminal or command prompt.\n3. Navigate to the directory where you saved the file.\n4. Compile the program using the following command:\n ```\n gcc hello.c -o hello\n ```\n5. Run the compiled program using the following command:\n ```\n ./hello\n ```\n Or simply type `hello` in the terminal.\n\nYou should see the output:\n\n```\nHello, World!\n```","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":null}],"usage":{"prompt_tokens":26,"total_tokens":241,"completion_tokens":215,"prompt_tokens_details":null},"prompt_logprobs":null} ``` -There are many other experiments you can try. Most Hugging Face models have a **Use this model** button on the top-right of the model card with the instructions for vLLM. You can now use these instructions on your Arm Linux computer. +## What you've accomplished + +You've now set up a local OpenAI-compatible server and tested sending requests to the server. + +You can use the instructions in this Learning Path to experiment with other models on your Arm Linux computer. Most Hugging Face models include a **Use this model** button with instructions for vLLM. You can also try out OpenAI-compatible chat clients to connect to the served model. diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md index 4f5a8d9b85..44ec0cb613 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md @@ -1,5 +1,5 @@ --- -title: Build a vLLM from Source Code +title: Build a vLLM from source code weight: 2 ### FIXED, DO NOT MODIFY @@ -8,35 +8,33 @@ layout: learningpathall ## Before you begin -To follow the instructions for this Learning Path, you will need an Arm server running Ubuntu 24.04 LTS with at least 8 cores, 16GB of RAM, and 50GB of disk storage. You also need a system which supports BFloat16. +[Virtual Large Language Model (vLLM)](https://github.com/vllm-project/vllm) is a fast and easy-to-use library for inference and model serving. -To check if your system includes BFloat16, use the `lscpu` command: +You can use vLLM in batch mode, or by running an OpenAI-compatible server. + +In this Learning Path, you'll learn how to build vLLM from source and run inference on an Arm-based server. + +Start by checking if your system includes BFloat16 using the `lscpu` command: ```console lscpu | grep bf16 ``` -If the `Flags` are printed, you have a processor with BFloat16. +If you have a processor with BFloat16, the output is similar to: ```output Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 flagm2 frint svei8mm svebf16 i8mm bf16 dgh rng bti ``` -If the result is blank, you do not have a processor with BFloat16. +If the output is blank, you don't have a processor with BFloat16. -BFloat16 provides improved performance and smaller memory footprint with the same dynamic range. You might experience a drop in model inference accuracy with BFloat16, but the impact is acceptable for the majority of applications. +BFloat16 provides improved performance and smaller memory footprint with the same dynamic range. You might experience a drop in model inference accuracy with BFloat16, but the tradeoff is acceptable for the majority of applications. -The instructions have been tested on an AWS Graviton3 `m7g.2xlarge` instance. +The instructions in this Learning Path have been tested on an AWS Graviton3 `m7g.2xlarge` instance. -## What is vLLM? +## Install dependencies to build vLLM -[vLLM](https://github.com/vllm-project/vllm) stands for Virtual Large Language Model, and is a fast and easy-to-use library for inference and model serving. - -You can use vLLM in batch mode, or by running an OpenAI-compatible server. - -In this Learning Path, you will learn how to build vLLM from source and run inference on an Arm-based server, highlighting its effectiveness. - -### What software do I need to install to build vLLM? +After validating that your system supports BFloat16, install vLLM dependencies. First, ensure your system is up-to-date and install the required tools and libraries: @@ -45,16 +43,16 @@ sudo apt-get update -y sudo apt-get install -y curl ccache git wget vim numactl gcc g++ python3 python3-pip python3-venv python-is-python3 libtcmalloc-minimal4 libnuma-dev ffmpeg libsm6 libxext6 libgl1 libssl-dev pkg-config ``` -Next, install Rust. For more information, see the [Rust install guide](/install-guides/rust/). +Next, install Rust. For installation steps, see the [Rust install guide](/install-guides/rust/). ```bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y source "$HOME/.cargo/env" ``` -Four environment variables are required. You can enter these at the command line or add them to your `$HOME/.bashrc` file and source the file. +Next, set up required environment variables. You can either enter the variables at the command line or add them to your `$HOME/.bashrc` file and source the file. -To add them at the command line, use the following: +To add the environment variables at the command line, run: ```bash export CCACHE_DIR=/home/ubuntu/.cache/ccache @@ -72,14 +70,14 @@ source env/bin/activate Your command-line prompt is prefixed by `(env)`, which indicates that you are in the Python virtual environment. -Now update Pip and install Python packages: +Now update `pip` and install Python packages: ```bash pip install --upgrade pip pip install py-cpuinfo ``` -### How do I download vLLM and build it? +## Download and build vLLM First, clone the vLLM repository from GitHub: @@ -90,9 +88,9 @@ git checkout releases/v0.11.0 ``` {{% notice Note %}} -The Git checkout specifies a specific hash known to work for this example. +The Git checkout specifies a version known to work for this example. -Omit this command to use the latest code on the main branch. +Omit this checkout command to use the latest code on the main branch. {{% /notice %}} Install the Python packages for vLLM: @@ -102,7 +100,7 @@ pip install -r requirements/build.txt pip install -v -r requirements/cpu.txt ``` -Build vLLM using Pip: +Build vLLM using `pip`: ```bash VLLM_TARGET_DEVICE=cpu python3 setup.py bdist_wheel @@ -116,4 +114,8 @@ rm -rf dist cd .. ``` -You are now ready to download a large language model (LLM) and run vLLM. +## What you've accomplished and what's next + +You have verified BFloat16 support, installed the build dependencies, configured the required environment variables, and built vLLM from source for the CPU backend. + +Next, you'll use vLLM with a Hugging Face model to run batch inference on your Arm server. From 827a5592c8f5e47b0bf3f6eb5370eb8afd113aea Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 12:14:29 -0500 Subject: [PATCH 074/137] added descriptions --- .../learning-paths/servers-and-cloud-computing/vllm/_index.md | 2 +- .../learning-paths/servers-and-cloud-computing/vllm/vllm-run.md | 1 + .../servers-and-cloud-computing/vllm/vllm-server.md | 1 + .../servers-and-cloud-computing/vllm/vllm-setup.md | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/_index.md b/content/learning-paths/servers-and-cloud-computing/vllm/_index.md index 765fccdc43..524bc37b2b 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/_index.md @@ -1,5 +1,6 @@ --- title: Build and Run vLLM on Arm Servers +description: Build vLLM from source on an Arm Linux server, run batch inference with a Hugging Face model, and expose the model through an OpenAI-compatible API. minutes_to_complete: 45 @@ -60,4 +61,3 @@ weight: 1 # _index.md always has weight of 1 to order corr layout: "learningpathall" # All files under learning paths have this same wrapper learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. --- - diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md index 4ecebb3247..23cffc9ffc 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-run.md @@ -1,5 +1,6 @@ --- title: Run batch inference using vLLM +description: Use vLLM to load a Qwen model from Hugging Face and run batch inference prompts on an Arm server. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md index 5b2d439b1d..cbc45e5d3c 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md @@ -1,5 +1,6 @@ --- title: Run an OpenAI-compatible server +description: Start a local vLLM OpenAI-compatible server on Arm Linux and send a chat completion request with curl. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md index 44ec0cb613..8a812204f6 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md @@ -1,5 +1,6 @@ --- title: Build a vLLM from source code +description: Prepare an Arm Ubuntu server for vLLM by checking BFloat16 support, installing dependencies, and building the CPU backend from source. weight: 2 ### FIXED, DO NOT MODIFY From bf81db40142babdb61d5f1399e27ef752664e106 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 12:28:51 -0500 Subject: [PATCH 075/137] edits --- .../learning-paths/servers-and-cloud-computing/vllm/_index.md | 2 +- .../servers-and-cloud-computing/vllm/vllm-server.md | 2 +- .../servers-and-cloud-computing/vllm/vllm-setup.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/_index.md b/content/learning-paths/servers-and-cloud-computing/vllm/_index.md index 524bc37b2b..030c0ed599 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/_index.md @@ -1,5 +1,5 @@ --- -title: Build and Run vLLM on Arm Servers +title: Build and run vLLM on Arm servers description: Build vLLM from source on an Arm Linux server, run batch inference with a Hugging Face model, and expose the model through an OpenAI-compatible API. minutes_to_complete: 45 diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md index cbc45e5d3c..53fd08b928 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md @@ -1,5 +1,5 @@ --- -title: Run an OpenAI-compatible server +title: Run a local OpenAI-compatible vLLM server description: Start a local vLLM OpenAI-compatible server on Arm Linux and send a chat completion request with curl. weight: 4 diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md index 8a812204f6..309bbc93a5 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-setup.md @@ -1,5 +1,5 @@ --- -title: Build a vLLM from source code +title: Build a vLLM from source code on Arm Linux description: Prepare an Arm Ubuntu server for vLLM by checking BFloat16 support, installing dependencies, and building the CPU backend from source. weight: 2 @@ -117,6 +117,6 @@ cd .. ## What you've accomplished and what's next -You have verified BFloat16 support, installed the build dependencies, configured the required environment variables, and built vLLM from source for the CPU backend. +You've now verified BFloat16 support, installed the build dependencies, configured the required environment variables, and built vLLM from source for the CPU backend. Next, you'll use vLLM with a Hugging Face model to run batch inference on your Arm server. From 0eeb959e1bd935f97ec577b06b0a3d04c274cea2 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 12:33:06 -0500 Subject: [PATCH 076/137] edits --- .../servers-and-cloud-computing/vllm/vllm-server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md index 53fd08b928..d9b73b8cd9 100644 --- a/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md +++ b/content/learning-paths/servers-and-cloud-computing/vllm/vllm-server.md @@ -1,5 +1,5 @@ --- -title: Run a local OpenAI-compatible vLLM server +title: Run an OpenAI-compatible vLLM server description: Start a local vLLM OpenAI-compatible server on Arm Linux and send a chat completion request with curl. weight: 4 From cc4f3e010bf2acd216b62eb69026cd9a3ddc5a00 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 12:57:15 -0500 Subject: [PATCH 077/137] bulk adding descriptions to each embedded LP --- .../advanced_soc/connecting_peripheral.md | 1 + .../advanced_soc/creating_peripheral.md | 1 + .../advanced_soc/generating_bitstream.md | 1 + .../embedded-and-microcontrollers/advanced_soc/setup.md | 1 + .../alif-image-classification/application-code.md | 1 + .../alif-image-classification/aws-ec2-setup.md | 1 + .../alif-image-classification/board-setup.md | 1 + .../alif-image-classification/build-flash-verify.md | 1 + .../alif-image-classification/create-project.md | 1 + .../alif-image-classification/image-preparation.md | 1 + .../alif-image-classification/memory-configuration.md | 1 + .../embedded-and-microcontrollers/arduino-pico/app_stack.md | 1 + .../embedded-and-microcontrollers/arduino-pico/arduino_sketch.md | 1 + .../embedded-and-microcontrollers/arduino-pico/arm_embedded.md | 1 + .../embedded-and-microcontrollers/arduino-pico/background.md | 1 + .../embedded-and-microcontrollers/arduino-pico/embedded_stack.md | 1 + .../embedded-and-microcontrollers/arduino-pico/int-background.md | 1 + .../embedded-and-microcontrollers/arduino-pico/int-setup.md | 1 + .../arduino-pico/raspberrypi_pico.md | 1 + .../embedded-and-microcontrollers/arduino-pico/refactoring.md | 1 + .../learning-paths/embedded-and-microcontrollers/armds/build.md | 1 + .../learning-paths/embedded-and-microcontrollers/armds/debug.md | 1 + .../learning-paths/embedded-and-microcontrollers/armds/misc.md | 1 + .../learning-paths/embedded-and-microcontrollers/asm/coding.md | 1 + .../learning-paths/embedded-and-microcontrollers/asm/intro.md | 1 + .../embedded-and-microcontrollers/asm/setup_mdk5.md | 1 + .../embedded-and-microcontrollers/asm/setup_mdk6.md | 1 + .../embedded-and-microcontrollers/avh_balena/2setup.md | 1 + .../embedded-and-microcontrollers/avh_balena/3install.md | 1 + .../embedded-and-microcontrollers/avh_balena/4deploy.md | 1 + .../embedded-and-microcontrollers/avh_greengrass/2setup.md | 1 + .../embedded-and-microcontrollers/avh_greengrass/3deploy.md | 1 + .../embedded-and-microcontrollers/avh_matter/2setup.md | 1 + .../embedded-and-microcontrollers/avh_matter/3build.md | 1 + .../embedded-and-microcontrollers/avh_matter/4cicdsh.md | 1 + .../embedded-and-microcontrollers/avh_matter/5cicdapi.md | 1 + .../avh_ppocr/end-to-end_workflow.md | 1 + .../embedded-and-microcontrollers/avh_ppocr/overview.md | 1 + .../learning-paths/embedded-and-microcontrollers/avh_vio/vio.md | 1 + .../embedded-and-microcontrollers/azure-iot/aggregation.md | 1 + .../azure-iot/device_registration.md | 1 + .../embedded-and-microcontrollers/azure-iot/intro.md | 1 + .../embedded-and-microcontrollers/azure-iot/iot-hub.md | 1 + .../embedded-and-microcontrollers/azure-iot/monitoring.md | 1 + .../embedded-and-microcontrollers/azure-iot/portal.md | 1 + .../azure-iot/stream-analytics-dynamo-db.md | 1 + .../embedded-and-microcontrollers/azure-iot/stream-analytics.md | 1 + .../embedded-and-microcontrollers/bare-metal/event-driven1.md | 1 + .../embedded-and-microcontrollers/bare-metal/event-driven2.md | 1 + .../embedded-and-microcontrollers/bare-metal/exception-levels.md | 1 + .../embedded-and-microcontrollers/bare-metal/hello.md | 1 + .../embedded-and-microcontrollers/bare-metal/reset.md | 1 + .../embedded-and-microcontrollers/bare-metal/retarget.md | 1 + .../cloud-native-deployment-on-hybrid-edge-systems/avh-setup.md | 1 + .../build-runtime.md | 1 + .../cloud-native-deployment-on-hybrid-edge-systems/containerd.md | 1 + .../cloud-native-deployment-on-hybrid-edge-systems/k3s.md | 1 + .../cloud-native-deployment-on-hybrid-edge-systems/motivation.md | 1 + .../runtime-overview.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx/build_and_run.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx/create.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx/eventrecorder.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx/initialize.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx/threads.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx_vs/build_and_run.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx_vs/create.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx_vs/initialize.md | 1 + .../embedded-and-microcontrollers/cmsis_rtx_vs/threads.md | 1 + .../cmsisdsp-dev-with-python/how-to-1.md | 1 + .../cmsisdsp-dev-with-python/how-to-2.md | 1 + .../cmsisdsp-dev-with-python/how-to-3.md | 1 + .../cmsisdsp-dev-with-python/how-to-4.md | 1 + .../cmsisdsp-dev-with-python/how-to-5.md | 1 + .../cmsisdsp-dev-with-python/how-to-6.md | 1 + .../cmsisdsp-dev-with-python/how-to-7.md | 1 + .../cmsisdsp-dev-with-python/how-to-8.md | 1 + .../context-switch-cortex-m/example.md | 1 + .../embedded-and-microcontrollers/coverage_mdk/cc.md | 1 + .../embedded-and-microcontrollers/coverage_mdk/mdk.md | 1 + .../embedded-and-microcontrollers/device-connect-d2d/_index.md | 1 + .../device-connect-d2d/background.md | 1 + .../device-connect-d2d/d2d-setup.md | 1 + .../embedded-and-microcontrollers/device-connect-d2d/overview.md | 1 + .../device-connect-server/background.md | 1 + .../device-connect-server/server-setup.md | 1 + .../device-connect-strands/background.md | 1 + .../device-connect-strands/run-example.md | 1 + .../device-connect-strands/run-infra-example.md | 1 + .../device-connect-strands/setup.md | 1 + .../embedded-and-microcontrollers/docker/dockerfile.md | 1 + .../edge/connect-and-set-up-arduino.md | 1 + .../embedded-and-microcontrollers/edge/overview.md | 1 + .../embedded-and-microcontrollers/edge/program-and-deployment.md | 1 + .../embedded-and-microcontrollers/edge/software-edge-impulse.md | 1 + .../edge_impulse_greengrass/cleanup.md | 1 + .../edge_impulse_greengrass/customcomponentdeployment.md | 1 + .../edge_impulse_greengrass/edgeimpulsecustomcomponentinstall.md | 1 + .../edge_impulse_greengrass/edgeimpulseprojectbuild.md | 1 + .../edge_impulse_greengrass/greengrassinstallation.md | 1 + .../edge_impulse_greengrass/hardwaresetup.md | 1 + .../edge_impulse_greengrass/hardwaresetupec2.md | 1 + .../edge_impulse_greengrass/hardwaresetupnvidiajetson.md | 1 + .../edge_impulse_greengrass/hardwaresetupqc6490ubuntu.md | 1 + .../edge_impulse_greengrass/hardwaresetuprpi5.md | 1 + .../edge_impulse_greengrass/noncameracustomcomponent.md | 1 + .../edge_impulse_greengrass/overview.md | 1 + .../edge_impulse_greengrass/running.md | 1 + .../edge_impulse_greengrass/secretmanagersetup.md | 1 + .../edge_impulse_greengrass/summary.md | 1 + .../embedded-and-microcontrollers/img_nn_stcube/build_nn.md | 1 + .../embedded-and-microcontrollers/img_nn_stcube/deploy_nn.md | 1 + .../embedded-and-microcontrollers/img_nn_stcube/run_nn.md | 1 + .../embedded-and-microcontrollers/img_nn_stcube/setup.md | 1 + .../embedded-and-microcontrollers/intro/background.md | 1 + .../embedded-and-microcontrollers/intro/find-hardware.md | 1 + .../embedded-and-microcontrollers/intro/resources.md | 1 + .../introduction-to-tinyml-on-arm/1-overview.md | 1 + .../introduction-to-tinyml-on-arm/2-env-setup.md | 1 + .../introduction-to-tinyml-on-arm/3-env-setup-fvp.md | 1 + .../introduction-to-tinyml-on-arm/4-build-model.md | 1 + .../learning-paths/embedded-and-microcontrollers/iot-sdk/aws.md | 1 + .../embedded-and-microcontrollers/iot-sdk/openiot.md | 1 + .../jetson_object_detection/2setup.md | 1 + .../jetson_object_detection/3docker.md | 1 + .../jetson_object_detection/4object.md | 1 + .../embedded-and-microcontrollers/keilstudiocloud/2build.md | 1 + .../embedded-and-microcontrollers/linux-nxp-board/1-overview.md | 1 + .../linux-nxp-board/3-create-super-user.md | 1 + .../linux-nxp-board/4-enable-wifi.md | 1 + .../linux-nxp-board/7-enable-persistent-wifi.md | 1 + .../embedded-and-microcontrollers/linux-on-fvp/debug.md | 1 + .../embedded-and-microcontrollers/linux-on-fvp/intro.md | 1 + .../embedded-and-microcontrollers/linux-on-fvp/modify.md | 1 + .../embedded-and-microcontrollers/linux-on-fvp/run.md | 1 + .../embedded-and-microcontrollers/linux-on-fvp/steps.md | 1 + .../llama-python-cpu/llama-python-chatbot.md | 1 + .../migration/2_porting_methodology.md | 1 + .../migration/3_porting_analysis.md | 1 + .../migration/4_development_environment.md | 1 + .../migration/5_application_porting.md | 1 + .../embedded-and-microcontrollers/migration/6_run_evaluate.md | 1 + .../embedded-and-microcontrollers/migration/7_alternative.md | 1 + .../learning-paths/embedded-and-microcontrollers/mlek/build.md | 1 + content/learning-paths/embedded-and-microcontrollers/mlek/fvp.md | 1 + content/learning-paths/embedded-and-microcontrollers/mlek/run.md | 1 + .../embedded-and-microcontrollers/nav-mlek/intro.md | 1 + .../embedded-and-microcontrollers/nav-mlek/platforms.md | 1 + .../learning-paths/embedded-and-microcontrollers/nav-mlek/sw.md | 1 + .../new_debug_targets_armds/dstream.md | 1 + .../new_debug_targets_armds/fastmodels.md | 1 + .../observing-ethos-u-on-nxp/1-overview.md | 1 + .../10-deploy-executorchrunner-nxp-board.md | 1 + .../observing-ethos-u-on-nxp/2-boot-nxp.md | 1 + .../observing-ethos-u-on-nxp/4-environment-setup.md | 1 + .../observing-ethos-u-on-nxp/6-build-executorch.md | 1 + .../observing-ethos-u-on-nxp/7-build-executorch-pte.md | 1 + .../9-build-executorch-runner-for-cm33.md | 1 + .../pack-migration-cmsis-v6/device_support.md | 1 + .../pack-migration-cmsis-v6/example_projects.md | 1 + .../embedded-and-microcontrollers/pqc_pqm4/adding-new-schemes.md | 1 + .../embedded-and-microcontrollers/pqc_pqm4/introduction.md | 1 + .../pqc_pqm4/running-tests-and-benchmarks.md | 1 + .../embedded-and-microcontrollers/pqc_pqm4/setup-installation.md | 1 + .../project-migration-cmsis-v6/device_mapping.md | 1 + .../project-migration-cmsis-v6/packs.md | 1 + .../project-migration-cmsis-v6/project_format.md | 1 + .../project-migration-cmsis-v6/toolchains.md | 1 + .../project-migration-cmsis-v6/troubleshooting.md | 1 + .../raspberry-pi-smart-home/1-overview.md | 1 + .../raspberry-pi-smart-home/2-software-dependencies.md | 1 + .../raspberry-pi-smart-home/3-test-gpio.md | 1 + .../raspberry-pi-smart-home/4-smart-home-assistant.md | 1 + .../raspberry_pi_chatgpt_bot/2setup.md | 1 + .../raspberry_pi_chatgpt_bot/3audio.md | 1 + .../raspberry_pi_chatgpt_bot/4python-code.md | 1 + .../raspberry_pi_chatgpt_bot/5run.md | 1 + .../embedded-and-microcontrollers/rpi-llama3/dev-env.md | 1 + .../embedded-and-microcontrollers/rpi-llama3/executorch.md | 1 + .../embedded-and-microcontrollers/rpi-llama3/llama3.md | 1 + .../embedded-and-microcontrollers/rpi-llama3/run.md | 1 + .../learning-paths/embedded-and-microcontrollers/rpi/docker.md | 1 + content/learning-paths/embedded-and-microcontrollers/rpi/id.md | 1 + .../learning-paths/embedded-and-microcontrollers/rpi/intro.md | 1 + .../learning-paths/embedded-and-microcontrollers/rpi/kernel.md | 1 + content/learning-paths/embedded-and-microcontrollers/rpi/perf.md | 1 + .../learning-paths/embedded-and-microcontrollers/rpi/setup.md | 1 + content/learning-paths/embedded-and-microcontrollers/rpi/tf.md | 1 + .../embedded-and-microcontrollers/rpi_pico/debug.md | 1 + .../embedded-and-microcontrollers/rpi_pico/hello.md | 1 + .../embedded-and-microcontrollers/rpi_pico/perf.md | 1 + .../learning-paths/embedded-and-microcontrollers/rpi_pico/sdk.md | 1 + .../streamline-kernel-module/1_overview.md | 1 + .../streamline-kernel-module/2_build_kernel_image.md | 1 + .../streamline-kernel-module/3_oot_module.md | 1 + .../streamline-kernel-module/4_sl_profile_oot.md | 1 + .../streamline-kernel-module/5_intree_kernel_driver.md | 1 + .../streamline-kernel-module/6_sl_profile_intree.md | 1 + .../streamline-kernel-module/7_sl_spe.md | 1 + .../streamline-kernel-module/8_summary.md | 1 + .../embedded-and-microcontrollers/tflow_nn_stcube/features.md | 1 + .../embedded-and-microcontrollers/tflow_nn_stcube/run_nn.md | 1 + .../embedded-and-microcontrollers/tflow_nn_stcube/setup.md | 1 + .../embedded-and-microcontrollers/tflow_nn_stcube/test.md | 1 + .../embedded-and-microcontrollers/tflow_nn_stcube/train_nn.md | 1 + content/learning-paths/embedded-and-microcontrollers/tfm/tfm.md | 1 + .../training-inference-pytorch/env-setup-1.md | 1 + .../training-inference-pytorch/fine-tune-2.md | 1 + .../training-inference-pytorch/fvp-3.md | 1 + .../embedded-and-microcontrollers/trustzone_nxp_lpc/hello.md | 1 + .../trustzone_nxp_lpc/trustzone_concepts.md | 1 + .../universal-sbc-chassis/bay-assembly.md | 1 + .../universal-sbc-chassis/card-plate-assembly.md | 1 + .../universal-sbc-chassis/print-parts.md | 1 + .../embedded-and-microcontrollers/uv_debug/2_basics.md | 1 + .../embedded-and-microcontrollers/uv_debug/3_event_recorder.md | 1 + .../embedded-and-microcontrollers/uv_debug/4_swv.md | 1 + .../embedded-and-microcontrollers/uv_debug/5_etm_trace.md | 1 + .../embedded-and-microcontrollers/uv_debug/6_power_ulplus.md | 1 + .../embedded-and-microcontrollers/uvprojx-conversion/how-to-1.md | 1 + .../embedded-and-microcontrollers/uvprojx-conversion/how-to-2.md | 1 + .../uvprojx-conversion/how-to-mdk.md | 1 + .../vcpkg-tool-installation/config_creation.md | 1 + .../vcpkg-tool-installation/initialization.md | 1 + .../vcpkg-tool-installation/installation.md | 1 + .../vcpkg-tool-installation/licenseactivation.md | 1 + .../vcpkg-tool-installation/removal.md | 1 + .../vcpkg-tool-installation/usage.md | 1 + .../visualizing-ethos-u-performance/2-overview.md | 1 + .../visualizing-ethos-u-performance/3-executorch-workflow.md | 1 + .../visualizing-ethos-u-performance/4-env-setup-execut.md | 1 + .../visualizing-ethos-u-performance/5-env-setup-fvp.md | 1 + .../visualizing-ethos-u-performance/6-run-model.md | 1 + .../visualizing-ethos-u-performance/7-configure-fvp-gui.md | 1 + .../visualizing-ethos-u-performance/8-evaluate-output.md | 1 + .../embedded-and-microcontrollers/yocto_qemu/yocto_build.md | 1 + .../yolo-on-himax/build-firmware.md | 1 + .../embedded-and-microcontrollers/yolo-on-himax/dev-env.md | 1 + .../embedded-and-microcontrollers/yolo-on-himax/flash-and-run.md | 1 + .../embedded-and-microcontrollers/yolo-on-himax/overview.md | 1 + .../embedded-and-microcontrollers/yolo-on-himax/web-toolkit.md | 1 + .../embedded-and-microcontrollers/zephyr/zephyr.md | 1 + .../zephyr_vsworkbench/1_installation.md | 1 + .../zephyr_vsworkbench/2_development.md | 1 + .../embedded-and-microcontrollers/zephyr_vsworkbench/3_debug.md | 1 + 244 files changed, 244 insertions(+) diff --git a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/connecting_peripheral.md b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/connecting_peripheral.md index 1e49ac2838..9e4d13f19f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/connecting_peripheral.md +++ b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/connecting_peripheral.md @@ -1,6 +1,7 @@ --- # User change title: "Connect AXI4 Peripheral to ZYNQ Processing System" +description: Connect the custom AXI4 peripheral to the Zynq processing system in Vivado so switch inputs can drive LED outputs on the Zybo Z7-10 board. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/creating_peripheral.md b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/creating_peripheral.md index e5843af71c..08aad4d118 100644 --- a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/creating_peripheral.md +++ b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/creating_peripheral.md @@ -1,6 +1,7 @@ --- # User change title: "Create a custom AXI4 Peripheral" +description: Create an AXI4-Lite peripheral in Vivado and define the registers and IP package used by the custom Zynq design. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/generating_bitstream.md b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/generating_bitstream.md index b22fc8febd..c2f4095277 100644 --- a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/generating_bitstream.md +++ b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/generating_bitstream.md @@ -1,6 +1,7 @@ --- # User change title: "Generate the bitstream and write your application using Vitis IDE" +description: Generate the Vivado bitstream, export the hardware design, and write a Vitis application to test the custom AXI4 peripheral. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/setup.md b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/setup.md index ce962fc650..e5f4bb96a7 100644 --- a/content/learning-paths/embedded-and-microcontrollers/advanced_soc/setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/advanced_soc/setup.md @@ -1,6 +1,7 @@ --- # User change title: "Setup a Workspace in Xilinx Vivado" +description: Create a Vivado workspace for the Zybo Z7-10 board and configure the base Zynq processing system for a custom peripheral design. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/application-code.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/application-code.md index 9c30163c23..795cbb3093 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/application-code.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/application-code.md @@ -1,5 +1,6 @@ --- title: Add the application code +description: Add firmware code for camera input, image preprocessing, and Ethos-U85 inference in the Alif Ensemble image classification project. weight: 5 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md index 1ceb3c6e1c..c193376420 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md @@ -1,5 +1,6 @@ --- title: Compile the model on an Arm cloud instance +description: Set up an Arm-based AWS EC2 instance to compile the neural network model used by the Alif Ensemble image classification firmware. weight: 3 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/board-setup.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/board-setup.md index 8e5a028fc6..43f491bf5c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/board-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/board-setup.md @@ -1,5 +1,6 @@ --- title: Set up the Alif Ensemble E8 DevKit +description: Connect and configure the Alif Ensemble E8 DevKit so it is ready for firmware flashing and image classification inference. weight: 2 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/build-flash-verify.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/build-flash-verify.md index 528c8f1ccf..6f6220d623 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/build-flash-verify.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/build-flash-verify.md @@ -1,5 +1,6 @@ --- title: Build, flash, and verify inference +description: Build the Alif Ensemble firmware, flash it to the E8 DevKit, and verify image classification output over the serial console. weight: 8 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/create-project.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/create-project.md index 6660c8029a..7bc513dda1 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/create-project.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/create-project.md @@ -1,5 +1,6 @@ --- title: Create the image classification firmware project +description: Create the Alif Ensemble firmware project in VS Code and add the files needed for the image classification application. weight: 4 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/image-preparation.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/image-preparation.md index 3887046ae7..b961bd59d3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/image-preparation.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/image-preparation.md @@ -1,5 +1,6 @@ --- title: Prepare a test image +description: Prepare a test image with the expected size and format so the Alif Ensemble firmware can run image classification inference. weight: 7 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/memory-configuration.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/memory-configuration.md index 2c85b2027e..394cb4f491 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/memory-configuration.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/memory-configuration.md @@ -1,5 +1,6 @@ --- title: Configure memory layout and flash settings +description: Configure SRAM, flash, and scatter file settings so the Alif Ensemble application can load the model and run on the target hardware. weight: 6 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/app_stack.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/app_stack.md index 57ad3acdc4..8ef1ef1809 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/app_stack.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/app_stack.md @@ -1,6 +1,7 @@ --- # User change title: "Application Programming" +description: Understand the application stack for the Raspberry Pi Pico motion detector before connecting sensors and implementing the firmware. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arduino_sketch.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arduino_sketch.md index ca96d7a348..2a8adabf19 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arduino_sketch.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arduino_sketch.md @@ -1,6 +1,7 @@ --- # User change title: "Program your smart device prototype" +description: Write and upload the Arduino sketch for the Raspberry Pi Pico so the smart device prototype can react to motion events. weight: 7 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arm_embedded.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arm_embedded.md index 9bc3c68cb1..7a6f531cf6 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arm_embedded.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/arm_embedded.md @@ -1,6 +1,7 @@ --- # User change title: "Embedded Programming on Arm" +description: Review Arm embedded development concepts and tool options used when programming Cortex-M based microcontroller projects. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/background.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/background.md index 49149c92a7..453c508f33 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/background.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/background.md @@ -1,6 +1,7 @@ --- # User change title: "About Embedded Programming" +description: Review embedded programming fundamentals and the hardware and software constraints that shape microcontroller applications. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/embedded_stack.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/embedded_stack.md index 69e21be9bf..f4107e9f5d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/embedded_stack.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/embedded_stack.md @@ -1,6 +1,7 @@ --- # User change title: "Embedded Programming" +description: Understand the layers of an embedded software stack and how firmware, runtime libraries, and hardware interact on microcontrollers. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-background.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-background.md index 4ce38ee383..d2ea99459a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-background.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-background.md @@ -1,5 +1,6 @@ --- title: Learn about interrupts +description: Learn why interrupt-driven programming improves responsiveness compared with polling in the Raspberry Pi Pico prototype. weight: 8 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-setup.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-setup.md index 52314d92d0..29399cd282 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/int-setup.md @@ -1,5 +1,6 @@ --- title: Add the interrupt code +description: Add interrupt handling code to the Raspberry Pi Pico application so the device responds to sensor changes without constant polling. weight: 9 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/raspberrypi_pico.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/raspberrypi_pico.md index 317374d3f9..fa01a7871c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/raspberrypi_pico.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/raspberrypi_pico.md @@ -1,6 +1,7 @@ --- # User change title: "Build a smart device prototype" +description: Build the first Raspberry Pi Pico motion detection prototype by wiring the PIR sensor and LED and uploading the initial Arduino sketch. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/refactoring.md b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/refactoring.md index d02d8d1372..ba1892dca3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/arduino-pico/refactoring.md +++ b/content/learning-paths/embedded-and-microcontrollers/arduino-pico/refactoring.md @@ -1,5 +1,6 @@ --- title: Refactor the application +description: Refactor the Raspberry Pi Pico application to separate state handling from hardware control and improve the device workflow. weight: 10 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/armds/build.md b/content/learning-paths/embedded-and-microcontrollers/armds/build.md index 1e74d1a54c..11427a9e30 100644 --- a/content/learning-paths/embedded-and-microcontrollers/armds/build.md +++ b/content/learning-paths/embedded-and-microcontrollers/armds/build.md @@ -1,6 +1,7 @@ --- # User change title: "Import and build example project" +description: Import an embedded example project into Arm Development Studio and build it for the selected compiler and target platform. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/armds/debug.md b/content/learning-paths/embedded-and-microcontrollers/armds/debug.md index 75be711189..4f82f7c30d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/armds/debug.md +++ b/content/learning-paths/embedded-and-microcontrollers/armds/debug.md @@ -1,6 +1,7 @@ --- # User change title: Debug the example +description: Debug the example project in Arm Development Studio using an FVP target and inspect execution with breakpoints and registers. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/armds/misc.md b/content/learning-paths/embedded-and-microcontrollers/armds/misc.md index 127612ede4..7be15baaae 100644 --- a/content/learning-paths/embedded-and-microcontrollers/armds/misc.md +++ b/content/learning-paths/embedded-and-microcontrollers/armds/misc.md @@ -1,6 +1,7 @@ --- # User change title: Other compilers and project types +description: Adjust Arm Development Studio projects for alternate compiler versions and project types when the default setup does not match your environment. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/asm/coding.md b/content/learning-paths/embedded-and-microcontrollers/asm/coding.md index 49a7391850..6342d9db65 100644 --- a/content/learning-paths/embedded-and-microcontrollers/asm/coding.md +++ b/content/learning-paths/embedded-and-microcontrollers/asm/coding.md @@ -1,6 +1,7 @@ --- # User change title: Writing assembly functions +description: Create C and Arm assembly source files that work together under the Arm Procedure Call Standard for a Cortex-M project. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/asm/intro.md b/content/learning-paths/embedded-and-microcontrollers/asm/intro.md index eb10c5f1f5..7c7636814d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/asm/intro.md +++ b/content/learning-paths/embedded-and-microcontrollers/asm/intro.md @@ -1,6 +1,7 @@ --- # User change title: Keil MDK versions +description: Compare Keil MDK versions and choose the development environment used for the embedded assembly programming examples. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk5.md b/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk5.md index 5b4ef44aa0..a8851231bb 100644 --- a/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk5.md +++ b/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk5.md @@ -1,6 +1,7 @@ --- # User change title: "Setting up a Project in Keil MDK (μVision)" +description: Create and configure a Keil MDK uVision project for the Cortex-M assembly examples. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk6.md b/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk6.md index e8be73ecc7..70fb85c803 100644 --- a/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk6.md +++ b/content/learning-paths/embedded-and-microcontrollers/asm/setup_mdk6.md @@ -1,6 +1,7 @@ --- # User change title: "Setting up a Project in Keil Studio (VS Code)" +description: Create a Keil Studio csolution project for the Cortex-M assembly examples and prepare it for mixed C and assembly code. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_balena/2setup.md b/content/learning-paths/embedded-and-microcontrollers/avh_balena/2setup.md index f631682f5a..6484569c14 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_balena/2setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_balena/2setup.md @@ -1,5 +1,6 @@ --- title: "Prepare a custom Balena OS image" +description: Create a Balena Cloud application and prepare a custom Balena OS image for a virtual Raspberry Pi 4 device. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_balena/3install.md b/content/learning-paths/embedded-and-microcontrollers/avh_balena/3install.md index 7057f1010f..49d2115fa2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_balena/3install.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_balena/3install.md @@ -1,5 +1,6 @@ --- title: "Install Balena OS on AVH" +description: Provision a Raspberry Pi 4 instance in Arm Virtual Hardware and install the custom Balena OS image on the virtual device. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_balena/4deploy.md b/content/learning-paths/embedded-and-microcontrollers/avh_balena/4deploy.md index 1027e9eb9c..f91aa6d924 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_balena/4deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_balena/4deploy.md @@ -1,5 +1,6 @@ --- title: "Deploy an application to your device" +description: Deploy an application from Balena Hub to the Arm Virtual Hardware device and verify that it runs in Balena Cloud. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/2setup.md b/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/2setup.md index 25ba03db8e..58ee6d77a3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/2setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/2setup.md @@ -1,5 +1,6 @@ --- title: Set up your accounts and create a virtual device +description: Configure AWS and Arm Virtual Hardware accounts and create the virtual Raspberry Pi 4 device used as a Greengrass core. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/3deploy.md b/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/3deploy.md index e86f02dd38..6beddf7b49 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/3deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_greengrass/3deploy.md @@ -1,5 +1,6 @@ --- title: Deploy an AWS IoT Greengrass component to your device +description: Create an AWS IoT Greengrass deployment and run a Greengrass component on the virtual Raspberry Pi 4 device. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_matter/2setup.md b/content/learning-paths/embedded-and-microcontrollers/avh_matter/2setup.md index de6a688164..e6f66f7dd5 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_matter/2setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_matter/2setup.md @@ -1,6 +1,7 @@ --- # User change title: "Prepare AVH instances of Raspberry Pi 4" +description: Prepare two Raspberry Pi 4 instances in Arm Virtual Hardware for building and testing Matter examples. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_matter/3build.md b/content/learning-paths/embedded-and-microcontrollers/avh_matter/3build.md index b8913808f0..ab9879cdf8 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_matter/3build.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_matter/3build.md @@ -1,6 +1,7 @@ --- # User change title: "Build and run Matter examples on Arm Virtual Hardware" +description: Build Matter reference examples on Arm Virtual Hardware and run device communication between the virtual Raspberry Pi instances. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_matter/4cicdsh.md b/content/learning-paths/embedded-and-microcontrollers/avh_matter/4cicdsh.md index 7dc233db44..d6d571d40f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_matter/4cicdsh.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_matter/4cicdsh.md @@ -1,6 +1,7 @@ --- # User change title: "Manage development in a CI/CD workflow with Self-Hosted Runner" +description: Configure a GitHub Actions self-hosted runner on Arm Virtual Hardware to automate Matter example builds and tests. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_matter/5cicdapi.md b/content/learning-paths/embedded-and-microcontrollers/avh_matter/5cicdapi.md index c9f53a00a5..12acac0686 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_matter/5cicdapi.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_matter/5cicdapi.md @@ -1,6 +1,7 @@ --- # User change title: "Control Arm Virtual Hardware with API" +description: Use the Arm Virtual Hardware API from GitHub Actions to create, control, and clean up virtual devices during Matter CI workflows. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/end-to-end_workflow.md b/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/end-to-end_workflow.md index e8b6ff45ba..118b2226f4 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/end-to-end_workflow.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/end-to-end_workflow.md @@ -1,6 +1,7 @@ --- # User change title: "Deploy the PaddleOCR model" +description: Compile and deploy the PaddleOCR model to the Corstone-300 FVP and run the end-to-end optical character recognition workflow. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/overview.md b/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/overview.md index 1503ba0440..9f811fc5ae 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_ppocr/overview.md @@ -1,6 +1,7 @@ --- # User change title: "Overview of OCR" +description: Review optical character recognition concepts and the PaddleOCR model workflow before deploying it on Arm Virtual Hardware. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/avh_vio/vio.md b/content/learning-paths/embedded-and-microcontrollers/avh_vio/vio.md index 1fae9a85c5..b2242bf3e2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/avh_vio/vio.md +++ b/content/learning-paths/embedded-and-microcontrollers/avh_vio/vio.md @@ -1,6 +1,7 @@ --- # User change title: "Create a peripheral using Virtual Input/Output (VIO)" +description: Create a virtual LED peripheral with Arm Virtual Hardware VIO and connect it to firmware running on the simulated platform. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/aggregation.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/aggregation.md index f2e76d0435..6e3c422b20 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/aggregation.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/aggregation.md @@ -1,6 +1,7 @@ --- # User change title: "Sensor Data Aggregation Using Azure Functions" +description: Aggregate IoT telemetry with Azure Functions so sensor data from Arm devices can be summarized for downstream services. weight: 8 diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/device_registration.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/device_registration.md index b812331919..93f4421789 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/device_registration.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/device_registration.md @@ -1,6 +1,7 @@ --- # User change title: "Build a Python-based IoT telemetry simulator" +description: Build a Python telemetry simulator and register it as an Azure IoT device for sending sample sensor readings. weight: 4 diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/intro.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/intro.md index f4497199f1..300dc8252f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/intro.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/intro.md @@ -1,6 +1,7 @@ --- # User change title: "Overview" +description: Review the Azure IoT services and telemetry flow used to build an end-to-end cloud pipeline for Arm devices. weight: 2 diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/iot-hub.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/iot-hub.md index 2d052628c2..3ade6bc7b3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/iot-hub.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/iot-hub.md @@ -1,6 +1,7 @@ --- # User change title: "Create Azure IoT Hub" +description: Create an Azure IoT Hub and configure the device connection details needed for streaming telemetry from Arm devices. weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/monitoring.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/monitoring.md index 184ead66b3..2d4b2db26e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/monitoring.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/monitoring.md @@ -1,6 +1,7 @@ --- # User change title: "Set up data monitoring and alerts with Azure Functions" +description: Set up Azure Functions based monitoring and alerts so incoming IoT telemetry can trigger automated responses. weight: 7 diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/portal.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/portal.md index 26dc8215d3..760a6a4a3a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/portal.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/portal.md @@ -1,6 +1,7 @@ --- # User change title: "IoT Portal" +description: Create an IoT portal that visualizes telemetry from Azure services and gives users a dashboard for device data. weight: 9 diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md index 455cf82cef..1b1644aab1 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md @@ -1,6 +1,7 @@ --- # User change title: "Store data in Azure Cosmos DB with Azure Stream Analytics" +description: Store processed telemetry in Azure Cosmos DB by configuring an Azure Stream Analytics output for the IoT pipeline. weight: 6 diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics.md index a385a6e459..6ec29d69f1 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics.md @@ -1,6 +1,7 @@ --- # User change title: "Process IoT telemetry in real time with Azure Stream Analytics" +description: Configure Azure Stream Analytics to process IoT Hub telemetry in real time and route results to downstream services. weight: 5 diff --git a/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven1.md b/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven1.md index b54a88589a..004530e24a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven1.md +++ b/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven1.md @@ -1,6 +1,7 @@ --- # User change title: Create event-driven application (1) +description: Configure exception routing and the first interrupt handling pieces for an event-driven bare-metal Armv8-A application. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven2.md b/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven2.md index f79cd565d3..3da6cc054d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven2.md +++ b/content/learning-paths/embedded-and-microcontrollers/bare-metal/event-driven2.md @@ -1,6 +1,7 @@ --- # User change title: Create event-driven application (2) +description: Set up the Generic Interrupt Controller and complete the event-driven Armv8-A application on the FVP. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/bare-metal/exception-levels.md b/content/learning-paths/embedded-and-microcontrollers/bare-metal/exception-levels.md index 6e84efabed..04038ddcb4 100644 --- a/content/learning-paths/embedded-and-microcontrollers/bare-metal/exception-levels.md +++ b/content/learning-paths/embedded-and-microcontrollers/bare-metal/exception-levels.md @@ -1,6 +1,7 @@ --- # User change title: Switching Exception Levels +description: Modify the bare-metal example to switch Armv8-A exception levels and observe how execution changes on the FVP. weight: 7 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/bare-metal/hello.md b/content/learning-paths/embedded-and-microcontrollers/bare-metal/hello.md index ddd5b4bc95..c664289e35 100644 --- a/content/learning-paths/embedded-and-microcontrollers/bare-metal/hello.md +++ b/content/learning-paths/embedded-and-microcontrollers/bare-metal/hello.md @@ -1,6 +1,7 @@ --- # User change title: Create and build a Hello World example project +description: Create and build a bare-metal Hello World project with Arm tools and run it on an Arm Fixed Virtual Platform. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/bare-metal/reset.md b/content/learning-paths/embedded-and-microcontrollers/bare-metal/reset.md index 5c7067e942..f4f376b1d1 100644 --- a/content/learning-paths/embedded-and-microcontrollers/bare-metal/reset.md +++ b/content/learning-paths/embedded-and-microcontrollers/bare-metal/reset.md @@ -1,6 +1,7 @@ --- # User change title: Write a reset handler +description: Write the reset handler for the bare-metal Armv8-A example so execution reaches the application entry point correctly. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/bare-metal/retarget.md b/content/learning-paths/embedded-and-microcontrollers/bare-metal/retarget.md index a180c1d2ca..3b58989be9 100644 --- a/content/learning-paths/embedded-and-microcontrollers/bare-metal/retarget.md +++ b/content/learning-paths/embedded-and-microcontrollers/bare-metal/retarget.md @@ -1,6 +1,7 @@ --- # User change title: "Modify the example to use the UART for printf output" +description: Retarget printf output to the UART so the bare-metal Armv8-A application can print messages from the FVP. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/avh-setup.md b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/avh-setup.md index 8f1141285b..0e3d129d70 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/avh-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/avh-setup.md @@ -1,5 +1,6 @@ --- title: AVH device setup +description: Set up the i.MX 8M Plus model in Arm Virtual Hardware for testing hybrid edge application deployment. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/build-runtime.md b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/build-runtime.md index c394a0c509..9a492e006f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/build-runtime.md +++ b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/build-runtime.md @@ -1,5 +1,6 @@ --- title: Building the hybrid-runtime and container image (optional) +description: Build the hybrid-runtime and firmware container image used to run Cortex-M workloads from a Cortex-A Linux environment. weight: 7 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/containerd.md b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/containerd.md index edf26062a1..a6702452db 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/containerd.md +++ b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/containerd.md @@ -1,5 +1,6 @@ --- title: Deploy firmware container using `containerd` +description: Deploy a firmware container with containerd and verify a Hello World workload on the hybrid edge runtime. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/k3s.md b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/k3s.md index 18e3b0f3c2..3f283cd9ef 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/k3s.md +++ b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/k3s.md @@ -1,5 +1,6 @@ --- title: Deploy SMARTER Demo using K3s +description: Deploy the SMARTER demo with K3s on Arm Virtual Hardware and verify container orchestration for the hybrid edge system. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/motivation.md b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/motivation.md index 694bdc736c..fc9fa98e62 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/motivation.md +++ b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/motivation.md @@ -1,5 +1,6 @@ --- title: Motivation +description: Understand why hybrid-runtime enables cloud-native deployment of embedded workloads across Cortex-A and Cortex-M cores. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/runtime-overview.md b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/runtime-overview.md index 75776dd8f3..5712b5ef20 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/runtime-overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/cloud-native-deployment-on-hybrid-edge-systems/runtime-overview.md @@ -1,5 +1,6 @@ --- title: Hybrid container runtime +description: Review the hybrid container runtime architecture and how it maps firmware containers to Arm edge hardware. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/build_and_run.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/build_and_run.md index 8f6b946842..0f6fa5ee08 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/build_and_run.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/build_and_run.md @@ -1,6 +1,7 @@ --- # User change title: "Build and run the application" +description: Build and run the CMSIS-RTOS2 RTX application in Keil MDK and verify the thread behavior on the target. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/create.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/create.md index d89912b054..b95edcf145 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/create.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/create.md @@ -1,6 +1,7 @@ --- # User change title: "Create and setup Keil MDK project" +description: Create a Keil MDK project, install CMSIS packs, and configure the components needed for an RTX5 application. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/eventrecorder.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/eventrecorder.md index 10075d2ca0..791a6c2b41 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/eventrecorder.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/eventrecorder.md @@ -1,6 +1,7 @@ --- # User change title: "Using Event Recorder" +description: Enable Event Recorder for the RTX5 application so thread scheduling and runtime behavior can be inspected during debug. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/initialize.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/initialize.md index 2cdb6f52a7..7e20042236 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/initialize.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/initialize.md @@ -1,6 +1,7 @@ --- # User change title: "Initialize the operating system" +description: Initialize the CMSIS-RTOS2 kernel in the example application and start the main RTOS entry point. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/threads.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/threads.md index 108e3aa12b..bd2879287b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/threads.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx/threads.md @@ -1,6 +1,7 @@ --- # User change title: "Create RTOS threads" +description: Create RTX5 threads with CMSIS-RTOS2 APIs and coordinate them in the embedded example application. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/build_and_run.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/build_and_run.md index 5747edb3f9..c6976008ad 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/build_and_run.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/build_and_run.md @@ -1,6 +1,7 @@ --- # User change title: "Build and run the application" +description: Build and run the CMSIS-RTOS2 RTX application from Keil Studio for VS Code and verify the generated firmware. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/create.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/create.md index 67a29a6b48..0a544b5b61 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/create.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/create.md @@ -1,6 +1,7 @@ --- # User change title: "Create csolution project" +description: Create a csolution project in Keil Studio for VS Code and configure CMSIS components for an RTX5 application. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/initialize.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/initialize.md index 041c7fbb01..6659f7c6e3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/initialize.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/initialize.md @@ -1,6 +1,7 @@ --- # User change title: "Initialize the Operating System" +description: Initialize the CMSIS-RTOS2 kernel in the Keil Studio project and prepare the application startup code. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/threads.md b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/threads.md index 4138c2b068..40c3a81d52 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/threads.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsis_rtx_vs/threads.md @@ -1,6 +1,7 @@ --- # User change title: "Create RTOS Threads" +description: Add RTX5 threads to the Keil Studio project using CMSIS-RTOS2 APIs and verify the multitasking flow. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-1.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-1.md index 7bffd2a23f..bef9ac3ee2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-1.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-1.md @@ -1,5 +1,6 @@ --- title: CMSIS-DSP Python package +description: Install and explore the CMSIS-DSP Python package so you can prototype signal processing algorithms before porting to C. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-2.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-2.md index 118b85c81c..6210006571 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-2.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-2.md @@ -1,5 +1,6 @@ --- title: Set up environment +description: Create the Python environment and install the packages needed to develop and test CMSIS-DSP signal processing code. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-3.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-3.md index b83f0d6c66..ab5bca4c05 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-3.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-3.md @@ -1,5 +1,6 @@ --- title: Load an audio file +description: Load and inspect an audio file in Python so it can be used as input for the CMSIS-DSP voice activity workflow. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-4.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-4.md index 824d40fe1b..25d5031520 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-4.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-4.md @@ -1,5 +1,6 @@ --- title: Write a simple VAD +description: Implement a simple voice activity detector in Python and validate the signal processing behavior before optimization. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-5.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-5.md index 3fe9f5be65..e862af3162 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-5.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-5.md @@ -1,5 +1,6 @@ --- title: Write a noise suppression algorithm +description: Build a noise suppression algorithm in Python and understand the math that prepares it for embedded DSP implementation. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-6.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-6.md index f963a4eb73..10ac331ba2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-6.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-6.md @@ -1,5 +1,6 @@ --- title: Write the CMSIS-DSP Q15 implementation +description: Implement the voice activity detector with CMSIS-DSP Q15 functions and compare it with the Python prototype. weight: 7 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-7.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-7.md index 7fca5f38ab..7b0bdfe82a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-7.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-7.md @@ -1,5 +1,6 @@ --- title: Convert the CMSIS-DSP Python to C +description: Convert the CMSIS-DSP Python prototype to C so the algorithm can run efficiently on Arm embedded targets. weight: 8 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-8.md b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-8.md index fb229f1dd2..9050c091fe 100644 --- a/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-8.md +++ b/content/learning-paths/embedded-and-microcontrollers/cmsisdsp-dev-with-python/how-to-8.md @@ -1,5 +1,6 @@ --- title: Develop your knowledge +description: Explore additional CMSIS-DSP resources and example projects to continue developing embedded signal processing skills. weight: 9 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/context-switch-cortex-m/example.md b/content/learning-paths/embedded-and-microcontrollers/context-switch-cortex-m/example.md index 331ea20510..15736b233a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/context-switch-cortex-m/example.md +++ b/content/learning-paths/embedded-and-microcontrollers/context-switch-cortex-m/example.md @@ -1,6 +1,7 @@ --- # User change title: Example Arm DS project to demonstrate context switching operations +description: Explore the Arm Development Studio example project that demonstrates Cortex-M context switching with the MPU and SysTick exception. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/cc.md b/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/cc.md index b94697e44c..c75d640369 100644 --- a/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/cc.md +++ b/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/cc.md @@ -1,6 +1,7 @@ --- # User change title: "What is Code Coverage?" +description: Understand code coverage concepts for embedded software testing and how they apply to Keil MDK projects. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/mdk.md b/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/mdk.md index 9828e41e7d..679f5b9263 100644 --- a/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/mdk.md +++ b/content/learning-paths/embedded-and-microcontrollers/coverage_mdk/mdk.md @@ -1,6 +1,7 @@ --- # User change title: "Set up Code Coverage" +description: Enable code coverage in Keil MDK, run the embedded example, and review the coverage results from the FVP. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/_index.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/_index.md index 22bf1be008..ad6fe29e87 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/_index.md @@ -1,5 +1,6 @@ --- title: Device-to-Device communication with Device Connect +description: Learn how to connect simulated edge devices directly with Device Connect and build a sensor-to-monitor workflow without cloud infrastructure. minutes_to_complete: 25 diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/background.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/background.md index c0f303ba31..28f6102dd4 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/background.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/background.md @@ -1,5 +1,6 @@ --- title: Why device-to-device at the edge +description: Understand when device-to-device communication is useful at the edge and how Device Connect supports local device workflows. weight: 2 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/d2d-setup.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/d2d-setup.md index d75400f68f..b0c9069c71 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/d2d-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/d2d-setup.md @@ -1,5 +1,6 @@ --- title: Set up D2D communication between a sensor and a monitor +description: Set up Device Connect for a simulated sensor and monitor so the devices can discover each other and exchange data locally. weight: 4 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/overview.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/overview.md index b86e614699..83c0a1845e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-d2d/overview.md @@ -1,5 +1,6 @@ --- title: Device Connect developer model +description: Review the Device Connect Edge SDK developer model and how capabilities, devices, and applications interact. weight: 3 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-server/background.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-server/background.md index ef2cc8c3e5..16381b7569 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-server/background.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-server/background.md @@ -1,5 +1,6 @@ --- title: Learn when to use Device Connect server for multi-network deployments +description: Understand when Device Connect server is useful for multi-network edge deployments and how it extends device-to-device workflows. weight: 2 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-server/server-setup.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-server/server-setup.md index 88a8340668..527e055697 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-server/server-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-server/server-setup.md @@ -1,5 +1,6 @@ --- title: Run devices and an orchestrating agent on a Device Connect server +description: Provision Device Connect server credentials, run example devices, and connect an orchestrating agent across networks. weight: 3 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/background.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/background.md index 5d17d94e41..cdf98bcf62 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/background.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/background.md @@ -1,5 +1,6 @@ --- title: Learn Device Connect and Strands architecture for edge devices +description: Review the Device Connect and Strands architecture that lets AI agents discover and control edge devices. weight: 2 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-example.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-example.md index 85908694f3..6170af890c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-example.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-example.md @@ -1,5 +1,6 @@ --- title: Run device discovery and agent control examples +description: Run local Device Connect examples that demonstrate device discovery and agent control with simulated edge devices. weight: 4 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-infra-example.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-infra-example.md index 4bc0f8ea70..9239a18c5a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-infra-example.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/run-infra-example.md @@ -1,5 +1,6 @@ --- title: Run with full Device Connect infrastructure (optional) +description: Run the optional Device Connect infrastructure example to connect agents and devices through shared services. weight: 5 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/setup.md b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/setup.md index 6e9c4f9eec..97769ce850 100644 --- a/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/device-connect-strands/setup.md @@ -1,5 +1,6 @@ --- title: Set up the Device Connect and Strands developer environment +description: Install the tools and dependencies needed to run Device Connect and Strands examples for edge device orchestration. weight: 3 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/docker/dockerfile.md b/content/learning-paths/embedded-and-microcontrollers/docker/dockerfile.md index ee5f8cb2f6..3a2aff79ea 100644 --- a/content/learning-paths/embedded-and-microcontrollers/docker/dockerfile.md +++ b/content/learning-paths/embedded-and-microcontrollers/docker/dockerfile.md @@ -1,6 +1,7 @@ --- # User change title: "Create Dockerfile and build docker image" +description: Create a Dockerfile for Arm Compiler for Embedded and FVP tools, build the image, and test the containerized workflow. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/edge/connect-and-set-up-arduino.md b/content/learning-paths/embedded-and-microcontrollers/edge/connect-and-set-up-arduino.md index 1ccc697c5c..122f2b14cb 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge/connect-and-set-up-arduino.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge/connect-and-set-up-arduino.md @@ -1,5 +1,6 @@ --- title: Board connection and IDE setup +description: Connect the Arduino Nano RP2040 board and configure the Arduino IDE so it is ready for TinyML deployment. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge/overview.md b/content/learning-paths/embedded-and-microcontrollers/edge/overview.md index eba2464dc5..287053f21f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge/overview.md @@ -1,5 +1,6 @@ --- title: Overview +description: Review the Edge AI workflow for collecting audio data, training a model, and deploying it to an Arm microcontroller board. weight: 2 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge/program-and-deployment.md b/content/learning-paths/embedded-and-microcontrollers/edge/program-and-deployment.md index a69435988d..e11bb8314f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge/program-and-deployment.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge/program-and-deployment.md @@ -1,5 +1,6 @@ --- title: Program your first TinyML device +description: Flash the TinyML firmware to the Arduino Nano RP2040 and verify that voice commands control the LEDs. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge/software-edge-impulse.md b/content/learning-paths/embedded-and-microcontrollers/edge/software-edge-impulse.md index 64e7fe52b7..165c327ab9 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge/software-edge-impulse.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge/software-edge-impulse.md @@ -1,5 +1,6 @@ --- title: Train and deploy a TinyML audio classifier with Edge Impulse +description: Use Edge Impulse to collect audio samples, train a TinyML classifier, and generate deployment code for the board. weight: 3 # FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/cleanup.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/cleanup.md index 0d935b2a47..68a5933e91 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/cleanup.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/cleanup.md @@ -1,5 +1,6 @@ --- title: Clean up AWS resources +description: Remove AWS IoT Greengrass and related cloud resources created for the Edge Impulse deployment when the project is complete. weight: 11 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/customcomponentdeployment.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/customcomponentdeployment.md index 2cd7745e59..73f32ea86e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/customcomponentdeployment.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/customcomponentdeployment.md @@ -1,5 +1,6 @@ --- title: Deploy the component to your edge device +description: Deploy the Edge Impulse Greengrass component to the selected Arm edge device and confirm the component is running. weight: 8 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulsecustomcomponentinstall.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulsecustomcomponentinstall.md index ba9625d5bc..eb62bd18d1 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulsecustomcomponentinstall.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulsecustomcomponentinstall.md @@ -1,5 +1,6 @@ --- title: Create the Edge Impulse Greengrass component +description: Create the AWS IoT Greengrass custom component that installs and runs the Edge Impulse model on the edge device. weight: 7 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulseprojectbuild.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulseprojectbuild.md index dd2d64aad6..216eb5377e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulseprojectbuild.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/edgeimpulseprojectbuild.md @@ -1,5 +1,6 @@ --- title: Set up your Edge Impulse project +description: Create an Edge Impulse project, train the model, and prepare the deployment artifacts for AWS IoT Greengrass. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/greengrassinstallation.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/greengrassinstallation.md index d3c37cbff9..70a7058b98 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/greengrassinstallation.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/greengrassinstallation.md @@ -1,5 +1,6 @@ --- title: Install AWS IoT Greengrass +description: Install AWS IoT Greengrass on the Arm edge device and configure the credentials needed for component deployment. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetup.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetup.md index 459e2eee05..a0632c34b9 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetup.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetup.md @@ -1,5 +1,6 @@ --- title: Select and set up your edge device +description: Choose an Arm edge platform and complete the hardware setup required for the Edge Impulse Greengrass workflow. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupec2.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupec2.md index b00941a1df..bc5b56f14a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupec2.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupec2.md @@ -1,5 +1,6 @@ --- hide_from_navpane: true +description: Launch an Ubuntu AWS EC2 Arm instance and install the dependencies needed to simulate an Edge Impulse Greengrass device. ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupnvidiajetson.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupnvidiajetson.md index 4a94766dc9..54494c0871 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupnvidiajetson.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupnvidiajetson.md @@ -1,5 +1,6 @@ --- hide_from_navpane: true +description: Prepare an Nvidia Jetson device with JetPack and the dependencies required for Edge Impulse and AWS IoT Greengrass. ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupqc6490ubuntu.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupqc6490ubuntu.md index 640393f580..1fb3ebb149 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupqc6490ubuntu.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetupqc6490ubuntu.md @@ -1,5 +1,6 @@ --- hide_from_navpane: true +description: Set up a Qualcomm Dragonwing QC6490 board with Ubuntu and install the packages needed for Edge Impulse Greengrass. ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetuprpi5.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetuprpi5.md index 096adfa461..55b1aaf922 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetuprpi5.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/hardwaresetuprpi5.md @@ -1,5 +1,6 @@ --- hide_from_navpane: true +description: Configure a Raspberry Pi 5 with Raspberry Pi OS and install the dependencies needed for Edge Impulse Greengrass deployment. ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/noncameracustomcomponent.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/noncameracustomcomponent.md index fcc24a2f4c..1966ceeb07 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/noncameracustomcomponent.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/noncameracustomcomponent.md @@ -1,5 +1,6 @@ --- hide_from_navpane: true +description: Create a non-camera Greengrass component that provides sample images to the Edge Impulse runner on devices without cameras. ### FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/overview.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/overview.md index 0d7dea64e6..e1ec9a3920 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/overview.md @@ -1,5 +1,6 @@ --- title: Overview of Edge Impulse and AWS IoT Greengrass +description: Understand how Edge Impulse models are packaged as AWS IoT Greengrass components for deployment to Arm-based edge devices. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/running.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/running.md index 3316c505e4..8231549016 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/running.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/running.md @@ -1,5 +1,6 @@ --- title: Verify inference and view results +description: Verify that the deployed Edge Impulse model runs on the edge device and view live inference results in the browser. weight: 9 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/secretmanagersetup.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/secretmanagersetup.md index 2d715f9148..dd8ddf897b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/secretmanagersetup.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/secretmanagersetup.md @@ -1,5 +1,6 @@ --- title: Store your API key in AWS Secrets Manager +description: Store the Edge Impulse API key in AWS Secrets Manager so Greengrass components can access it securely. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/summary.md b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/summary.md index 4dd3cf25ca..c1846f025f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/summary.md +++ b/content/learning-paths/embedded-and-microcontrollers/edge_impulse_greengrass/summary.md @@ -1,5 +1,6 @@ --- title: Command and metrics reference +description: Review the commands, metrics, and configuration values used throughout the Edge Impulse Greengrass deployment. weight: 10 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/build_nn.md b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/build_nn.md index 8296e75c8d..4bb4d2bdfb 100644 --- a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/build_nn.md +++ b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/build_nn.md @@ -1,6 +1,7 @@ --- # User change title: Build an image classification NN model trained with the CIFAR-10 dataset +description: Train an image classification model with the CIFAR-10 dataset and prepare it for deployment with STM32 tools. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/deploy_nn.md b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/deploy_nn.md index d740e10fa1..d1131ba245 100644 --- a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/deploy_nn.md +++ b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/deploy_nn.md @@ -1,6 +1,7 @@ --- # User change title: Deploy the image classification NN model on STM32 +description: Import the trained image classification model into STM32CubeMX and generate code for the STM32 board. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/run_nn.md b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/run_nn.md index 75d94ac8c8..cec4f2ef55 100644 --- a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/run_nn.md +++ b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/run_nn.md @@ -1,6 +1,7 @@ --- # User change title: Run the image classification NN model on STM32 +description: Run the image classification model on the STM32 development board and verify inference results from the deployed firmware. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/setup.md b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/setup.md index b647cdd890..80dd33ee66 100644 --- a/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/img_nn_stcube/setup.md @@ -1,6 +1,7 @@ --- # User change title: Prepare environment +description: Install Anaconda and the required Python packages for building and deploying the STM32 image classification model. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/intro/background.md b/content/learning-paths/embedded-and-microcontrollers/intro/background.md index 3797d7b7ec..8b36cdaa86 100644 --- a/content/learning-paths/embedded-and-microcontrollers/intro/background.md +++ b/content/learning-paths/embedded-and-microcontrollers/intro/background.md @@ -1,6 +1,7 @@ --- layout: learningpathall title: Arm in Microcontrollers +description: Understand how Arm Cortex-M processors are used in microcontrollers and where they fit in embedded system design. weight: 2 --- diff --git a/content/learning-paths/embedded-and-microcontrollers/intro/find-hardware.md b/content/learning-paths/embedded-and-microcontrollers/intro/find-hardware.md index 6cb08bf4fb..2adaab8575 100644 --- a/content/learning-paths/embedded-and-microcontrollers/intro/find-hardware.md +++ b/content/learning-paths/embedded-and-microcontrollers/intro/find-hardware.md @@ -1,6 +1,7 @@ --- layout: learningpathall title: Find Arm hardware +description: Identify Arm-based microcontroller development boards and choose hardware for embedded software projects. weight: 3 --- diff --git a/content/learning-paths/embedded-and-microcontrollers/intro/resources.md b/content/learning-paths/embedded-and-microcontrollers/intro/resources.md index 603b11e864..35aa6bfc97 100644 --- a/content/learning-paths/embedded-and-microcontrollers/intro/resources.md +++ b/content/learning-paths/embedded-and-microcontrollers/intro/resources.md @@ -1,6 +1,7 @@ --- layout: learningpathall title: Other learning resources +description: Find additional Arm microcontroller documentation, courses, and examples to continue embedded software learning. weight: 4 --- ## Reading resources diff --git a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/1-overview.md b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/1-overview.md index 2fa725c9fe..9e505ded4d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/1-overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/1-overview.md @@ -1,5 +1,6 @@ --- title: Overview +description: Review TinyML concepts, Arm-based edge devices, and the ExecuTorch workflow used in the rest of the Learning Path. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/2-env-setup.md b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/2-env-setup.md index 0c24e883ad..ea1a5d3f7d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/2-env-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/2-env-setup.md @@ -1,6 +1,7 @@ --- # User change title: "Install ExecuTorch" +description: Install ExecuTorch and its dependencies so you can convert and run PyTorch models for TinyML on Arm targets. weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/3-env-setup-fvp.md b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/3-env-setup-fvp.md index 61786ed292..70ed054d00 100644 --- a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/3-env-setup-fvp.md +++ b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/3-env-setup-fvp.md @@ -1,6 +1,7 @@ --- # User change title: "Set up the Corstone-320 FVP" +description: Install and configure the Corstone-320 Fixed Virtual Platform for running TinyML examples without physical hardware. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/4-build-model.md b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/4-build-model.md index a976b0063a..377d40697c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/4-build-model.md +++ b/content/learning-paths/embedded-and-microcontrollers/introduction-to-tinyml-on-arm/4-build-model.md @@ -1,6 +1,7 @@ --- # User change title: "Build a simple PyTorch model" +description: Build a small PyTorch model and prepare it for ExecuTorch deployment on the Corstone-320 FVP. weight: 7 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/iot-sdk/aws.md b/content/learning-paths/embedded-and-microcontrollers/iot-sdk/aws.md index 882bc9c1e6..cd6233348b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/iot-sdk/aws.md +++ b/content/learning-paths/embedded-and-microcontrollers/iot-sdk/aws.md @@ -1,6 +1,7 @@ --- # User change title: Enable AWS connectivity +description: Enable AWS connectivity in the Open-IoT-SDK example so the application can communicate with AWS IoT services. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/iot-sdk/openiot.md b/content/learning-paths/embedded-and-microcontrollers/iot-sdk/openiot.md index 02f2289988..8f7204b6ea 100644 --- a/content/learning-paths/embedded-and-microcontrollers/iot-sdk/openiot.md +++ b/content/learning-paths/embedded-and-microcontrollers/iot-sdk/openiot.md @@ -1,6 +1,7 @@ --- # User change title: Build and run Open-IoT-SDK examples +description: Build Open-IoT-SDK examples and run them on Arm Virtual Hardware to validate the IoT software stack. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/2setup.md b/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/2setup.md index 4a57b23819..d9980ff787 100644 --- a/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/2setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/2setup.md @@ -1,5 +1,6 @@ --- title: Set up your Jetson Orin Nano +description: Prepare the Jetson Orin Nano hardware, camera, and software environment for image classification and object detection. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/3docker.md b/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/3docker.md index 5ce88fdc4e..58da1c3e81 100644 --- a/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/3docker.md +++ b/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/3docker.md @@ -1,5 +1,6 @@ --- title: Launch the image classification Docker container +description: Download and run the image classification Docker container on Jetson Orin Nano to test the accelerated inference setup. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/4object.md b/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/4object.md index 4821299360..60237bfddd 100644 --- a/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/4object.md +++ b/content/learning-paths/embedded-and-microcontrollers/jetson_object_detection/4object.md @@ -1,5 +1,6 @@ --- title: Detect objects in video and images +description: Run object detection on images and live video with Jetson Orin Nano and verify DetectNet output. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/keilstudiocloud/2build.md b/content/learning-paths/embedded-and-microcontrollers/keilstudiocloud/2build.md index 2feedd8109..9c29ff1f07 100644 --- a/content/learning-paths/embedded-and-microcontrollers/keilstudiocloud/2build.md +++ b/content/learning-paths/embedded-and-microcontrollers/keilstudiocloud/2build.md @@ -1,6 +1,7 @@ --- # User change title: "Work with an example project" +description: Import an example project into Keil Studio Cloud, build it, and run a basic debug session in the browser. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/1-overview.md b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/1-overview.md index 8a80672d89..0de840d990 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/1-overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/1-overview.md @@ -1,5 +1,6 @@ --- title: Set up the board +description: Boot and inspect the NXP FRDM i.MX 93 board so it is ready for Linux-based ML development on Arm. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/3-create-super-user.md b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/3-create-super-user.md index f3f352dcf1..9a58e47c92 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/3-create-super-user.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/3-create-super-user.md @@ -1,6 +1,7 @@ --- # User change title: "Set up a Linux user and connect to WiFi" +description: Create a non-root Linux user with sudo access and configure WiFi connectivity on the NXP FRDM i.MX 93 board. weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/4-enable-wifi.md b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/4-enable-wifi.md index ff190d822b..8161215e44 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/4-enable-wifi.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/4-enable-wifi.md @@ -1,6 +1,7 @@ --- # User change title: "Transfer files to the board" +description: Transfer files to the NXP FRDM i.MX 93 board over the network using WiFi and secure copy. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/7-enable-persistent-wifi.md b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/7-enable-persistent-wifi.md index 98aee667d1..0a44c1cd0a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/7-enable-persistent-wifi.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-nxp-board/7-enable-persistent-wifi.md @@ -1,6 +1,7 @@ --- # User change title: "(Optional) Enable Persistent WiFi" +description: Configure persistent WiFi on the NXP FRDM i.MX 93 board so networking reconnects after reboot. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/debug.md b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/debug.md index 485052e3e7..4974324418 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/debug.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/debug.md @@ -1,5 +1,6 @@ --- title: Debug the software stack +description: Use Arm Development Studio to debug Trusted Firmware-A and the Linux kernel while the software stack runs on an FVP. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/intro.md b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/intro.md index e9590f5331..b79942e7c4 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/intro.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/intro.md @@ -1,5 +1,6 @@ --- title: Introduction to Arm Fixed Virtual Platforms (FVPs) +description: Understand Arm Fixed Virtual Platforms and how they support Linux software development before hardware is available. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/modify.md b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/modify.md index 74c2557e78..389c4da53b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/modify.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/modify.md @@ -1,5 +1,6 @@ --- title: Modify the device tree for CPU FVPs +description: Update the device tree so the Linux software stack matches the selected Arm CPU FVP model. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/run.md b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/run.md index 12945e535a..43e9a9f9c3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/run.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/run.md @@ -1,5 +1,6 @@ --- title: Run the Linux software stack on an FVP +description: Launch the Linux software stack on an Arm FVP and verify that the virtual platform boots successfully. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/steps.md b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/steps.md index c7f2e46a82..d29ab178ad 100644 --- a/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/steps.md +++ b/content/learning-paths/embedded-and-microcontrollers/linux-on-fvp/steps.md @@ -1,5 +1,6 @@ --- title: Configure Trusted Firmware-A build flags to include cpu_ops support +description: Configure Trusted Firmware-A build flags for cpu_ops support and rebuild the Linux software stack for the FVP. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/llama-python-cpu/llama-python-chatbot.md b/content/learning-paths/embedded-and-microcontrollers/llama-python-cpu/llama-python-chatbot.md index 5ed148deb5..aa72e49f03 100644 --- a/content/learning-paths/embedded-and-microcontrollers/llama-python-cpu/llama-python-chatbot.md +++ b/content/learning-paths/embedded-and-microcontrollers/llama-python-cpu/llama-python-chatbot.md @@ -1,5 +1,6 @@ --- title: Run a Large Language Model (LLM) chatbot on a Raspberry Pi 5 +description: Install llama.cpp Python bindings on Raspberry Pi 5, download an LLM, and run an interactive chatbot locally. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/migration/2_porting_methodology.md b/content/learning-paths/embedded-and-microcontrollers/migration/2_porting_methodology.md index dfabe1322c..1fb08a8f5c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/migration/2_porting_methodology.md +++ b/content/learning-paths/embedded-and-microcontrollers/migration/2_porting_methodology.md @@ -1,6 +1,7 @@ --- # User change title: "Porting methodology" +description: Apply a structured porting methodology for moving Linux applications from x86_64 to Arm AArch64. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/migration/3_porting_analysis.md b/content/learning-paths/embedded-and-microcontrollers/migration/3_porting_analysis.md index 79206f0f00..c8a0f650ec 100644 --- a/content/learning-paths/embedded-and-microcontrollers/migration/3_porting_analysis.md +++ b/content/learning-paths/embedded-and-microcontrollers/migration/3_porting_analysis.md @@ -1,6 +1,7 @@ --- # User change title: "Porting analysis" +description: Analyze source code, dependencies, and build settings to identify issues before porting an application to Arm. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/migration/4_development_environment.md b/content/learning-paths/embedded-and-microcontrollers/migration/4_development_environment.md index 16aeab6e45..c04bd8fc05 100644 --- a/content/learning-paths/embedded-and-microcontrollers/migration/4_development_environment.md +++ b/content/learning-paths/embedded-and-microcontrollers/migration/4_development_environment.md @@ -1,6 +1,7 @@ --- # User change title: "Development environment" +description: Set up the compilers, libraries, and tools needed to build and test the application on Arm Linux. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/migration/5_application_porting.md b/content/learning-paths/embedded-and-microcontrollers/migration/5_application_porting.md index 7200521aca..73edb95f0f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/migration/5_application_porting.md +++ b/content/learning-paths/embedded-and-microcontrollers/migration/5_application_porting.md @@ -1,6 +1,7 @@ --- # User change title: "Application porting" +description: Port application code to Arm by addressing architecture assumptions, compiler intrinsics, and build configuration differences. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/migration/6_run_evaluate.md b/content/learning-paths/embedded-and-microcontrollers/migration/6_run_evaluate.md index 256a3ea14c..dc12260923 100644 --- a/content/learning-paths/embedded-and-microcontrollers/migration/6_run_evaluate.md +++ b/content/learning-paths/embedded-and-microcontrollers/migration/6_run_evaluate.md @@ -1,6 +1,7 @@ --- # User change title: "Run and evaluate" +description: Run the ported application on Arm, evaluate behavior and performance, and compare results with the original environment. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/migration/7_alternative.md b/content/learning-paths/embedded-and-microcontrollers/migration/7_alternative.md index c0b37255ff..f14bcda03b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/migration/7_alternative.md +++ b/content/learning-paths/embedded-and-microcontrollers/migration/7_alternative.md @@ -1,6 +1,7 @@ --- # User change title: "Evaluating performance on Arm hardware (Optional)" +description: Optionally evaluate the ported workload on Arm hardware and use the results to guide further optimization. weight: 7 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/mlek/build.md b/content/learning-paths/embedded-and-microcontrollers/mlek/build.md index 4c82e28353..598a2bc69f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/mlek/build.md +++ b/content/learning-paths/embedded-and-microcontrollers/mlek/build.md @@ -1,6 +1,7 @@ --- # User change title: "Build the ML Evaluation Kit examples" +description: Build ML Evaluation Kit examples for the selected target so they are ready to run on Arm virtual hardware. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/mlek/fvp.md b/content/learning-paths/embedded-and-microcontrollers/mlek/fvp.md index 49b5557445..97a20851e8 100644 --- a/content/learning-paths/embedded-and-microcontrollers/mlek/fvp.md +++ b/content/learning-paths/embedded-and-microcontrollers/mlek/fvp.md @@ -1,6 +1,7 @@ --- # User change title: "Install Arm Ecosystem FVP" +description: Install the Arm Ecosystem FVP and configure it as the execution target for ML Evaluation Kit examples. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/mlek/run.md b/content/learning-paths/embedded-and-microcontrollers/mlek/run.md index a0f20db865..2e6d037859 100644 --- a/content/learning-paths/embedded-and-microcontrollers/mlek/run.md +++ b/content/learning-paths/embedded-and-microcontrollers/mlek/run.md @@ -1,6 +1,7 @@ --- # User change title: "Run the examples on the FVP" +description: Run ML Evaluation Kit examples on the Arm Ecosystem FVP and inspect the model output. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/nav-mlek/intro.md b/content/learning-paths/embedded-and-microcontrollers/nav-mlek/intro.md index 46e4eb6405..d0137e874f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/nav-mlek/intro.md +++ b/content/learning-paths/embedded-and-microcontrollers/nav-mlek/intro.md @@ -1,5 +1,6 @@ --- title: Overview +description: Review ML Evaluation Kit concepts and the Arm hardware options available for embedded machine learning development. weight: 2 diff --git a/content/learning-paths/embedded-and-microcontrollers/nav-mlek/platforms.md b/content/learning-paths/embedded-and-microcontrollers/nav-mlek/platforms.md index 740086950b..f2d4074a0c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/nav-mlek/platforms.md +++ b/content/learning-paths/embedded-and-microcontrollers/nav-mlek/platforms.md @@ -1,5 +1,6 @@ --- title: Development platforms +description: Compare physical boards and virtual platforms for developing Cortex-M and Ethos-U machine learning applications. weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/nav-mlek/sw.md b/content/learning-paths/embedded-and-microcontrollers/nav-mlek/sw.md index 7529fc45dc..fb335d1a3c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/nav-mlek/sw.md +++ b/content/learning-paths/embedded-and-microcontrollers/nav-mlek/sw.md @@ -1,5 +1,6 @@ --- title: Software development considerations +description: Review software development tools, model formats, and example applications used with the ML Evaluation Kit. weight: 4 diff --git a/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/dstream.md b/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/dstream.md index 5985a8b994..326c18913e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/dstream.md +++ b/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/dstream.md @@ -1,6 +1,7 @@ --- # User change title: Debug connection with Arm DSTREAM +description: Create an Arm Development Studio debug connection for a hardware target using a DSTREAM debug probe. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/fastmodels.md b/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/fastmodels.md index a0c5b4a9c1..1c84a0b3db 100644 --- a/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/fastmodels.md +++ b/content/learning-paths/embedded-and-microcontrollers/new_debug_targets_armds/fastmodels.md @@ -1,6 +1,7 @@ --- # User change title: Debug connection to Arm Fast Models +description: Create an Arm Development Studio debug connection for Arm Fast Models and verify the virtual target setup. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/1-overview.md b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/1-overview.md index 0e87ef1f6f..4dd2df7f70 100644 --- a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/1-overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/1-overview.md @@ -1,5 +1,6 @@ --- title: Understand ExecuTorch deployment on NXP with Ethos-U +description: Understand the ExecuTorch and Ethos-U deployment flow used to run accelerated inference on the NXP FRDM i.MX 93 board. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/10-deploy-executorchrunner-nxp-board.md b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/10-deploy-executorchrunner-nxp-board.md index da44cc3a28..e28fccf585 100644 --- a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/10-deploy-executorchrunner-nxp-board.md +++ b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/10-deploy-executorchrunner-nxp-board.md @@ -1,5 +1,6 @@ --- title: Deploy and test on FRDM-IMX93 +description: Deploy the ExecuTorch runner to the NXP FRDM i.MX 93 board and test inference on the Cortex-M33 with Ethos-U acceleration. weight: 11 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/2-boot-nxp.md b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/2-boot-nxp.md index dd5ba0d52f..aa205b399e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/2-boot-nxp.md +++ b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/2-boot-nxp.md @@ -1,6 +1,7 @@ --- # User change title: "Boot the NXP FRDM i.MX 93 board" +description: Connect to the NXP FRDM i.MX 93 board, boot Linux, and verify the board is ready for ExecuTorch deployment. weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/4-environment-setup.md b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/4-environment-setup.md index 2ff692e783..b1105e8f2e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/4-environment-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/4-environment-setup.md @@ -1,6 +1,7 @@ --- # User change title: "Set up the ExecuTorch build environment" +description: Set up the ExecuTorch build environment for the NXP workflow using Docker or a native Linux host. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/6-build-executorch.md b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/6-build-executorch.md index dd20c9a86e..d72ad39312 100644 --- a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/6-build-executorch.md +++ b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/6-build-executorch.md @@ -1,6 +1,7 @@ --- # User change title: "Build and install ExecuTorch" +description: Build and install ExecuTorch components needed to generate and run models for the NXP FRDM i.MX 93 target. weight: 7 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte.md b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte.md index 0802662121..d7a56b2e52 100644 --- a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte.md +++ b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte.md @@ -1,6 +1,7 @@ --- # User change title: "Build ExecuTorch models for Ethos-U65" +description: Compile ExecuTorch model artifacts for Ethos-U65 so they can run with NPU acceleration on the NXP board. weight: 8 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/9-build-executorch-runner-for-cm33.md b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/9-build-executorch-runner-for-cm33.md index 961e90eecc..fab8b1bf90 100644 --- a/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/9-build-executorch-runner-for-cm33.md +++ b/content/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/9-build-executorch-runner-for-cm33.md @@ -1,5 +1,6 @@ --- title: Build Cortex-M33 firmware for ExecuTorch +description: Build Cortex-M33 firmware that runs the ExecuTorch executor runner on the NXP FRDM i.MX 93 board. weight: 10 # FIXED, DO NOT MODIFY layout: learningpathall diff --git a/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/device_support.md b/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/device_support.md index 118a7a5825..bd99514d7a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/device_support.md +++ b/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/device_support.md @@ -1,5 +1,6 @@ --- title: Device support +description: Review CMSIS-Pack device support changes needed when migrating device packs from CMSIS v5 to CMSIS v6. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/example_projects.md b/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/example_projects.md index 89c30cb6de..51db1e59e8 100644 --- a/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/example_projects.md +++ b/content/learning-paths/embedded-and-microcontrollers/pack-migration-cmsis-v6/example_projects.md @@ -1,5 +1,6 @@ --- title: Example projects +description: Update CMSIS-Pack example projects so they remain compatible after migrating the pack to CMSIS v6. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/adding-new-schemes.md b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/adding-new-schemes.md index 92ac583f02..5d73b5af04 100644 --- a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/adding-new-schemes.md +++ b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/adding-new-schemes.md @@ -1,5 +1,6 @@ --- title: Add a KEM implementation to pqm4 +description: Add a new key encapsulation mechanism implementation to pqm4 and integrate it with the Cortex-M4 benchmark framework. weight: 5 diff --git a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/introduction.md b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/introduction.md index 32b25a228a..7c56597606 100644 --- a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/introduction.md +++ b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/introduction.md @@ -1,5 +1,6 @@ --- title: Understand pqm4 and post-quantum cryptography +description: Understand pqm4, post-quantum cryptography, and how the library benchmarks algorithms on Arm Cortex-M4. weight: 2 layout: learningpathall --- diff --git a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/running-tests-and-benchmarks.md b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/running-tests-and-benchmarks.md index 3b74c46bb5..736c657d6f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/running-tests-and-benchmarks.md +++ b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/running-tests-and-benchmarks.md @@ -1,5 +1,6 @@ --- title: Run pqm4 tests and benchmarks +description: Build and run pqm4 tests and benchmarks to measure post-quantum cryptography implementations on Cortex-M4. weight: 4 diff --git a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/setup-installation.md b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/setup-installation.md index e483c86dd2..a0d5a5d3ab 100644 --- a/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/setup-installation.md +++ b/content/learning-paths/embedded-and-microcontrollers/pqc_pqm4/setup-installation.md @@ -1,5 +1,6 @@ --- title: Set up the pqm4 development environment +description: Install the dependencies and toolchains needed to build and test pqm4 post-quantum cryptography examples. weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/device_mapping.md b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/device_mapping.md index c6d8331c18..e1cd913972 100644 --- a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/device_mapping.md +++ b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/device_mapping.md @@ -1,5 +1,6 @@ --- title: Device mapping +description: Map legacy device identifiers to CMSIS v6 device definitions so migrated projects select the correct target. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/packs.md b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/packs.md index 09c6a0d310..d53172c041 100644 --- a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/packs.md +++ b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/packs.md @@ -1,5 +1,6 @@ --- title: Required CMSIS-Packs +description: Identify and install the CMSIS-Packs required to migrate a CMSIS v5 project to CMSIS v6. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/project_format.md b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/project_format.md index 1f62c5c4ba..0de6ffc072 100644 --- a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/project_format.md +++ b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/project_format.md @@ -1,5 +1,6 @@ --- title: Project format conversion +description: Convert a legacy CMSIS project format to the CMSIS v6 csolution structure used by modern tools. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/toolchains.md b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/toolchains.md index c4e28e5b27..1ef19eb9a3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/toolchains.md +++ b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/toolchains.md @@ -1,5 +1,6 @@ --- title: Supported toolchains +description: Review supported toolchains for CMSIS v6 project migration and select the compiler configuration for the target. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/troubleshooting.md b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/troubleshooting.md index 42a5277aa4..4e42231d79 100644 --- a/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/troubleshooting.md +++ b/content/learning-paths/embedded-and-microcontrollers/project-migration-cmsis-v6/troubleshooting.md @@ -1,5 +1,6 @@ --- title: Troubleshooting +description: Resolve common CMSIS v6 migration issues related to packs, devices, project format, and toolchain settings. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/1-overview.md b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/1-overview.md index befde3ff4f..5eb775aaac 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/1-overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/1-overview.md @@ -1,5 +1,6 @@ --- title: Run LLMs locally on Raspberry Pi 5 for Edge AI +description: Review the Raspberry Pi 5 smart home architecture and how local LLMs can control GPIO-connected devices. weight: 2 diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/2-software-dependencies.md b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/2-software-dependencies.md index a054f233f3..4e88b10360 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/2-software-dependencies.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/2-software-dependencies.md @@ -1,5 +1,6 @@ --- title: Set up software dependencies on Raspberry Pi 5 for Ollama and LLMs +description: Install Ollama, Python dependencies, and supporting software for running local LLM smart home workloads on Raspberry Pi 5. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/3-test-gpio.md b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/3-test-gpio.md index e94b73229a..15f0b7fe7a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/3-test-gpio.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/3-test-gpio.md @@ -1,5 +1,6 @@ --- title: Test Raspberry Pi 5 GPIO pins for smart home devices +description: Test Raspberry Pi 5 GPIO outputs with connected devices so the smart home assistant can control hardware reliably. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/4-smart-home-assistant.md b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/4-smart-home-assistant.md index 45c88a4d11..2f3e5986d9 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/4-smart-home-assistant.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry-pi-smart-home/4-smart-home-assistant.md @@ -1,5 +1,6 @@ --- title: Build and Run a Smart Home Assistant on Raspberry Pi 5 with LLMs +description: Build and run the web-based Raspberry Pi 5 smart home assistant that uses a local LLM to control GPIO devices. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/2setup.md b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/2setup.md index 5798237d9f..bed940b0ec 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/2setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/2setup.md @@ -1,5 +1,6 @@ --- title: Initial setup +description: Install Raspberry Pi OS and configure the packages needed to build the voice-controlled ChatGPT bot. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/3audio.md b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/3audio.md index 076b2d918a..827abb3c5b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/3audio.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/3audio.md @@ -1,5 +1,6 @@ --- title: Configure and test audio +description: Configure and test the Raspberry Pi microphone and speakers so the bot can capture speech and play responses. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/4python-code.md b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/4python-code.md index f2cc8e6b90..42beb0cd2b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/4python-code.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/4python-code.md @@ -1,5 +1,6 @@ --- title: Create the Python application +description: Create the Python application that detects a wake word, sends speech input to ChatGPT, and plays audio output. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/5run.md b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/5run.md index f74bd12274..e4630536b9 100644 --- a/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/5run.md +++ b/content/learning-paths/embedded-and-microcontrollers/raspberry_pi_chatgpt_bot/5run.md @@ -1,5 +1,6 @@ --- title: Run and test the bot +description: Run the Raspberry Pi ChatGPT bot and test the complete voice interaction workflow. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/dev-env.md b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/dev-env.md index 3b8c9023bb..d1c3a54055 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/dev-env.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/dev-env.md @@ -1,5 +1,6 @@ --- title: Set up the development environment +description: Set up an Arm Linux development machine with the tools required to build Llama 3 for ExecuTorch. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/executorch.md b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/executorch.md index d0fe999c43..b4b65fd689 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/executorch.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/executorch.md @@ -1,5 +1,6 @@ --- title: Set up ExecuTorch +description: Install and configure ExecuTorch so the Llama 3 model can be compiled for Raspberry Pi 5. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/llama3.md b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/llama3.md index 714ec069d3..a9935b3cb4 100755 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/llama3.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/llama3.md @@ -1,5 +1,6 @@ --- title: Set up Llama 3 +description: Download and prepare the Llama 3 model assets needed for the ExecuTorch deployment workflow. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/run.md b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/run.md index 1e1ee80ff6..610b9bd5a6 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/run.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-llama3/run.md @@ -1,5 +1,6 @@ --- title: Run the model on a Raspberry Pi 5 +description: Deploy the compiled Llama 3 model to Raspberry Pi 5 and run local inference on the device. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi/docker.md b/content/learning-paths/embedded-and-microcontrollers/rpi/docker.md index ebe55166e5..f61c87f880 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi/docker.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi/docker.md @@ -1,6 +1,7 @@ --- # User change title: "Docker" +description: Install Docker on Raspberry Pi 4 and run a containerized workload to validate the Arm Linux environment. weight: 7 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi/id.md b/content/learning-paths/embedded-and-microcontrollers/rpi/id.md index 8cfd9ea26d..fae99338ea 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi/id.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi/id.md @@ -1,6 +1,7 @@ --- # User change title: "Identifying the hardware" +description: Identify Raspberry Pi 4 hardware details and system information before running software and performance examples. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi/intro.md b/content/learning-paths/embedded-and-microcontrollers/rpi/intro.md index 38155a67b3..842a64156a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi/intro.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi/intro.md @@ -1,6 +1,7 @@ --- # User change title: "Introduction to the Raspberry Pi 4" +description: Review Raspberry Pi 4 hardware specifications and setup considerations for Arm software development. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi/kernel.md b/content/learning-paths/embedded-and-microcontrollers/rpi/kernel.md index 0faa7d008f..3c1480286f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi/kernel.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi/kernel.md @@ -1,6 +1,7 @@ --- # User change title: "Linux Kernel Compile" +description: Compile the Linux kernel for Raspberry Pi 4 and compare build behavior with an Arm cloud instance. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi/perf.md b/content/learning-paths/embedded-and-microcontrollers/rpi/perf.md index 9260c128f0..ede1963ce5 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi/perf.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi/perf.md @@ -1,6 +1,7 @@ --- # User change title: "Linux Perf" +description: Use Linux perf on Raspberry Pi 4 to collect performance data from Arm workloads. weight: 8 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi/setup.md b/content/learning-paths/embedded-and-microcontrollers/rpi/setup.md index b23e846416..2713e6019f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi/setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi/setup.md @@ -1,6 +1,7 @@ --- # User change title: "Setup a Raspberry Pi 4 and an Arm cloud instance" +description: Set up Raspberry Pi 4 and an Arm cloud instance so you can compare local and remote Arm development workflows. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi/tf.md b/content/learning-paths/embedded-and-microcontrollers/rpi/tf.md index 217f338c4e..5f53249f21 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi/tf.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi/tf.md @@ -1,6 +1,7 @@ --- # User change title: "TensorFlow" +description: Install and run TensorFlow on Raspberry Pi 4 to test machine learning workloads on Arm hardware. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/debug.md b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/debug.md index 83054784b1..2b1e209b3e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/debug.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/debug.md @@ -1,6 +1,7 @@ --- # User change title: "How do I debug RPi Pico applications?" +description: Connect debug wiring for Raspberry Pi Pico applications and use the debugger to inspect firmware execution. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/hello.md b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/hello.md index 8f3adc610d..4b928aee6f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/hello.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/hello.md @@ -1,6 +1,7 @@ --- # User change title: "How do I run Hello World for Raspberry Pi Pico?" +description: Build and run the Hello World example for Raspberry Pi Pico to verify the SDK and board setup. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/perf.md b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/perf.md index b810ba37b6..478787810c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/perf.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/perf.md @@ -1,6 +1,7 @@ --- # User change title: "How do I measure RPi Pico Application Performance?" +description: Build a Raspberry Pi Pico application and measure its execution performance on the microcontroller. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/sdk.md b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/sdk.md index 74190adb42..ad680c831a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi_pico/sdk.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi_pico/sdk.md @@ -1,6 +1,7 @@ --- # User change title: "How do I install the Raspberry Pi Pico SDK?" +description: Install the Raspberry Pi Pico SDK and configure the tools needed to build Pico applications. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/1_overview.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/1_overview.md index bbca4dc735..ae7f81651e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/1_overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/1_overview.md @@ -1,5 +1,6 @@ --- title: Profile Linux kernel modules with Arm Streamline +description: Review the Arm Streamline kernel module profiling workflow and the Linux targets used for performance analysis. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/2_build_kernel_image.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/2_build_kernel_image.md index bfde6c9ffe..04988ae6ff 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/2_build_kernel_image.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/2_build_kernel_image.md @@ -1,5 +1,6 @@ --- title: Set up your environment +description: Build a Linux image with Buildroot so the target environment can run kernel module profiling examples. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/3_oot_module.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/3_oot_module.md index 9bfc522b7c..d60884e189 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/3_oot_module.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/3_oot_module.md @@ -1,5 +1,6 @@ --- title: Build the out-of-tree kernel module +description: Create and build an out-of-tree Linux kernel module designed to expose cache-unfriendly behavior for Streamline analysis. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/4_sl_profile_oot.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/4_sl_profile_oot.md index e5ff493910..54afad166d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/4_sl_profile_oot.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/4_sl_profile_oot.md @@ -1,5 +1,6 @@ --- title: Profile the out-of-tree kernel module +description: Profile the out-of-tree kernel module with Arm Streamline and inspect the performance bottlenecks it exposes. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/5_intree_kernel_driver.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/5_intree_kernel_driver.md index 3d33f88175..9d2daaea06 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/5_intree_kernel_driver.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/5_intree_kernel_driver.md @@ -1,5 +1,6 @@ --- title: Integrate a custom character device driver into the Linux kernel +description: Integrate a custom character device driver into the Linux kernel so it can be profiled as an in-tree module. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/6_sl_profile_intree.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/6_sl_profile_intree.md index e4f50c5330..03091fd2ae 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/6_sl_profile_intree.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/6_sl_profile_intree.md @@ -1,5 +1,6 @@ --- title: Profile the in-tree kernel driver +description: Profile the in-tree kernel driver with Arm Streamline and compare results with the out-of-tree module workflow. weight: 7 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/7_sl_spe.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/7_sl_spe.md index f1897f2381..42b38d4b76 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/7_sl_spe.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/7_sl_spe.md @@ -1,5 +1,6 @@ --- title: Use Streamline with the Statistical Profiling Extension +description: Use Arm Streamline with Statistical Profiling Extension data to analyze Linux workload behavior in more detail. weight: 8 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/8_summary.md b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/8_summary.md index 6436995b80..bcb6059086 100644 --- a/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/8_summary.md +++ b/content/learning-paths/embedded-and-microcontrollers/streamline-kernel-module/8_summary.md @@ -1,5 +1,6 @@ --- title: Summary +description: Summarize the kernel module profiling workflow and the Streamline techniques used to analyze Linux drivers. weight: 9 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/features.md b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/features.md index 25023fc47d..a558fb2e34 100644 --- a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/features.md +++ b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/features.md @@ -1,6 +1,7 @@ --- # User change title: Feature extraction +description: Extract features from captured training data so the TensorFlow model can learn the letter recognition task. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/run_nn.md b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/run_nn.md index ace948f192..2f15cecc5a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/run_nn.md +++ b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/run_nn.md @@ -1,6 +1,7 @@ --- # User change title: Run the model on development board +description: Deploy the trained TensorFlow model to the STM32 development board and run inference from the generated firmware. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/setup.md b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/setup.md index 0e84c2b6bf..7f7809eb3d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/setup.md @@ -1,6 +1,7 @@ --- # User change title: Prepare development environment +description: Install Anaconda and prepare the Python environment for training and deploying the STM32 TensorFlow model. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/test.md b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/test.md index dc7751d42b..0aab5f115d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/test.md +++ b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/test.md @@ -1,6 +1,7 @@ --- # User change title: Train the model +description: Create and train the TensorFlow model used for letter recognition before deploying it to the STM32 board. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/train_nn.md b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/train_nn.md index 17942e6cbc..5b4fb1b521 100644 --- a/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/train_nn.md +++ b/content/learning-paths/embedded-and-microcontrollers/tflow_nn_stcube/train_nn.md @@ -1,6 +1,7 @@ --- # User change title: Collect training data +description: Collect training data for the letter recognition model and prepare it for TensorFlow feature extraction. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/tfm/tfm.md b/content/learning-paths/embedded-and-microcontrollers/tfm/tfm.md index af9be250c5..0e67a433e1 100644 --- a/content/learning-paths/embedded-and-microcontrollers/tfm/tfm.md +++ b/content/learning-paths/embedded-and-microcontrollers/tfm/tfm.md @@ -1,6 +1,7 @@ --- # User change title: "Build and run TF-M tests and example application" +description: Build and run Trusted Firmware-M tests and the reference application on an Arm Fixed Virtual Platform. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/env-setup-1.md b/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/env-setup-1.md index 415cf50697..b000281a42 100644 --- a/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/env-setup-1.md +++ b/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/env-setup-1.md @@ -1,5 +1,6 @@ --- title: Set up your environment +description: Install the tools and Python dependencies needed to train and deploy the tiny rock-paper-scissors model on Arm. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fine-tune-2.md b/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fine-tune-2.md index e4fa83ecee..16ad300e62 100644 --- a/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fine-tune-2.md +++ b/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fine-tune-2.md @@ -1,5 +1,6 @@ --- title: Train and Test the rock-paper-scissors Model +description: Train and test the PyTorch rock-paper-scissors classifier before converting it for embedded inference. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fvp-3.md b/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fvp-3.md index 53983fca76..8a05e97421 100644 --- a/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fvp-3.md +++ b/content/learning-paths/embedded-and-microcontrollers/training-inference-pytorch/fvp-3.md @@ -1,5 +1,6 @@ --- title: Run the model on Corstone-320 FVP +description: Compile the rock-paper-scissors model for ExecuTorch and run it on the Corstone-320 Fixed Virtual Platform. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/hello.md b/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/hello.md index a16a61939c..cae6f88b28 100644 --- a/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/hello.md +++ b/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/hello.md @@ -1,6 +1,7 @@ --- # User change title: "Run TrustZone Hello World example" +description: Build and run the TrustZone Hello World example on the NXP LPCXpresso55S69 board with Keil MDK. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/trustzone_concepts.md b/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/trustzone_concepts.md index 091c6983a7..87ac86eaad 100644 --- a/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/trustzone_concepts.md +++ b/content/learning-paths/embedded-and-microcontrollers/trustzone_nxp_lpc/trustzone_concepts.md @@ -1,6 +1,7 @@ --- # User change title: "Breaking down the application" +description: Understand the secure and non-secure application flow used by the TrustZone example on the NXP board. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/bay-assembly.md b/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/bay-assembly.md index 914a424ba7..7e6db91f2c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/bay-assembly.md +++ b/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/bay-assembly.md @@ -1,6 +1,7 @@ --- # User change title: Assembly Instructions for the Chassis Bays +description: Assemble the 3D-printed chassis bays used to mount single board computers in the universal SBC rack system. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/card-plate-assembly.md b/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/card-plate-assembly.md index 4c996df002..96e0f5eb8e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/card-plate-assembly.md +++ b/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/card-plate-assembly.md @@ -1,6 +1,7 @@ --- # User change title: Assembly Instructions for the Chassis Bays +description: Assemble the card plates that hold single board computers within the universal SBC chassis. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/print-parts.md b/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/print-parts.md index c658152768..66ed2b9d35 100644 --- a/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/print-parts.md +++ b/content/learning-paths/embedded-and-microcontrollers/universal-sbc-chassis/print-parts.md @@ -1,6 +1,7 @@ --- # User change title: Print the Required Parts +description: Print the required 3D parts for the universal SBC chassis and prepare them for assembly. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/uv_debug/2_basics.md b/content/learning-paths/embedded-and-microcontrollers/uv_debug/2_basics.md index f9a74bab3f..09763f606d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uv_debug/2_basics.md +++ b/content/learning-paths/embedded-and-microcontrollers/uv_debug/2_basics.md @@ -1,6 +1,7 @@ --- # User change title: "Use basic run/stop debug" +description: Use basic run and stop debugging in Keil uVision to inspect an embedded application on the target. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/uv_debug/3_event_recorder.md b/content/learning-paths/embedded-and-microcontrollers/uv_debug/3_event_recorder.md index 6b8e79f862..7d27be3a8d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uv_debug/3_event_recorder.md +++ b/content/learning-paths/embedded-and-microcontrollers/uv_debug/3_event_recorder.md @@ -1,6 +1,7 @@ --- # User change title: "Debug using Event Recorder" +description: Use Event Recorder in Keil uVision to capture and analyze runtime events from an embedded application. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/uv_debug/4_swv.md b/content/learning-paths/embedded-and-microcontrollers/uv_debug/4_swv.md index 2ff24068d4..fb9ccc55de 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uv_debug/4_swv.md +++ b/content/learning-paths/embedded-and-microcontrollers/uv_debug/4_swv.md @@ -1,6 +1,7 @@ --- # User change title: "Debug using Serial Wire Viewer" +description: Use Serial Wire Viewer in Keil uVision to observe trace data from a running Cortex-M application. weight: 4 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/uv_debug/5_etm_trace.md b/content/learning-paths/embedded-and-microcontrollers/uv_debug/5_etm_trace.md index 9d72d6f034..87807faa84 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uv_debug/5_etm_trace.md +++ b/content/learning-paths/embedded-and-microcontrollers/uv_debug/5_etm_trace.md @@ -1,6 +1,7 @@ --- # User change title: "Advanced debug with ETM trace" +description: Use ETM trace in Keil uVision to capture instruction flow and analyze advanced debug behavior. weight: 5 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/uv_debug/6_power_ulplus.md b/content/learning-paths/embedded-and-microcontrollers/uv_debug/6_power_ulplus.md index 1f4257471e..0d6b93c293 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uv_debug/6_power_ulplus.md +++ b/content/learning-paths/embedded-and-microcontrollers/uv_debug/6_power_ulplus.md @@ -1,6 +1,7 @@ --- # User change title: "Measure Power with ULINKplus" +description: Measure target power with ULINKplus in Keil uVision and correlate energy use with firmware execution. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-1.md b/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-1.md index 81f531cdee..c6081f885b 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-1.md +++ b/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-1.md @@ -1,5 +1,6 @@ --- title: Using Keil Studio +description: Convert a uVision project to csolution format in Keil Studio and build it with CMSIS-Toolbox. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-2.md b/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-2.md index f608c39e50..e46a94dfda 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-2.md +++ b/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-2.md @@ -1,5 +1,6 @@ --- title: Using the command line +description: Convert a uVision project to csolution format from the command line and verify the CMSIS-Toolbox build. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-mdk.md b/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-mdk.md index 629c04ec96..01d82b6777 100644 --- a/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-mdk.md +++ b/content/learning-paths/embedded-and-microcontrollers/uvprojx-conversion/how-to-mdk.md @@ -1,5 +1,6 @@ --- title: Using µVision +description: Convert a uVision project inside Keil MDK and prepare it for CMSIS-Toolbox based workflows. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/config_creation.md b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/config_creation.md index 5efa5b2a27..a63815ec19 100644 --- a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/config_creation.md +++ b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/config_creation.md @@ -1,5 +1,6 @@ --- title: Create a vcpkg-configuration.json file +description: Create a vcpkg-configuration.json file that defines tool sources and versions for reproducible embedded development. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/initialization.md b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/initialization.md index 1f86275470..3a45f2258c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/initialization.md +++ b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/initialization.md @@ -1,5 +1,6 @@ --- title: Initialize vcpkg +description: Initialize vcpkg in the project so command-line tools can be installed from the configured registries. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/installation.md b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/installation.md index e84eab3ff6..ca2290f43a 100644 --- a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/installation.md +++ b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/installation.md @@ -1,5 +1,6 @@ --- title: Install vcpkg +description: Install vcpkg and verify the command-line setup used for managing Arm development tools. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/licenseactivation.md b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/licenseactivation.md index 2162faef99..619d2ca642 100644 --- a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/licenseactivation.md +++ b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/licenseactivation.md @@ -1,5 +1,6 @@ --- title: Activate a license +description: Activate tool licenses through vcpkg so installed Arm command-line tools are ready for use. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/removal.md b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/removal.md index 62722d8a28..c93997300e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/removal.md +++ b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/removal.md @@ -1,5 +1,6 @@ --- title: Remove vcpkg +description: Remove vcpkg-managed tools and configuration when you need to reset the local tool installation. weight: 7 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/usage.md b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/usage.md index 37e5a6e8aa..5d3e3b6d60 100644 --- a/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/usage.md +++ b/content/learning-paths/embedded-and-microcontrollers/vcpkg-tool-installation/usage.md @@ -1,5 +1,6 @@ --- title: Use vcpkg +description: Use vcpkg commands to install, list, and manage versioned tools for an embedded development workflow. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-overview.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-overview.md index b087e70934..7cdae77bd8 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/2-overview.md @@ -1,5 +1,6 @@ --- title: Overview +description: Review the TinyML performance visualization workflow for deploying ExecuTorch models on Corstone-320 virtual hardware. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-executorch-workflow.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-executorch-workflow.md index 4862f6cc9d..da151371df 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-executorch-workflow.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/3-executorch-workflow.md @@ -1,6 +1,7 @@ --- # User change title: "Understand the ExecuTorch workflow" +description: Understand the ExecuTorch conversion and runtime flow used to deploy neural network models to Arm targets. weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-env-setup-execut.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-env-setup-execut.md index 598f785873..65ea826bc2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-env-setup-execut.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/4-env-setup-execut.md @@ -1,6 +1,7 @@ --- # User change title: "Set up your ExecuTorch environment" +description: Install ExecuTorch and prepare the Python environment needed for model conversion and deployment. weight: 4 diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-env-setup-fvp.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-env-setup-fvp.md index 1208f92761..0735aa71a4 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-env-setup-fvp.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/5-env-setup-fvp.md @@ -1,6 +1,7 @@ --- # User change title: "Set up the Corstone-320 Fixed Virtual Platform" +description: Install and configure the Corstone-320 Fixed Virtual Platform for running and visualizing TinyML models. weight: 5 diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-run-model.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-run-model.md index cc6b3d8e17..6fd82bb1b9 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-run-model.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/6-run-model.md @@ -1,6 +1,7 @@ --- # User change title: "Deploy and run Mobilenet V2 on the Corstone-320 FVP" +description: Deploy MobileNet V2 with ExecuTorch on the Corstone-320 FVP and verify model execution. weight: 6 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/7-configure-fvp-gui.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/7-configure-fvp-gui.md index 257198342c..5e852faf85 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/7-configure-fvp-gui.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/7-configure-fvp-gui.md @@ -1,6 +1,7 @@ --- # User change title: "Enable GUI and deploy a model on Corstone-320 FVP" +description: Enable the Corstone-320 FVP graphical interface so you can visualize model execution while inference runs. weight: 7 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/8-evaluate-output.md b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/8-evaluate-output.md index 1034282f82..ebda9ae7c3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/8-evaluate-output.md +++ b/content/learning-paths/embedded-and-microcontrollers/visualizing-ethos-u-performance/8-evaluate-output.md @@ -1,6 +1,7 @@ --- # User change title: "Evaluate Ethos-U Performance" +description: Interpret Ethos-U performance output from the FVP and use the results to understand model behavior. weight: 8 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/yocto_qemu/yocto_build.md b/content/learning-paths/embedded-and-microcontrollers/yocto_qemu/yocto_build.md index 8fe1a8777a..1f173b9207 100644 --- a/content/learning-paths/embedded-and-microcontrollers/yocto_qemu/yocto_build.md +++ b/content/learning-paths/embedded-and-microcontrollers/yocto_qemu/yocto_build.md @@ -1,6 +1,7 @@ --- # User change title: "How do I get started with Yocto Linux on Qemu?" +description: Build a minimal Yocto Linux image for a 64-bit Arm QEMU target and boot it in the emulator. weight: 3 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/build-firmware.md b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/build-firmware.md index 6745db9bc9..1c20a0386d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/build-firmware.md +++ b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/build-firmware.md @@ -1,5 +1,6 @@ --- title: Build the firmware +description: Build the Himax firmware that runs the YOLO object detection model on the WiseEye2 microcontroller module. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/dev-env.md b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/dev-env.md index 348b8eb84f..3fe98fb579 100644 --- a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/dev-env.md +++ b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/dev-env.md @@ -1,5 +1,6 @@ --- title: Set up the environment +description: Install the software tools and SDK dependencies required to build YOLO firmware for the Himax WiseEye2 module. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/flash-and-run.md b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/flash-and-run.md index ac03163972..6d101004b4 100644 --- a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/flash-and-run.md +++ b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/flash-and-run.md @@ -1,5 +1,6 @@ --- title: Flash firmware onto the microcontroller +description: Flash YOLO firmware to the Himax WiseEye2 module and verify object detection on the microcontroller. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/overview.md b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/overview.md index 41435620a5..fc55c27b54 100644 --- a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/overview.md @@ -1,5 +1,6 @@ --- title: Overview +description: Review the Himax WiseEye2 module and the YOLO object detection workflow before building and flashing firmware. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/web-toolkit.md b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/web-toolkit.md index 63ad577719..6fee29695e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/web-toolkit.md +++ b/content/learning-paths/embedded-and-microcontrollers/yolo-on-himax/web-toolkit.md @@ -1,5 +1,6 @@ --- title: Run additional models in the web toolkit +description: Modify the Himax web toolkit build settings and run additional models on the Grove Vision AI module. weight: 6 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr/zephyr.md b/content/learning-paths/embedded-and-microcontrollers/zephyr/zephyr.md index 3ab574ce6b..089d0f658e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr/zephyr.md +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr/zephyr.md @@ -1,6 +1,7 @@ --- # User change title: "Build and run Zephyr applications" +description: Build and run Zephyr RTOS applications on the Corstone-300 FVP using Arm Virtual Hardware. weight: 2 # 1 is first, 2 is second, etc. diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/1_installation.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/1_installation.md index a4ac9f182c..3c11d6660c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/1_installation.md +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/1_installation.md @@ -1,5 +1,6 @@ --- title: Set up the Workbench for Zephyr development environment +description: Install Workbench for Zephyr in VS Code and configure the tools needed for Arm Cortex-M Zephyr development. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/2_development.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/2_development.md index 6be1d64510..9f925ba77c 100644 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/2_development.md +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/2_development.md @@ -1,5 +1,6 @@ --- title: Build a Zephyr application with Workbench for Zephyr +description: Create and build a Zephyr application with Workbench for Zephyr and prepare it for a supported development board. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/3_debug.md b/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/3_debug.md index 2a6541734b..f095759c1d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/3_debug.md +++ b/content/learning-paths/embedded-and-microcontrollers/zephyr_vsworkbench/3_debug.md @@ -1,5 +1,6 @@ --- title: Analyze and debug a Zephyr application +description: Debug a Zephyr application with Workbench for Zephyr and inspect firmware behavior using integrated analysis tools. weight: 4 ### FIXED, DO NOT MODIFY From 1730f4cc8f5c72f0301c50ee3f940db2c06a2422 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 12:58:12 -0500 Subject: [PATCH 078/137] fixing metadata --- .../embedded-and-microcontrollers/rpi-mxnet/build.md | 3 +-- .../embedded-and-microcontrollers/rpi-mxnet/deploy.md | 2 +- .../embedded-and-microcontrollers/rpi-mxnet/setup.md | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md index 4f7f39a0d6..e9e0aac871 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md @@ -1,5 +1,4 @@ - --- -# User change +--- title: "Build MXNet" weight: 3 diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md index 11ad5f5d06..351a828aa2 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md @@ -1,4 +1,4 @@ - --- +--- # User change title: "Install on Raspberry Pi" diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md index d0a5eca09e..34e7951dd7 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md @@ -1,4 +1,4 @@ - --- +--- # User change title: "Install a Raspberry Pi OS file system" From 239c695eb25798674e3146e40f0dd55e21910ed7 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 12:59:41 -0500 Subject: [PATCH 079/137] adding descriptions to fixed mxnet metadata --- .../embedded-and-microcontrollers/rpi-mxnet/build.md | 2 +- .../embedded-and-microcontrollers/rpi-mxnet/deploy.md | 3 ++- .../embedded-and-microcontrollers/rpi-mxnet/setup.md | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md index e9e0aac871..1874a0f0bd 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/build.md @@ -1,5 +1,6 @@ --- title: "Build MXNet" +description: Build and install MXNet inside the Raspberry Pi OS file system on an Arm server, then verify the Python package before deployment. weight: 3 @@ -105,4 +106,3 @@ Building MXNet takes about 20 minutes on an AWS c6g.2xlarge EC2 instance. A native build on a Raspberry Pi 4 can be done using the steps above. Setting the number of jobs too high will result in out of memory failures. With `-j4` and the build fails, even on a Raspberry Pi with Gb RAM. With `-j1` the build completes, but takes over 6 hours. Continue to the next section to download the new image and install it on a Raspberry Pi for testing. - diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md index 351a828aa2..1f36953265 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/deploy.md @@ -1,6 +1,7 @@ --- # User change title: "Install on Raspberry Pi" +description: Copy the Raspberry Pi OS image with MXNet to a local machine, write it to an SD card, and verify MXNet on a Raspberry Pi. weight: 4 @@ -61,4 +62,4 @@ The expected output format is below. Your version may be slightly different. 2.0.0 ``` -You have significantly reduced MXNet compile time, transferred the result to an SD card, and confirmed MXNet can immediately run on a Raspberry Pi. \ No newline at end of file +You have significantly reduced MXNet compile time, transferred the result to an SD card, and confirmed MXNet can immediately run on a Raspberry Pi. diff --git a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md index 34e7951dd7..a861462ad8 100644 --- a/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/rpi-mxnet/setup.md @@ -1,6 +1,7 @@ --- # User change title: "Install a Raspberry Pi OS file system" +description: Prepare a Raspberry Pi OS image on an Arm Linux server by resizing, mounting, and entering the file system with chroot for an MXNet build. weight: 2 @@ -160,4 +161,3 @@ sudo chroot /mnt /bin/bash The bash shell is now inside the Raspberry Pi file system. It runs as if this is a Raspberry Pi and the file system is the same as if it was being done on a Raspberry Pi board. Continue to the next section to build MXNet, an example C++ application. - From a1f7134a36ff709b2ef3a6c5ef3dc0f7ed5febc4 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 14:02:53 -0500 Subject: [PATCH 080/137] nits --- .../alif-image-classification/aws-ec2-setup.md | 2 +- .../azure-iot/stream-analytics-dynamo-db.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md index c193376420..24935b3cab 100644 --- a/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md +++ b/content/learning-paths/embedded-and-microcontrollers/alif-image-classification/aws-ec2-setup.md @@ -1,6 +1,6 @@ --- title: Compile the model on an Arm cloud instance -description: Set up an Arm-based AWS EC2 instance to compile the neural network model used by the Alif Ensemble image classification firmware. +description: Set up an Arm-based Amazon EC2 instance to compile the neural network model used by the Alif Ensemble image classification firmware. weight: 3 layout: "learningpathall" diff --git a/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md b/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md index 1b1644aab1..58f42c8660 100644 --- a/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md +++ b/content/learning-paths/embedded-and-microcontrollers/azure-iot/stream-analytics-dynamo-db.md @@ -1,7 +1,7 @@ --- # User change title: "Store data in Azure Cosmos DB with Azure Stream Analytics" -description: Store processed telemetry in Azure Cosmos DB by configuring an Azure Stream Analytics output for the IoT pipeline. +description: Store processed telemetry in Azure Cosmos DB by configuring an Azure Stream Analytics job for the IoT pipeline. weight: 6 From 9899ab5bd5a286a3a8e99603e2fe794a40405950 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Mon, 22 Jun 2026 16:47:14 -0500 Subject: [PATCH 081/137] adding metadata descriptions to install guides --- content/install-guides/_index.md | 1 + content/install-guides/ambaviz.md | 1 + content/install-guides/ams.md | 1 + content/install-guides/ansible.md | 1 + content/install-guides/arduino-pico.md | 3 ++- content/install-guides/armds.md | 1 + content/install-guides/avh.md | 1 + content/install-guides/aws-cli.md | 1 + content/install-guides/aws-copilot.md | 3 ++- content/install-guides/aws-greengrass-v2.md | 3 ++- content/install-guides/aws-sam-cli.md | 2 +- content/install-guides/aws_access_keys.md | 1 + content/install-guides/azure-cli.md | 1 + content/install-guides/azure_login.md | 1 + content/install-guides/bedrust.md | 2 +- content/install-guides/browsers/_index.md | 2 +- content/install-guides/browsers/brave.md | 2 +- content/install-guides/browsers/chrome.md | 1 + content/install-guides/browsers/chromium.md | 2 +- content/install-guides/browsers/edge.md | 2 +- content/install-guides/browsers/firefox.md | 2 +- content/install-guides/browsers/vivaldi.md | 1 + content/install-guides/claude-code.md | 1 + content/install-guides/container.md | 1 + content/install-guides/cyclonedds.md | 3 ++- content/install-guides/dcperf.md | 1 + content/install-guides/docker/_index.md | 1 + content/install-guides/docker/docker-desktop-arm-linux.md | 1 + content/install-guides/docker/docker-desktop.md | 1 + content/install-guides/docker/docker-engine.md | 2 +- content/install-guides/dotnet.md | 1 + content/install-guides/finch.md | 1 + content/install-guides/fm_fvp/_index.md | 1 + content/install-guides/fm_fvp/eco_fvp.md | 1 + content/install-guides/fm_fvp/fm.md | 1 + content/install-guides/fm_fvp/fvp.md | 2 +- content/install-guides/fvps-on-macos.md | 1 + content/install-guides/gcc/_index.md | 1 + content/install-guides/gcc/cross.md | 1 + content/install-guides/gcc/native.md | 1 + content/install-guides/gcloud.md | 1 + content/install-guides/gemini.md | 1 + content/install-guides/gfortran.md | 1 + content/install-guides/git-woa.md | 1 + content/install-guides/github-copilot.md | 1 + content/install-guides/helm.md | 1 + content/install-guides/hyper-v.md | 1 + content/install-guides/ipexplorer.md | 1 + content/install-guides/java.md | 1 + content/install-guides/keilstudio_vs.md | 1 + content/install-guides/keilstudiocloud.md | 3 ++- content/install-guides/kiro-cli.md | 1 + content/install-guides/kubectl.md | 3 ++- content/install-guides/license/_index.md | 1 + content/install-guides/license/cloud.md | 1 + content/install-guides/license/flexnet.md | 1 + content/install-guides/license/ubl_license_admin.md | 1 + content/install-guides/license/ubl_license_enduser.md | 1 + content/install-guides/linux-migration-tools.md | 1 + content/install-guides/llvm-embedded.md | 3 ++- content/install-guides/llvm-woa.md | 1 + content/install-guides/mcuxpresso_vs.md | 2 +- content/install-guides/mdk.md | 1 + content/install-guides/multipass.md | 3 ++- content/install-guides/nerdctl.md | 1 + content/install-guides/nomachine.md | 3 ++- content/install-guides/oc.md | 1 + content/install-guides/oci-cli.md | 1 + content/install-guides/openvscode-server.md | 1 + content/install-guides/papi.md | 1 + content/install-guides/pdh/_index.md | 1 + content/install-guides/pdh/api.md | 1 + content/install-guides/pdh/browser.md | 1 + content/install-guides/perf.md | 1 + content/install-guides/performix.md | 1 + content/install-guides/porting-advisor.md | 2 +- content/install-guides/powershell.md | 3 ++- content/install-guides/pulumi.md | 1 + content/install-guides/py-woa.md | 1 + content/install-guides/pytorch-woa.md | 1 + content/install-guides/pytorch.md | 1 + content/install-guides/ros2.md | 1 + content/install-guides/rust.md | 1 + content/install-guides/rust_embedded.md | 1 + content/install-guides/sbt.md | 1 + content/install-guides/skopeo.md | 1 + content/install-guides/socrates.md | 2 +- content/install-guides/ssh.md | 3 ++- content/install-guides/stm32_vs.md | 1 + content/install-guides/streamline-cli.md | 2 +- content/install-guides/streamline.md | 1 + content/install-guides/successkits.md | 2 +- content/install-guides/swift.md | 2 +- content/install-guides/sysbox.md | 3 ++- content/install-guides/terraform.md | 1 + content/install-guides/tkn.md | 1 + content/install-guides/topdown-tool.md | 1 + content/install-guides/vnc.md | 1 + content/install-guides/vs-woa.md | 3 ++- content/install-guides/vscode-tunnels.md | 1 + content/install-guides/windows-perf-vs-extension.md | 1 + content/install-guides/windows-perf-wpa-plugin.md | 1 + content/install-guides/windows-sandbox-woa.md | 1 + content/install-guides/wperf.md | 1 + 104 files changed, 117 insertions(+), 28 deletions(-) diff --git a/content/install-guides/_index.md b/content/install-guides/_index.md index 8534712b95..31ca108b09 100644 --- a/content/install-guides/_index.md +++ b/content/install-guides/_index.md @@ -1,5 +1,6 @@ --- title: "Install Guides" +description: Browse install guides for Arm developer tools, cloud CLIs, compilers, containers, and platform setup across Arm Linux, Windows on Arm, and macOS. additional_search_terms: - compiler - ide diff --git a/content/install-guides/ambaviz.md b/content/install-guides/ambaviz.md index d4f76752f4..0e18141655 100644 --- a/content/install-guides/ambaviz.md +++ b/content/install-guides/ambaviz.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm AMBA Viz +description: Install Arm AMBA Viz from Arm Product Download Hub and set up the environment to visualize AMBA events for SoC verification workflows. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/ams.md b/content/install-guides/ams.md index f4cff56adc..6361ad2035 100644 --- a/content/install-guides/ams.md +++ b/content/install-guides/ams.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Performance Studio +description: Install Arm Performance Studio on Windows, macOS, or Linux to profile Android and Linux applications with Arm performance analysis tools. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/ansible.md b/content/install-guides/ansible.md index be6395f494..bce848986f 100644 --- a/content/install-guides/ansible.md +++ b/content/install-guides/ansible.md @@ -14,6 +14,7 @@ test_images: - ubuntu:latest test_link: null title: Ansible +description: Install Ansible command-line tools on Ubuntu for Arm or macOS so you can automate configuration and software deployment from Arm-based systems. tool_install: true weight: 1 --- diff --git a/content/install-guides/arduino-pico.md b/content/install-guides/arduino-pico.md index 5fe9633bde..b3dfa8abdc 100644 --- a/content/install-guides/arduino-pico.md +++ b/content/install-guides/arduino-pico.md @@ -1,5 +1,6 @@ --- title: Arduino core for the Raspberry Pi Pico +description: Install the Arduino IDE and Raspberry Pi Pico board support so you can build and upload Arduino sketches for RP2040-based boards. author: Michael Hall additional_search_terms: - arduino @@ -76,4 +77,4 @@ You should see the LED on your Raspberry Pi Pico blink on and off every second. If you have trouble uploading a sketch, unplug the board, press and hold the `BOOTSEL` button on the board, plug it in, and then release the button. {{% /notice %}} -You are ready to start writing your own Arduino sketches for Raspberry Pi Pico. \ No newline at end of file +You are ready to start writing your own Arduino sketches for Raspberry Pi Pico. diff --git a/content/install-guides/armds.md b/content/install-guides/armds.md index dd5f08b388..09f133efc1 100644 --- a/content/install-guides/armds.md +++ b/content/install-guides/armds.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Development Studio +description: Install Arm Development Studio on Windows or Linux and configure licensing for embedded C and C++ development, debug, and SoC validation. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/avh.md b/content/install-guides/avh.md index 521d76330a..3548a0d9a3 100644 --- a/content/install-guides/avh.md +++ b/content/install-guides/avh.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Virtual Hardware +description: Access Arm Virtual Hardware Corstone and third-party platforms so you can develop and test embedded software without physical hardware. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/aws-cli.md b/content/install-guides/aws-cli.md index 81a5b8e98a..42cf85171f 100644 --- a/content/install-guides/aws-cli.md +++ b/content/install-guides/aws-cli.md @@ -14,6 +14,7 @@ test_images: - ubuntu:latest test_maintenance: true title: AWS CLI +description: Install AWS CLI version 2 on Ubuntu for Arm and verify the setup so you can manage AWS services from the command line. tool_install: true weight: 1 --- diff --git a/content/install-guides/aws-copilot.md b/content/install-guides/aws-copilot.md index 60d7f5b1bc..aec277593c 100644 --- a/content/install-guides/aws-copilot.md +++ b/content/install-guides/aws-copilot.md @@ -14,6 +14,7 @@ test_images: - ubuntu:latest test_maintenance: true title: AWS Copilot CLI +description: Install AWS Copilot CLI on Ubuntu for Arm or macOS and verify the setup so you can deploy container applications to AWS services. tool_install: true weight: 1 --- @@ -128,4 +129,4 @@ The installed version is displayed: ```output copilot version: v1.34.0 -``` \ No newline at end of file +``` diff --git a/content/install-guides/aws-greengrass-v2.md b/content/install-guides/aws-greengrass-v2.md index fed83afade..94bdc52a2a 100644 --- a/content/install-guides/aws-greengrass-v2.md +++ b/content/install-guides/aws-greengrass-v2.md @@ -1,5 +1,6 @@ --- title: AWS IoT Greengrass +description: Install AWS IoT Greengrass on an Arm device and register it with AWS so you can build and manage IoT edge applications. author: Michael Hall additional_search_terms: - iot @@ -213,4 +214,4 @@ Click on the device name to see more device details. ![Greengrass Devices #center](/install-guides/_images/greengrass-devices.png) -You are now ready to use AWS IoT Greengrass v2 on your device. \ No newline at end of file +You are now ready to use AWS IoT Greengrass v2 on your device. diff --git a/content/install-guides/aws-sam-cli.md b/content/install-guides/aws-sam-cli.md index 9556e7fa69..4705da6b01 100644 --- a/content/install-guides/aws-sam-cli.md +++ b/content/install-guides/aws-sam-cli.md @@ -1,5 +1,6 @@ --- title: AWS SAM CLI +description: Install AWS SAM CLI on Ubuntu for Arm and test the setup so you can build, test, and deploy serverless applications locally. author: Jason Andrews minutes_to_complete: 15 @@ -174,4 +175,3 @@ REPORT RequestId: 513dbd6f-7fc0-4212-ae13-a9a4ce2f21f4 Init Duration: 0.26 ms Du ``` You are ready to use the AWS SAM CLI to build more complex functions and deploy them into AWS. Make sure to select `arm64` as the architecture for your Lambda functions. - diff --git a/content/install-guides/aws_access_keys.md b/content/install-guides/aws_access_keys.md index add12ade79..69b43160fc 100644 --- a/content/install-guides/aws_access_keys.md +++ b/content/install-guides/aws_access_keys.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: AWS Credentials +description: Generate AWS access keys and configure them for AWS CLI so command-line tools can sign programmatic requests to AWS services. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/azure-cli.md b/content/install-guides/azure-cli.md index 20e2b53a6e..a495cb7458 100644 --- a/content/install-guides/azure-cli.md +++ b/content/install-guides/azure-cli.md @@ -13,6 +13,7 @@ test_images: - ubuntu:latest test_maintenance: true title: Azure CLI +description: Install Azure CLI on Ubuntu for Arm using a script or pip so you can manage Azure resources from an Arm Linux system. tool_install: true weight: 1 --- diff --git a/content/install-guides/azure_login.md b/content/install-guides/azure_login.md index 4b129b2298..ce26f7781d 100644 --- a/content/install-guides/azure_login.md +++ b/content/install-guides/azure_login.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Azure Authentication +description: Sign in to Azure with Azure CLI and select a subscription so you can query and manage Azure cloud resources from the command line. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/bedrust.md b/content/install-guides/bedrust.md index c309029f00..46f652ad83 100644 --- a/content/install-guides/bedrust.md +++ b/content/install-guides/bedrust.md @@ -1,5 +1,6 @@ --- title: Bedrust - invoke models on Amazon Bedrock +description: Build and install Bedrust on Arm Linux so you can invoke Amazon Bedrock foundation models from the command line. minutes_to_complete: 10 author: Jason Andrews @@ -204,4 +205,3 @@ The output shows the model strings you can use. Make sure to enable the models y You are now ready to use Bedrust as a quick way to explore many Bedrock models and compare them. - diff --git a/content/install-guides/browsers/_index.md b/content/install-guides/browsers/_index.md index 2e4851cd70..136dd8cbc0 100644 --- a/content/install-guides/browsers/_index.md +++ b/content/install-guides/browsers/_index.md @@ -1,5 +1,6 @@ --- title: Browsers on Arm +description: Review browser availability on Arm Linux and Windows on Arm so you can choose and install a browser for development workflows. author: Jason Andrews additional_search_terms: - browser @@ -53,4 +54,3 @@ Edge and Firefox are good native browsers with DRM support for Windows on Arm. T Please share your experiences with browsers on Arm by submitting a [GitHub issue](https://github.com/ArmDeveloperEcosystem/arm-learning-paths/issues/new) or a GitHub Pull Request to add additional browsers. - diff --git a/content/install-guides/browsers/brave.md b/content/install-guides/browsers/brave.md index e98528d170..57956c4111 100644 --- a/content/install-guides/browsers/brave.md +++ b/content/install-guides/browsers/brave.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Brave +description: Install Brave on Arm Linux or Windows on Arm and use a native browser for development and web testing on Arm platforms. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -81,4 +82,3 @@ If you want the smaller, online installer download the file `BraveBrowserSetupAr - diff --git a/content/install-guides/browsers/chrome.md b/content/install-guides/browsers/chrome.md index 0edd82c4d9..a378601ea7 100644 --- a/content/install-guides/browsers/chrome.md +++ b/content/install-guides/browsers/chrome.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Chrome +description: Install Chrome on Windows on Arm and understand its Arm Linux availability so you can choose a supported browser for Arm devices. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/browsers/chromium.md b/content/install-guides/browsers/chromium.md index acfb3b6f29..0f15b2178b 100644 --- a/content/install-guides/browsers/chromium.md +++ b/content/install-guides/browsers/chromium.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Chromium +description: Install Chromium on Arm Linux or Windows on Arm and use a native open-source browser for development and testing. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -74,4 +75,3 @@ Chromium on Windows on Arm does not update itself so you need to update manually {{% notice Note3%}} Certain types of videos don't play with Chromium. Video support is less than other browsers without DRM. {{% /notice %}} - diff --git a/content/install-guides/browsers/edge.md b/content/install-guides/browsers/edge.md index 179661ed2c..841825bbc3 100644 --- a/content/install-guides/browsers/edge.md +++ b/content/install-guides/browsers/edge.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Edge +description: Use Microsoft Edge on Windows on Arm and review install options so you can work with the default native browser on Arm devices. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -37,4 +38,3 @@ The Linux downloads are not for the Arm architecture. - diff --git a/content/install-guides/browsers/firefox.md b/content/install-guides/browsers/firefox.md index e3e4285e48..e3fac8ac6a 100644 --- a/content/install-guides/browsers/firefox.md +++ b/content/install-guides/browsers/firefox.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Firefox +description: Install Firefox on Arm Linux or Windows on Arm and use a native browser for development and testing on Arm platforms. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -65,4 +66,3 @@ To install Firefox on Windows on Arm: 4. Find and start Firefox from the applications menu - diff --git a/content/install-guides/browsers/vivaldi.md b/content/install-guides/browsers/vivaldi.md index 640214ba88..ccd534d7ca 100644 --- a/content/install-guides/browsers/vivaldi.md +++ b/content/install-guides/browsers/vivaldi.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Vivaldi +description: Install Vivaldi on Arm Linux or Windows on Arm and use a native browser for development and web workflows. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/claude-code.md b/content/install-guides/claude-code.md index 4931a9eaff..45a6450d2e 100644 --- a/content/install-guides/claude-code.md +++ b/content/install-guides/claude-code.md @@ -1,5 +1,6 @@ --- title: Claude Code +description: Install Claude Code on Arm Linux, Apple Silicon macOS, or Windows on Arm so you can use terminal-based AI coding assistance. author: Pareena Verma minutes_to_complete: 10 diff --git a/content/install-guides/container.md b/content/install-guides/container.md index 29e3d26293..56b00a202a 100644 --- a/content/install-guides/container.md +++ b/content/install-guides/container.md @@ -1,5 +1,6 @@ --- title: Container CLI for macOS +description: Install Apple Container CLI on Apple Silicon macOS and verify it by building and running Arm Linux containers in lightweight virtual machines. author: Rani Chowdary Mandepudi minutes_to_complete: 10 official_docs: https://github.com/apple/container diff --git a/content/install-guides/cyclonedds.md b/content/install-guides/cyclonedds.md index df3464bbf5..77008e66e1 100644 --- a/content/install-guides/cyclonedds.md +++ b/content/install-guides/cyclonedds.md @@ -1,5 +1,6 @@ --- title: Cyclone DDS +description: Build and install Eclipse Cyclone DDS on Arm Linux and test the setup for real-time publish-subscribe communication in robotics and IoT applications. author: Odin Shen minutes_to_complete: 20 official_docs: https://cyclonedds.io/ @@ -119,4 +120,4 @@ If you observe the following output from each of the terminals, Cyclone DDS is r {{< /tab >}} {{< /tabpane >}} -You are now ready to use Cyclone DDS. \ No newline at end of file +You are now ready to use Cyclone DDS. diff --git a/content/install-guides/dcperf.md b/content/install-guides/dcperf.md index 3e20afa4d2..0960b59cdc 100644 --- a/content/install-guides/dcperf.md +++ b/content/install-guides/dcperf.md @@ -1,5 +1,6 @@ --- title: DCPerf +description: Install and run DCPerf on Arm-based servers to benchmark data center workloads and collect performance data for analysis or regression testing. author: Kieran Hejmadi minutes_to_complete: 20 official_docs: https://github.com/facebookresearch/DCPerf?tab=readme-ov-file#install-and-run-benchmarks diff --git a/content/install-guides/docker/_index.md b/content/install-guides/docker/_index.md index 14a27bfb2e..7097451eed 100644 --- a/content/install-guides/docker/_index.md +++ b/content/install-guides/docker/_index.md @@ -1,5 +1,6 @@ --- title: Docker +description: Choose the right Docker installation path for Arm Linux, ChromeOS, Windows, or macOS so you can build and run containers on Arm systems. author: Jason Andrews additional_search_terms: - containers diff --git a/content/install-guides/docker/docker-desktop-arm-linux.md b/content/install-guides/docker/docker-desktop-arm-linux.md index 7ee0e3009b..1774c61ad2 100644 --- a/content/install-guides/docker/docker-desktop-arm-linux.md +++ b/content/install-guides/docker/docker-desktop-arm-linux.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Docker Desktop for Arm Linux +description: Install Docker Desktop on Arm Linux and verify the setup so you can run container workflows with the Docker Desktop environment. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/docker/docker-desktop.md b/content/install-guides/docker/docker-desktop.md index 13650215dc..d0ce8201d4 100644 --- a/content/install-guides/docker/docker-desktop.md +++ b/content/install-guides/docker/docker-desktop.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Docker Desktop +description: Install Docker Desktop on Windows or macOS and test container execution so you can build and run Docker workloads on Arm-capable systems. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/docker/docker-engine.md b/content/install-guides/docker/docker-engine.md index f4ffdfb984..b8d7c5898d 100644 --- a/content/install-guides/docker/docker-engine.md +++ b/content/install-guides/docker/docker-engine.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Docker Engine +description: Install Docker Engine on Linux, WSL 2, or ChromeOS and verify the setup so you can run containers from the command line. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -157,4 +158,3 @@ sudo systemctl stop docker.socket You can now use Docker Engine and explore [Docker related Learning Paths](/tag/docker/). You can also create an account on [Docker Hub](https://hub.docker.com) to share images and automate workflows. - diff --git a/content/install-guides/dotnet.md b/content/install-guides/dotnet.md index e97b0d0732..244696a58b 100644 --- a/content/install-guides/dotnet.md +++ b/content/install-guides/dotnet.md @@ -13,6 +13,7 @@ test_images: test_link: null test_maintenance: true title: .NET SDK +description: Install the .NET SDK on Arm Linux and choose an SDK version so you can build and run .NET applications on Arm-based systems. tool_install: true weight: 1 --- diff --git a/content/install-guides/finch.md b/content/install-guides/finch.md index 126c895cc3..298eae899a 100644 --- a/content/install-guides/finch.md +++ b/content/install-guides/finch.md @@ -1,5 +1,6 @@ --- title: Finch on Arm Linux +description: Install Finch on Amazon Linux 2023 or Ubuntu 24.04 for Arm and verify Docker-compatible container workflows with containerd and nerdctl. author: Jason Andrews minutes_to_complete: 10 diff --git a/content/install-guides/fm_fvp/_index.md b/content/install-guides/fm_fvp/_index.md index a9dd18564e..aa672c6c7b 100644 --- a/content/install-guides/fm_fvp/_index.md +++ b/content/install-guides/fm_fvp/_index.md @@ -1,5 +1,6 @@ --- title: Arm Fast Models and FVPs +description: Install Arm Fast Models and Fixed Virtual Platforms so you can create and run virtual Arm platforms for software development and verification. author: Ronan Synnott additional_search_terms: diff --git a/content/install-guides/fm_fvp/eco_fvp.md b/content/install-guides/fm_fvp/eco_fvp.md index c9d6173bb1..54de28bdc4 100644 --- a/content/install-guides/fm_fvp/eco_fvp.md +++ b/content/install-guides/fm_fvp/eco_fvp.md @@ -1,5 +1,6 @@ --- title: Arm Ecosystem FVPs and Architecture Envelope Models +description: Download and install Arm Ecosystem FVPs or Architecture Envelope Models on supported hosts to explore Arm systems before hardware is available. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/100966 author: Ronan Synnott diff --git a/content/install-guides/fm_fvp/fm.md b/content/install-guides/fm_fvp/fm.md index b5f8cad5b4..539a883061 100644 --- a/content/install-guides/fm_fvp/fm.md +++ b/content/install-guides/fm_fvp/fm.md @@ -1,5 +1,6 @@ --- title: Arm Fast Models +description: Install Arm Fast Models on Linux or Windows and prepare host toolchains so you can build executable virtual platforms for Arm software development. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/107572 author: Ronan Synnott diff --git a/content/install-guides/fm_fvp/fvp.md b/content/install-guides/fm_fvp/fvp.md index 71c666e4ff..f5c139888d 100644 --- a/content/install-guides/fm_fvp/fvp.md +++ b/content/install-guides/fm_fvp/fvp.md @@ -1,5 +1,6 @@ --- title: Fixed Virtual Platforms (FVP) +description: Install the legacy Arm Fixed Virtual Platform library on Windows or Linux so you can run ready-to-use virtual Arm platforms. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/100966/ author: Ronan Synnott @@ -82,4 +83,3 @@ You can a workaround this error using `execstack` on each of the runtime binarie execstack -c ``` {{% /notice %}} - diff --git a/content/install-guides/fvps-on-macos.md b/content/install-guides/fvps-on-macos.md index 363d72a3b3..51af51187b 100644 --- a/content/install-guides/fvps-on-macos.md +++ b/content/install-guides/fvps-on-macos.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: AVH FVPs on macOS +description: Run Arm Virtual Hardware Fixed Virtual Platforms on macOS with Docker containers so you can use FVP models from an Apple development machine. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/gcc/_index.md b/content/install-guides/gcc/_index.md index 4095258c89..d33d999b96 100644 --- a/content/install-guides/gcc/_index.md +++ b/content/install-guides/gcc/_index.md @@ -1,5 +1,6 @@ --- title: GNU Compiler +description: Choose and install the right GCC toolchain for native Arm Linux development, Arm Linux cross-compilation, or bare-metal Arm targets. author: Jason Andrews additional_search_terms: - compiler diff --git a/content/install-guides/gcc/cross.md b/content/install-guides/gcc/cross.md index ce4cb06bca..69d6359672 100644 --- a/content/install-guides/gcc/cross.md +++ b/content/install-guides/gcc/cross.md @@ -13,6 +13,7 @@ test_images: test_link: null test_maintenance: true title: Cross-compiler +description: Install GCC cross-compilers on Linux so you can build 32-bit or 64-bit Arm Linux applications from a non-target host. tool_install: false weight: 3 --- diff --git a/content/install-guides/gcc/native.md b/content/install-guides/gcc/native.md index 42d22afa35..3904989b2a 100644 --- a/content/install-guides/gcc/native.md +++ b/content/install-guides/gcc/native.md @@ -14,6 +14,7 @@ test_images: test_link: null test_maintenance: true title: Native compiler +description: Install native GCC and G++ packages on Arm Linux so you can compile C and C++ applications directly on an Arm machine. tool_install: false weight: 2 --- diff --git a/content/install-guides/gcloud.md b/content/install-guides/gcloud.md index ae4a4eb05b..e57d39fc30 100644 --- a/content/install-guides/gcloud.md +++ b/content/install-guides/gcloud.md @@ -16,6 +16,7 @@ test_images: - ubuntu:latest test_maintenance: true title: Google Cloud Platform (GCP) CLI +description: Install the Google Cloud CLI on Ubuntu for Arm and verify the setup so you can manage Google Cloud resources with gcloud. tool_install: true weight: 1 --- diff --git a/content/install-guides/gemini.md b/content/install-guides/gemini.md index 24896dc1c2..7a36072cde 100644 --- a/content/install-guides/gemini.md +++ b/content/install-guides/gemini.md @@ -1,5 +1,6 @@ --- title: Gemini CLI +description: Install Gemini CLI on macOS or Arm Linux and configure authentication so you can use Google's command-line AI assistant for development tasks. author: Jason Andrews minutes_to_complete: 15 diff --git a/content/install-guides/gfortran.md b/content/install-guides/gfortran.md index 0215327664..074e89c368 100644 --- a/content/install-guides/gfortran.md +++ b/content/install-guides/gfortran.md @@ -19,6 +19,7 @@ test_images: test_link: null test_maintenance: true title: GFortran +description: Install GNU Fortran on Arm Linux and compile a test program so you can build Fortran applications with GCC tooling. tool_install: true weight: 1 --- diff --git a/content/install-guides/git-woa.md b/content/install-guides/git-woa.md index ad46e29786..b84624fe6f 100644 --- a/content/install-guides/git-woa.md +++ b/content/install-guides/git-woa.md @@ -1,5 +1,6 @@ --- title: Git for Windows on Arm +description: Install native Git for Windows on Arm and verify Git commands in Command Prompt, PowerShell, or Git Bash. additional_search_terms: - git diff --git a/content/install-guides/github-copilot.md b/content/install-guides/github-copilot.md index b509fbb8df..dd552f5c38 100644 --- a/content/install-guides/github-copilot.md +++ b/content/install-guides/github-copilot.md @@ -1,5 +1,6 @@ --- title: GitHub Copilot +description: Install GitHub Copilot in Visual Studio Code on Arm systems and connect it with the Arm MCP Server for Arm-focused development assistance. author: Pareena Verma minutes_to_complete: 10 diff --git a/content/install-guides/helm.md b/content/install-guides/helm.md index f591ac39e5..ce286e212b 100644 --- a/content/install-guides/helm.md +++ b/content/install-guides/helm.md @@ -1,5 +1,6 @@ --- title: Helm +description: Install Helm on Ubuntu for Arm and verify the setup so you can manage Kubernetes applications with charts. author: Jason Andrews minutes_to_complete: 10 diff --git a/content/install-guides/hyper-v.md b/content/install-guides/hyper-v.md index 5be508b262..7cfc356de0 100644 --- a/content/install-guides/hyper-v.md +++ b/content/install-guides/hyper-v.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Hyper-V on Arm +description: Enable Hyper-V on Windows 11 on Arm so you can create and run virtual machines on supported Arm devices. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/ipexplorer.md b/content/install-guides/ipexplorer.md index 31a84c9d07..0325c8b485 100644 --- a/content/install-guides/ipexplorer.md +++ b/content/install-guides/ipexplorer.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm IP Explorer +description: Access Arm IP Explorer in the browser and use it to explore Arm IP, simulate processors, and create SoC concepts. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/java.md b/content/install-guides/java.md index c5d0185654..66e3a0523f 100644 --- a/content/install-guides/java.md +++ b/content/install-guides/java.md @@ -1,5 +1,6 @@ --- title: Java +description: Install Java runtimes and development kits on Arm Linux using package managers, Snap, or vendor distributions for Java application development. author: Jason Andrews minutes_to_complete: 15 official_docs: https://docs.oracle.com/en/java/ diff --git a/content/install-guides/keilstudio_vs.md b/content/install-guides/keilstudio_vs.md index a43a1b7e5d..dd471f8d51 100644 --- a/content/install-guides/keilstudio_vs.md +++ b/content/install-guides/keilstudio_vs.md @@ -1,5 +1,6 @@ --- title: Arm Keil Studio for VS Code +description: Install Arm Keil Studio extensions for Visual Studio Code and verify the setup for Cortex-M embedded development on desktop hosts. additional_search_terms: - cortex-m diff --git a/content/install-guides/keilstudiocloud.md b/content/install-guides/keilstudiocloud.md index 0078e566c7..7dad434647 100644 --- a/content/install-guides/keilstudiocloud.md +++ b/content/install-guides/keilstudiocloud.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Keil Studio Cloud +description: Open Arm Keil Studio Cloud in a Chromium-based browser and start browser-based Cortex-M, IoT, and embedded development without local installation. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -40,4 +41,4 @@ Keil Studio Cloud does not require any installation. To run the browser-based ID ## How do I get started with Keil Studio Cloud? -[Get started with an Mbed OS Blinky example](https://developer.arm.com/documentation/102497/latest/Tutorials/Get-started-with-an-Mbed-OS-Blinky-example) is a great way to start. \ No newline at end of file +[Get started with an Mbed OS Blinky example](https://developer.arm.com/documentation/102497/latest/Tutorials/Get-started-with-an-Mbed-OS-Blinky-example) is a great way to start. diff --git a/content/install-guides/kiro-cli.md b/content/install-guides/kiro-cli.md index 58f2d4d1ee..e096852a62 100644 --- a/content/install-guides/kiro-cli.md +++ b/content/install-guides/kiro-cli.md @@ -1,5 +1,6 @@ --- title: Kiro CLI +description: Install Kiro CLI on macOS or Arm Linux and verify authentication so you can use AWS-focused AI assistance from the command line. author: Jason Andrews minutes_to_complete: 10 diff --git a/content/install-guides/kubectl.md b/content/install-guides/kubectl.md index 670a72fe12..467baf1c7b 100644 --- a/content/install-guides/kubectl.md +++ b/content/install-guides/kubectl.md @@ -18,6 +18,7 @@ test_images: test_link: null test_maintenance: true title: Kubectl +description: Install kubectl on Ubuntu for Arm and verify the Kubernetes CLI so you can run commands against Kubernetes clusters. tool_install: true weight: 1 --- @@ -78,4 +79,4 @@ Confirm the executable is available and get the version of the client: kubectl version -o json --client ``` -You are ready to use the Kubernetes command-line tool, `kubectl` \ No newline at end of file +You are ready to use the Kubernetes command-line tool, `kubectl` diff --git a/content/install-guides/license/_index.md b/content/install-guides/license/_index.md index e28f4ab5e8..cc31181736 100644 --- a/content/install-guides/license/_index.md +++ b/content/install-guides/license/_index.md @@ -1,5 +1,6 @@ --- title: Arm Software Licensing +description: Configure Arm software licensing with user-based, cloud, local, or FlexNet license servers so Arm commercial tools can check out licenses. author: Ronan Synnott additional_search_terms: - success kits diff --git a/content/install-guides/license/cloud.md b/content/install-guides/license/cloud.md index 8fec579a24..13c8f6a2ee 100644 --- a/content/install-guides/license/cloud.md +++ b/content/install-guides/license/cloud.md @@ -1,5 +1,6 @@ --- title: UBL Cloud server setup +description: Generate and activate Arm user-based licenses with the Cloud License Server so end users can check out commercial Arm tool licenses. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/107573 author: Ronan Synnott diff --git a/content/install-guides/license/flexnet.md b/content/install-guides/license/flexnet.md index 3e00ed96cb..81ac530261 100644 --- a/content/install-guides/license/flexnet.md +++ b/content/install-guides/license/flexnet.md @@ -1,5 +1,6 @@ --- title: FlexNet Publisher Floating license setup +description: Set up a FlexNet Publisher floating license server and configure end-user machines for older Arm products that do not support user-based licensing. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/dui0209 author: Ronan Synnott diff --git a/content/install-guides/license/ubl_license_admin.md b/content/install-guides/license/ubl_license_admin.md index d19e42829c..f32b2acf4f 100644 --- a/content/install-guides/license/ubl_license_admin.md +++ b/content/install-guides/license/ubl_license_admin.md @@ -1,5 +1,6 @@ --- title: UBL Local License Server (LLS) setup +description: Install and configure an Arm user-based Local License Server so administrators can host and manage commercial Arm tool licenses. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/107573 author: Ronan Synnott diff --git a/content/install-guides/license/ubl_license_enduser.md b/content/install-guides/license/ubl_license_enduser.md index cbd641cab8..18280f945e 100644 --- a/content/install-guides/license/ubl_license_enduser.md +++ b/content/install-guides/license/ubl_license_enduser.md @@ -1,5 +1,6 @@ --- title: UBL LLS End-user setup +description: Activate Arm user-based licenses from a Local License Server on an end-user machine using environment variables, tool IDEs, or manual activation. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/102516 author: Ronan Synnott diff --git a/content/install-guides/linux-migration-tools.md b/content/install-guides/linux-migration-tools.md index 4162b6d992..ff5df883db 100644 --- a/content/install-guides/linux-migration-tools.md +++ b/content/install-guides/linux-migration-tools.md @@ -1,5 +1,6 @@ --- title: Arm Linux Migration Tools +description: Install Arm Linux Migration Tools on Arm Linux to access utilities for code analysis, performance profiling, containers, and migration assessment. additional_search_terms: - migration diff --git a/content/install-guides/llvm-embedded.md b/content/install-guides/llvm-embedded.md index 540ca15693..a562536779 100644 --- a/content/install-guides/llvm-embedded.md +++ b/content/install-guides/llvm-embedded.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: LLVM Embedded Toolchain for Arm +description: Install the LLVM Embedded Toolchain for Arm on Windows, macOS, or Linux and verify clang for Cortex-M embedded development. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -182,4 +183,4 @@ telnetterminal0: Listening for serial connection on port 5001 hello Info: /OSCI/SystemC: Simulation stopped by user. ``` -You're now ready to use LLVM Embedded Toolchain for Arm. \ No newline at end of file +You're now ready to use LLVM Embedded Toolchain for Arm. diff --git a/content/install-guides/llvm-woa.md b/content/install-guides/llvm-woa.md index 2d2011986d..bea8f2d9d8 100644 --- a/content/install-guides/llvm-woa.md +++ b/content/install-guides/llvm-woa.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: LLVM toolchain for Windows on Arm +description: Install the native LLVM toolchain for Windows on Arm and verify clang so you can build software directly on Windows Arm devices. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/mcuxpresso_vs.md b/content/install-guides/mcuxpresso_vs.md index 3b9b16731c..9a429af747 100644 --- a/content/install-guides/mcuxpresso_vs.md +++ b/content/install-guides/mcuxpresso_vs.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: NXP MCUXpresso for VS Code +description: Install the NXP MCUXpresso extension for Visual Studio Code and required dependencies for embedded development on supported desktop hosts. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -72,4 +73,3 @@ Select one or more packages and click `Install`. [Keil Studio for VS Code](https://www.keil.arm.com/) is also available. Refer to the [Arm Keil Studio for VS Code install guide](/install-guides/keilstudio_vs/) for more information. - diff --git a/content/install-guides/mdk.md b/content/install-guides/mdk.md index 1cc6220e28..1da22f23da 100644 --- a/content/install-guides/mdk.md +++ b/content/install-guides/mdk.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Keil μVision +description: Install Arm Keil MDK on Windows and configure licensing so you can develop and debug Cortex-M microcontroller applications with uVision. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/multipass.md b/content/install-guides/multipass.md index 46ca191408..df9ee23d01 100644 --- a/content/install-guides/multipass.md +++ b/content/install-guides/multipass.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Multipass +description: Install Multipass on Apple Silicon macOS or Arm Linux and create Ubuntu virtual machine instances for local Arm cloud-style development. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -313,4 +314,4 @@ multipass purge Purged instances are no longer recoverable. {{% /notice %}} -You're now ready to use Multipass. \ No newline at end of file +You're now ready to use Multipass. diff --git a/content/install-guides/nerdctl.md b/content/install-guides/nerdctl.md index b09ae7e11b..161168b17b 100644 --- a/content/install-guides/nerdctl.md +++ b/content/install-guides/nerdctl.md @@ -1,5 +1,6 @@ --- title: Nerdctl +description: Install containerd, nerdctl, CNI plugins, and BuildKit on Arm Linux so you can run Docker-compatible container workflows without Docker Engine. author: Jason Andrews minutes_to_complete: 10 diff --git a/content/install-guides/nomachine.md b/content/install-guides/nomachine.md index 63216d274b..7d28906dbb 100644 --- a/content/install-guides/nomachine.md +++ b/content/install-guides/nomachine.md @@ -15,6 +15,7 @@ test_images: test_link: null test_maintenance: false title: NoMachine +description: Install NoMachine and an xfce desktop on remote Arm Linux so you can connect to a graphical development environment. tool_install: true weight: 1 --- @@ -146,4 +147,4 @@ Start NoMachine on the client computer by following these steps: ![Linux xfce4 remote desktop rendered in the NoMachine client window, confirming the remote desktop session is active and ready to use#center](/install-guides/_images/nx-desktop.png "NoMachine remote desktop session") -You're now ready to use NoMachine. \ No newline at end of file +You're now ready to use NoMachine. diff --git a/content/install-guides/oc.md b/content/install-guides/oc.md index ffb324ac1f..4eaf42f0ce 100644 --- a/content/install-guides/oc.md +++ b/content/install-guides/oc.md @@ -1,5 +1,6 @@ --- title: OpenShift CLI (oc) +description: Install the OpenShift CLI on Ubuntu for Arm or Apple Silicon macOS so you can manage OpenShift and Kubernetes resources from a terminal. author: Jason Andrews diff --git a/content/install-guides/oci-cli.md b/content/install-guides/oci-cli.md index 10534159ac..ce5610725f 100644 --- a/content/install-guides/oci-cli.md +++ b/content/install-guides/oci-cli.md @@ -15,6 +15,7 @@ test_images: - ubuntu:latest test_maintenance: true title: Oracle Cloud Infrastructure (OCI) CLI +description: Install OCI CLI on Ubuntu for Arm, verify the installation, and configure access so you can manage Oracle Cloud Infrastructure resources. tool_install: true weight: 1 --- diff --git a/content/install-guides/openvscode-server.md b/content/install-guides/openvscode-server.md index efa44fba6b..a58f0e6b61 100644 --- a/content/install-guides/openvscode-server.md +++ b/content/install-guides/openvscode-server.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: OpenVSCode Server +description: Install OpenVSCode Server on Arm Linux and start a browser-accessible VS Code environment for remote or headless development. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/papi.md b/content/install-guides/papi.md index 7893255ce1..0f1f7f74fa 100644 --- a/content/install-guides/papi.md +++ b/content/install-guides/papi.md @@ -1,5 +1,6 @@ --- title: Performance API (PAPI) +description: Build and install PAPI on Arm Linux so applications can access hardware performance counters for profiling specific code sections. minutes_to_complete: 15 official_docs: https://github.com/icl-utk-edu/papi/wiki/Downloading-and-Installing-PAPI author: Jason Andrews diff --git a/content/install-guides/pdh/_index.md b/content/install-guides/pdh/_index.md index ef61540974..d42bc7f010 100644 --- a/content/install-guides/pdh/_index.md +++ b/content/install-guides/pdh/_index.md @@ -1,5 +1,6 @@ --- title: Arm Product Download Hub +description: Access Arm Product Download Hub through a browser or API so you can find and download entitled Arm IP and software product packages. author: Ronan Synnott additional_search_terms: diff --git a/content/install-guides/pdh/api.md b/content/install-guides/pdh/api.md index f4fd8c07a3..65aab1777b 100644 --- a/content/install-guides/pdh/api.md +++ b/content/install-guides/pdh/api.md @@ -1,5 +1,6 @@ --- title: Access via API +description: Install and use the Entitlements and Download Manager on Linux to automate Arm Product Download Hub authentication and package downloads. minutes_to_complete: 15 official_docs: https://anypoint.mulesoft.com/exchange/portals/arm-3/f5af04c7-2f93-4d1e-8355-a60625973e1f/product-entitlement-customer-experience-api/ author: Ronan Synnott diff --git a/content/install-guides/pdh/browser.md b/content/install-guides/pdh/browser.md index ea5fcd5577..07929bddc9 100644 --- a/content/install-guides/pdh/browser.md +++ b/content/install-guides/pdh/browser.md @@ -1,5 +1,6 @@ --- title: Access via Internet Browser +description: Search and download Arm products from Arm Product Download Hub in a browser, including entitled packages, updates, and product-code lookups. minutes_to_complete: 15 official_docs: https://developer.arm.com/documentation/107572 author: Ronan Synnott diff --git a/content/install-guides/perf.md b/content/install-guides/perf.md index a21a841f55..7490b9f8f6 100644 --- a/content/install-guides/perf.md +++ b/content/install-guides/perf.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Perf for Linux on Arm (LinuxPerf) +description: Install Linux Perf on Arm Linux with a package manager or from source so you can collect hardware and software performance data. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/performix.md b/content/install-guides/performix.md index 3d9b7c8325..027eec48a4 100644 --- a/content/install-guides/performix.md +++ b/content/install-guides/performix.md @@ -1,5 +1,6 @@ --- title: Arm Performix +description: Install Arm Performix on a desktop host and connect to remote Arm Linux targets for graphical performance profiling with hardware counters. additional_search_terms: - performix diff --git a/content/install-guides/porting-advisor.md b/content/install-guides/porting-advisor.md index 1314e21f34..6fd49e8ccd 100644 --- a/content/install-guides/porting-advisor.md +++ b/content/install-guides/porting-advisor.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Porting Advisor for Graviton +description: Install Porting Advisor for Graviton on Ubuntu or Amazon Linux 2023 and scan application source code for portability issues on AWS Graviton. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -200,4 +201,3 @@ Report generated successfully. Hint: you can use --output FILENAME.html to gener Try out the other sample projects. You are now ready to use Porting Advisor for Graviton on your own projects. - diff --git a/content/install-guides/powershell.md b/content/install-guides/powershell.md index fc92c690b3..9f262f179d 100644 --- a/content/install-guides/powershell.md +++ b/content/install-guides/powershell.md @@ -1,5 +1,6 @@ --- title: PowerShell +description: Install PowerShell on Arm Linux and verify the shell so you can run cross-platform automation commands and scripts. minutes_to_complete: 10 official_docs: https://learn.microsoft.com/en-us/powershell/ ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=powershell @@ -107,4 +108,4 @@ The output is similar to: ```output Hello Arm Linux world! ``` -You are now ready to use PowerShell on your Arm Linux computer. \ No newline at end of file +You are now ready to use PowerShell on your Arm Linux computer. diff --git a/content/install-guides/pulumi.md b/content/install-guides/pulumi.md index 642d24d11b..f8639129b1 100644 --- a/content/install-guides/pulumi.md +++ b/content/install-guides/pulumi.md @@ -1,5 +1,6 @@ --- title: Pulumi +description: Install Pulumi on Linux and verify the setup with a container registry example so you can deploy infrastructure as code from Arm systems. minutes_to_complete: 5 official_docs: https://www.pulumi.com/docs/ ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=pulumi diff --git a/content/install-guides/py-woa.md b/content/install-guides/py-woa.md index 7486127c9e..283f1c4753 100644 --- a/content/install-guides/py-woa.md +++ b/content/install-guides/py-woa.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Python for Windows on Arm +description: Install native Python on Windows on Arm, run a test program, and install packages for Python development on Arm devices. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/pytorch-woa.md b/content/install-guides/pytorch-woa.md index 1b2ebf97af..3579273a1b 100644 --- a/content/install-guides/pytorch-woa.md +++ b/content/install-guides/pytorch-woa.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: PyTorch for Windows on Arm +description: Install native PyTorch for Windows on Arm and run a Python example to verify machine learning workflows on Arm devices. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/pytorch.md b/content/install-guides/pytorch.md index a4179a40ca..7a226d94dc 100644 --- a/content/install-guides/pytorch.md +++ b/content/install-guides/pytorch.md @@ -16,6 +16,7 @@ test_images: test_link: null test_maintenance: false title: PyTorch +description: Install PyTorch on Arm Linux and run a starter example so you can build and test machine learning applications with Python. tool_install: true weight: 1 --- diff --git a/content/install-guides/ros2.md b/content/install-guides/ros2.md index e6583effed..1832efe6fe 100644 --- a/content/install-guides/ros2.md +++ b/content/install-guides/ros2.md @@ -1,5 +1,6 @@ --- title: ROS - Robot Operating System +description: Install ROS 2 on Ubuntu for Arm and configure dependencies so you can build and run robotics applications on Arm Linux. author: Odin Shen minutes_to_complete: 30 official_docs: https://www.ros.org/blog/getting-started/ diff --git a/content/install-guides/rust.md b/content/install-guides/rust.md index 759ba66f82..a3addb0dac 100644 --- a/content/install-guides/rust.md +++ b/content/install-guides/rust.md @@ -1,5 +1,6 @@ --- title: Rust for Linux Applications +description: Install Rust on Arm Linux and compile a sample project so you can build Linux applications with the Rust toolchain. minutes_to_complete: 10 official_docs: https://www.rust-lang.org/tools/install ecosystem_dashboard: https://developer.arm.com/ecosystem-dashboard/linux?package=rust diff --git a/content/install-guides/rust_embedded.md b/content/install-guides/rust_embedded.md index 4afc3f8402..ed34c298de 100644 --- a/content/install-guides/rust_embedded.md +++ b/content/install-guides/rust_embedded.md @@ -1,5 +1,6 @@ --- title: Rust for Embedded Applications +description: Install Rust and Arm cross-compilation support on Ubuntu so you can build embedded applications for Arm targets. minutes_to_complete: 10 official_docs: https://docs.rust-embedded.org/ author: Ronan Synnott diff --git a/content/install-guides/sbt.md b/content/install-guides/sbt.md index 0740cabb92..d0ce1b86f2 100644 --- a/content/install-guides/sbt.md +++ b/content/install-guides/sbt.md @@ -1,5 +1,6 @@ --- title: sbt +description: Install sbt on Ubuntu for Arm so you can build Scala and Java projects with the standard sbt command-line tool. author: Jason Andrews minutes_to_complete: 10 diff --git a/content/install-guides/skopeo.md b/content/install-guides/skopeo.md index dff5c2aa88..7c8e3699f8 100644 --- a/content/install-guides/skopeo.md +++ b/content/install-guides/skopeo.md @@ -1,5 +1,6 @@ --- title: Skopeo +description: Install Skopeo on Ubuntu for Arm and inspect container images so you can work with registries without a local container daemon. author: Jason Andrews minutes_to_complete: 10 official_docs: https://github.com/containers/skopeo diff --git a/content/install-guides/socrates.md b/content/install-guides/socrates.md index 5d38951884..cc4f2f8a64 100644 --- a/content/install-guides/socrates.md +++ b/content/install-guides/socrates.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Socrates +description: Install Arm Socrates from Arm Product Download Hub, configure licensing, and update the IP catalog for Arm IP selection and SoC creation. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -93,4 +94,3 @@ They are available on the [Arm YouTube channel](https://www.youtube.com/c/arm): * [Getting Started](https://youtube.com/playlist?list=PLgyFKd2HIZlY_y7b5OTtyrso45q-eCM_s) * [NIC-400 Configuration](https://youtube.com/playlist?list=PLgyFKd2HIZlaQBfd8YEMwSQX_cWIxODgG) * [NI-700 Configuration](https://youtube.com/playlist?list=PLgyFKd2HIZlahIsHSSw7ViwiFxeBYc36b) - diff --git a/content/install-guides/ssh.md b/content/install-guides/ssh.md index a4ce4b0711..ef24238f17 100644 --- a/content/install-guides/ssh.md +++ b/content/install-guides/ssh.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: SSH +description: Install and configure SSH on Arm Linux so you can securely connect to remote servers for cloud and server development. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -177,4 +178,4 @@ ssh -i -L 3000:localhost:3000 ubuntu@ Once you SSH, you can access `localhost:3000` and the traffic is forwarded to the remote computer. -Search for additional tutorials to learn more about port forwarding. \ No newline at end of file +Search for additional tutorials to learn more about port forwarding. diff --git a/content/install-guides/stm32_vs.md b/content/install-guides/stm32_vs.md index cef286b71b..0643b9869c 100644 --- a/content/install-guides/stm32_vs.md +++ b/content/install-guides/stm32_vs.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: STM32 extensions for VS Code +description: Install STM32 extensions and dependencies for Visual Studio Code so you can configure and develop STM32 projects on desktop hosts. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/streamline-cli.md b/content/install-guides/streamline-cli.md index e507955011..afae3cb909 100644 --- a/content/install-guides/streamline-cli.md +++ b/content/install-guides/streamline-cli.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Streamline CLI Tools +description: Install Streamline CLI tools on Arm Linux and prepare applications for command-line performance profiling on Arm servers. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -273,4 +274,3 @@ Follow these steps to integrate these patches into an RPM-based distribution's k ``` You are now ready to use Streamline CLI Tools. Refer to [Profiling for Neoverse with Streamline CLI Tools](/learning-paths/servers-and-cloud-computing/profiling-for-neoverse/) to get started. - diff --git a/content/install-guides/streamline.md b/content/install-guides/streamline.md index 9d26fbffd4..9cd86785f0 100644 --- a/content/install-guides/streamline.md +++ b/content/install-guides/streamline.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Streamline +description: Install Arm Streamline from Arm Performance Studio or Arm Development Studio to profile Android, Linux, or bare-metal applications. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/successkits.md b/content/install-guides/successkits.md index 41966ddf9a..4c3ecd35ac 100644 --- a/content/install-guides/successkits.md +++ b/content/install-guides/successkits.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Arm Success Kits +description: Download and install Arm Success Kit components from Arm Product Download Hub so licensed development tools are available on your workstation. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -58,4 +59,3 @@ Bundles are provided for Windows, Linux, or Mac OS. Not all components are suppo [Install Arm Socrates](/install-guides/socrates/) [Install Arm AMBA Viz](/install-guides/ambaviz/) - diff --git a/content/install-guides/swift.md b/content/install-guides/swift.md index a3d7e2fdb5..360a8def53 100644 --- a/content/install-guides/swift.md +++ b/content/install-guides/swift.md @@ -1,6 +1,7 @@ --- title: Swift +description: Install Swift on Ubuntu for Arm and verify the toolchain so you can build and run Swift applications on Arm Linux. author: Jason Andrews minutes_to_complete: 10 @@ -139,4 +140,3 @@ Hello from Swift on Arm Linux! ``` You are now ready to use the Swift programming language on your Arm Linux computer. - diff --git a/content/install-guides/sysbox.md b/content/install-guides/sysbox.md index c418511964..62f791298b 100644 --- a/content/install-guides/sysbox.md +++ b/content/install-guides/sysbox.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Sysbox +description: Install Sysbox on Arm Linux and verify Docker workloads that need system-level container behavior without running a full virtual machine. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: @@ -207,4 +208,4 @@ sudo halt Sysbox behaves like a virtual machine that you can use to run applications that require system services normally not available in containers. It is useful for testing and development tasks because the container changes are not saved, meaning that you can create a clean testing environment simply by restarting the Sysbox container. -You're now ready to use Sysbox. \ No newline at end of file +You're now ready to use Sysbox. diff --git a/content/install-guides/terraform.md b/content/install-guides/terraform.md index da0666fc87..b50f65a407 100644 --- a/content/install-guides/terraform.md +++ b/content/install-guides/terraform.md @@ -18,6 +18,7 @@ test_images: test_link: false test_maintenance: true title: Terraform +description: Install Terraform on Ubuntu for Arm or Apple Silicon macOS and verify the CLI so you can manage cloud infrastructure as code. tool_install: true weight: 1 --- diff --git a/content/install-guides/tkn.md b/content/install-guides/tkn.md index c9420ff7e9..bb96a74b28 100644 --- a/content/install-guides/tkn.md +++ b/content/install-guides/tkn.md @@ -1,5 +1,6 @@ --- title: Tekton CLI (tkn) +description: Install Tekton CLI on Ubuntu for Arm or Apple Silicon macOS so you can create and manage Tekton Pipelines resources from a terminal. author: Jason Andrews official_docs: https://tekton.dev/docs/cli/ diff --git a/content/install-guides/topdown-tool.md b/content/install-guides/topdown-tool.md index 98a4cd5323..c562be51ce 100644 --- a/content/install-guides/topdown-tool.md +++ b/content/install-guides/topdown-tool.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Telemetry Solution (Topdown Methodology) +description: Install the Arm Telemetry Solution on Arm Linux and test top-down performance methodology tools that work with Linux Perf. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/vnc.md b/content/install-guides/vnc.md index b16479a920..3b00079065 100644 --- a/content/install-guides/vnc.md +++ b/content/install-guides/vnc.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: VNC on Arm Linux +description: Install and configure VNC with an xfce desktop on Arm Linux so you can connect to a remote graphical development environment. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/vs-woa.md b/content/install-guides/vs-woa.md index 4510fae878..a50b7be794 100644 --- a/content/install-guides/vs-woa.md +++ b/content/install-guides/vs-woa.md @@ -1,5 +1,6 @@ --- -title: Visual Studio for Windows on Arm +title: Visual Studio for Windows on Arm +description: Install Visual Studio on Windows on Arm with C, C++, and LLVM support so you can develop applications directly on Arm hardware. additional_search_terms: - clang diff --git a/content/install-guides/vscode-tunnels.md b/content/install-guides/vscode-tunnels.md index ec65f5eef3..bf23153813 100644 --- a/content/install-guides/vscode-tunnels.md +++ b/content/install-guides/vscode-tunnels.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: VS Code Tunnels +description: Install the VS Code CLI on Arm systems and configure Remote Tunnels for browser-based access to non-desktop Arm development environments. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/windows-perf-vs-extension.md b/content/install-guides/windows-perf-vs-extension.md index c3d1296aa6..5530a699ed 100644 --- a/content/install-guides/windows-perf-vs-extension.md +++ b/content/install-guides/windows-perf-vs-extension.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Visual Studio Extension for WindowsPerf +description: Install the WindowsPerf Visual Studio extension on Windows on Arm so you can capture and visualize performance data inside Visual Studio. minutes_to_complete: 10 diff --git a/content/install-guides/windows-perf-wpa-plugin.md b/content/install-guides/windows-perf-wpa-plugin.md index 584abcce17..b05a085429 100644 --- a/content/install-guides/windows-perf-wpa-plugin.md +++ b/content/install-guides/windows-perf-wpa-plugin.md @@ -1,5 +1,6 @@ --- title: Windows Performance Analyzer (WPA) plugin +description: Install the WindowsPerf WPA plugin on Windows on Arm so Windows Performance Analyzer can display WindowsPerf telemetry and timeline data. minutes_to_complete: 15 diff --git a/content/install-guides/windows-sandbox-woa.md b/content/install-guides/windows-sandbox-woa.md index e7336ea5c9..33c81fc2e3 100644 --- a/content/install-guides/windows-sandbox-woa.md +++ b/content/install-guides/windows-sandbox-woa.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: Windows Sandbox for Windows on Arm +description: Enable and install Windows Sandbox on Windows on Arm so you can run isolated desktop test environments on supported Arm devices. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: diff --git a/content/install-guides/wperf.md b/content/install-guides/wperf.md index b5d24753db..5f7fcb1959 100644 --- a/content/install-guides/wperf.md +++ b/content/install-guides/wperf.md @@ -2,6 +2,7 @@ ### Title the install tools article with the name of the tool to be installed ### Include vendor name where appropriate title: WindowsPerf (wperf) +description: Install WindowsPerf on Windows on Arm and verify PMU-based profiling so you can analyze application performance with command-line and IDE tools. ### Optional additional search terms (one per line) to assist in finding the article additional_search_terms: From 2d91c26b8264b302f9f1da03975411fc04075826 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Tue, 23 Jun 2026 09:07:10 -0500 Subject: [PATCH 082/137] Start tech review of Gerrit on GCP --- .../servers-and-cloud-computing/gerrit-on-gcp/_index.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md index bed4eb7271..cbbb6ca670 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md @@ -1,5 +1,10 @@ --- title: Deploy Gerrit on Google Cloud C4A + +draft: true +cascade: + draft: true + description: Learn how to install and configure Gerrit on Google Cloud Axion C4A Arm64 instances and benchmark its performance minutes_to_complete: 30 @@ -19,7 +24,7 @@ author: Doug Anson ##### Tags skilllevels: Introductory -subjects: Databases +subjects: CI-CD cloud_service_providers: - Google Cloud @@ -43,7 +48,7 @@ further_reading: - resource: title: Gerrit documentation - link: https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough-github.html + link: https://gerrit-review.googlesource.com/Documentation/ type: documentation weight: 1 From 6dbdc389744829d7450a0b4ea1462cbdac365212 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Tue, 23 Jun 2026 11:21:14 -0500 Subject: [PATCH 083/137] tech review of AWS CDK Learning Path --- .../servers-and-cloud-computing/aws-cdk/app.md | 8 +++++--- .../servers-and-cloud-computing/aws-cdk/cdk.md | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 254c23be5e..75973da5c1 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -80,7 +80,9 @@ The `cdk.json` file tells the CDK Toolkit how to execute your app. The build ste In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib` directory. AWS CDK uses this stack definition to deploy all necessary AWS resources. -Update `lib/arm-cdk-app-stack.js` to define a load-balanced Amazon ECS service that runs an NGINX web server on an Arm-based AWS Fargate runtime platform: +Update `lib/arm-cdk-app-stack.js` to define a load-balanced Amazon ECS service that runs an NGINX web server on an Arm-based AWS Fargate runtime platform. + +Replace the contents of the file with the code below: ```javascript const cdk = require('aws-cdk-lib'); @@ -110,6 +112,6 @@ module.exports = { ArmCdkAppStack }; ## What you've accomplished and what's next -You've now set up a sample application using AWS CDK. +You've now set up a sample application using AWS CDK. -Next, you'll use AWS CDK to synthesize and deploy the application. +Next, you'll use AWS CDK to synthesize and deploy the application. diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index 652974dd24..ca6e694953 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -58,7 +58,7 @@ ArmCdkAppStack.MyWebServerServiceURLYYYYYYYY = http://Hello-MyWeb-ZZZZZZZZZZZZZ- ## Verify application deployment -Open the URL from the deployment output in a web browser of your choice. +Open the service URL (`ArmCdkAppStack.MyWebServerServiceURL...`) from the deployment output in a web browser of your choice. You'll see the following welcome message: From 56a0a48f6bd14bdff3b2db2b377baed96545c487 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 12:03:52 -0500 Subject: [PATCH 084/137] first pass review --- .../_index.md | 4 -- .../build-the-template.md | 32 +++++++------ .../deploy.md | 40 ++++++++-------- .../overview.md | 34 ++++++------- .../what-are-the-toolchains.md | 48 ++++++++----------- 5 files changed, 77 insertions(+), 81 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index f92d5bfdb6..247f38ca22 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,10 +1,6 @@ --- title: Deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo -draft: true -cascade: - draft: true - description: Use Topo to deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. minutes_to_complete: 60 diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index 537d1c8c46..3081949f0f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -8,7 +8,7 @@ layout: learningpathall ## What you will build -In this section, you will build the `topo-imx93-npu-deployment` Template starting from two non-Topo, non-Compose projects: +In this section, you'll build the `topo-imx93-npu-deployment` Template starting from two non-Topo, non-Compose projects: - a Cortex-A web application that prepares images, writes model and tensor data into shared memory, and sends inference commands over `RPMsg` - a Cortex-M33 ExecuTorch runner firmware project for the FRDM i.MX 93 @@ -17,7 +17,9 @@ You will combine those sources into one repository, then make the repository a n ## Create the repository from the base projects -We will copy the original base projects from the Topo Template. Clone the Topo Template Format repository for the validation schema, clone the original Topo Template for the source files, and start a new empty repository: +You'll copy the original base projects from the Topo Template. + +Clone the Topo Template Format repository for the validation schema, clone the original Topo Template for the source files, and start a new empty repository: ```bash git clone https://github.com/arm/topo-template-format.git @@ -32,7 +34,7 @@ Create the project layout: mkdir -p webapp executorch-runner licenses ``` -Copy over the relevant `webapp` files: +Copy the relevant `webapp` files: ```bash cp -R ../topo-imx93-npu-deployment/webapp/src webapp @@ -55,7 +57,9 @@ cp -R ../topo-imx93-npu-deployment/licenses . cp ../topo-imx93-npu-deployment/.gitignore . ``` -We have now obtained a typical starting point. We have two sets of source code, combined into one repository. It is not a Compose project and it is not a Topo Template. We will now create a Compose project and Topo Template around the source code. +You now have two sets of source code, combined into one repository. It's not a Compose project and it's not a Topo Template. + +You'll now create a Compose project and Topo Template around the source code. The Compose project provides the container build and runtime structure. A Dockerfile describes how to build one image. A Compose file describes the services that use those images, their build contexts, ports, volumes, dependencies, and runtime settings. In this Template: @@ -66,7 +70,7 @@ The Compose project provides the container build and runtime structure. A Docker For a general introduction to Compose projects, services, and the `compose.yaml` file, see Docker's [How Compose works](https://docs.docker.com/compose/intro/compose-application-model/) documentation. -When a step below says to create a file, paste the complete file contents shown. When a step says to add or update part of an existing Compose file, merge the YAML into the existing top-level key shown by the snippet. For example, if a snippet starts with `services:`, add the named service under the existing top-level `services:` map. Do not create a second `services:` block in the same file. +When you're creating a file for any of the following steps, paste the complete file contents shown. When you're adding or updating part of an existing Compose file for a step, merge the YAML into the existing top-level key shown by the snippet. For example, if a snippet starts with `services:`, add the named service under the existing top-level `services:` map. Don't create a second `services:` block in the same file. ## Turn the sources into a Compose project @@ -206,9 +210,9 @@ services: - ${IMX93_RUNNER_BUILD_CACHE_IMAGE:-ghcr.io/arm-examples/topo-imx93-npu-deployment/imx93-runner-build:mcux-v25.09.00-armgcc14.2-ubuntu24.04} ``` -Do not replace the existing root `webapp` service with the snippet above. The root file should now have three service names under the same top-level `services:` map: `webapp`, `pte-artifacts`, and `runner-artifacts`. +Don't replace the existing root `webapp` service with this snippet. The root file should now have three service names under the same top-level `services:` map: `webapp`, `pte-artifacts`, and `runner-artifacts`. -These services are used only to build artifacts. They do not run as part of the deployed application. `scale: 0` tells Compose not to start containers for them, while still allowing other services to copy files from their build outputs. +These services are used only to build artifacts. They don't run as part of the deployed application. `scale: 0` tells Compose not to start containers for them, while still allowing other services to copy files from their build outputs. Replace `webapp/compose.yaml` with the following version so the Flask image imports the `.pte` artifact: @@ -257,7 +261,7 @@ services: remoteproc.name: imx-rproc ``` -Keep the existing `webapp`, `pte-artifacts`, and `runner-artifacts` services in the same file. This step adds one more service; it does not replace any of the previous services. +Keep the existing `webapp`, `pte-artifacts`, and `runner-artifacts` services in the same file. This step adds one more service and doesn't replace any of the previous services. This is the heterogeneous deployment hook. Docker still builds an image, but the service is not started as a Linux userspace process. The runtime `io.containerd.remoteproc.v1` selects Remoteproc Runtime, and the `remoteproc.name` annotation tells the shim to use the i.MX remote processor driver. @@ -280,14 +284,14 @@ services: The web app is privileged and mounts `/sys` and `/dev` because it checks the device tree, reads remoteproc state through `/sys/class/remoteproc`, talks to `/dev/ttyRPMSG*`, writes shared memory through `/dev/mem`, and checks for `/dev/ethosu0`. -Keep the web app build context in `webapp/compose.yaml`. The root `webapp.build.args` block above only supplies Topo-collected build arguments; it should not replace the extended build context and Dockerfile from `webapp/compose.yaml`. +Keep the web app build context in `webapp/compose.yaml`. The root `webapp.build.args` block above supplies only Topo-collected build arguments. It shouldn't replace the extended build context and Dockerfile from `webapp/compose.yaml`. ## Add Topo metadata and arguments After the Compose services are complete, add the root-level `x-topo` block. Keep it at the root of `compose.yaml`, as a sibling of `services`, not under `services`. -If you want to use an agent skill to perform this step, skip to the optional step below. +If you want to use an agent skill to perform this step, skip to the optional step. ```yaml x-topo: @@ -333,7 +337,7 @@ Install the skills with `npx skills`: npx skills add arm/topo-template-format ``` -If your agent does not use `npx skills`, manually copy or symlink the directories under `../topo-template-format/skills/` into your agent's skills directory. +If your agent doesn't use `npx skills`, manually copy or symlink the directories under `../topo-template-format/skills/` into your agent's skills directory. Restart your agent after installing or updating the skills. @@ -354,7 +358,7 @@ Validate compose.yaml against the Topo Template Format schema. Check README alignment, Remoteproc Runtime metadata, and x-topo.args wiring. ``` -## Validate the final Template +## Validate the final Topo Template Check the Compose model and check that the Topo metadata is present: @@ -368,7 +372,7 @@ In the `docker compose config` output, check that the resolved `webapp` service - `build.dockerfile` set to `Dockerfile` - `build.additional_contexts.pte_artifacts` set to `service:pte-artifacts` -Install `check-jsonschema` if it is not already available: +Install `check-jsonschema` if it's not already available: {{< tabpane code=true >}} {{< tab header="macOS" language="shell" >}} @@ -407,4 +411,4 @@ Review these points: You started with two non-Topo, non-Compose projects, made them a standard Compose project, and then converted that Compose project into a Topo Template. You created the web app image, added artifact builds for the ExecuTorch `.pte` model and Cortex-M33 ELF, packaged the firmware as a Remoteproc Runtime service, and exposed the build cache inputs as Topo arguments. -Next, you will prepare the FRDM i.MX 93 target, deploy the Template with Topo, and run the image classification application. +Next, you'll prepare the FRDM i.MX 93 target, deploy the Template with Topo, and run the image classification application. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index e9470d222d..ac9ad4d7b5 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -8,7 +8,7 @@ layout: learningpathall ## Prepare the target -Before deploying the Template, confirm that the FRDM i.MX 93 board is reachable from your host and that it's ready for deployment: +Before deploying the Topo Template, confirm that the FRDM i.MX 93 board is reachable from your host and that it's ready for deployment: ```bash topo health --target @ @@ -17,7 +17,7 @@ Replace `` with the IP address or hostname of your board. Resolve any errors before continuing. -The target section should include successful checks similar to: +The target section includes successful checks similar to: ```output Host @@ -54,13 +54,15 @@ topo health --target @ ## Reserve memory in the device tree -The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for the Ethos-U65. This prevents Linux from allocating memory that the Cortex-M33 firmware and Ethos-U65 need to access by physical address. You are now going to modify the device tree and reboot the target so that these modifications take effect. +The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for the Ethos-U65. This prevents Linux from allocating memory that the Cortex-M33 firmware and Ethos-U65 need to access by physical address. + +You're now going to modify the device tree and reboot the target so that these modifications take effect. {{% notice Warning %}} Back up the board's original device tree before modifying it. The exact boot partition can differ between Linux images, so check the paths on your board before copying files. {{% /notice %}} -On your host, create a working directory and dump the live device tree from the target: +1. On your host, create a working directory and dump the live device tree from the target: ```bash mkdir -p devicetree @@ -68,15 +70,15 @@ ssh @ 'cat /sys/firmware/fdt' > devicetree/live.dtb dtc -I dtb -O dts -o devicetree/live.dts devicetree/live.dtb ``` -Open `devicetree/live.dts` in a text editor of your choice. +2. Open `devicetree/live.dts` in a text editor of your choice. -Under `remoteproc-cm33`, add the CM33 power domain if it is not already present: +3. Under `remoteproc-cm33`, add the CM33 power domain if it is not already present: ```dts power-domains = <0x61>; ``` -Under `reserved-memory`, add the model memory range: +4. Under `reserved-memory`, add the model memory range: ```dts model@c0000000 { @@ -85,7 +87,7 @@ model@c0000000 { }; ``` -Update the Ethos-U reserved-memory node so it is reserved and not reusable: +5. Update the Ethos-U reserved-memory node so it is reserved and not reusable: ```dts ethosu_region@A8000000 { @@ -96,25 +98,25 @@ ethosu_region@A8000000 { }; ``` -Add `iomem=relaxed` to `chosen.bootargs`. For example: +6. Add `iomem=relaxed` to `chosen.bootargs`. For example: ```dts bootargs = "clk-imx93.mcore_booted console=ttyLP0,115200 earlycon root=/dev/mmcblk1p2 rootwait rw iomem=relaxed"; ``` -Return to your host machine terminal and build the patched device tree: +7. Return to your host machine terminal and build the patched device tree: ```bash dtc -I dts -O dtb -o devicetree/patched.dtb devicetree/live.dts ``` -Copy it to the board: +8. Copy it to the board: ```bash scp devicetree/patched.dtb @:/tmp/patched.dtb ``` -Install it on the board. Adjust the boot partition path if your image uses a different location: +9. Install it on the board. Adjust the boot partition path if your image uses a different location: ```bash ssh @ @@ -126,7 +128,7 @@ sync reboot ``` -After the board reboots, run the Topo health check again from the host and verify everything is still correct: +10. After the board reboots, run the Topo health check again from the host and verify everything is still correct: ```bash topo health --target @ @@ -134,7 +136,7 @@ topo health --target @ ## Deploy to the board -You can choose to deploy from the original Template, or from the Template you built from scratch. If you have not already cloned the original Template, clone it now: +You can choose to deploy from the original Topo Template, or from the template you built from scratch. If you've not already cloned the original template, clone it now: ```bash topo clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git @@ -172,7 +174,7 @@ When deployment succeeds, the output includes a successful service startup. You topo ps --target @ ``` -Your output should show a process on both the Cortex-M33, and the Linux Host, similar to below: +The output shows a process on both the Cortex-M33 and the Linux Host, and is similar to: ```output Image Status Processing Domain Address @@ -189,7 +191,7 @@ http://:3001 ``` {{% notice Note %}} -If you need to use a different target port, set `WEBAPP_PORT` when deploying: +If you need to use a different target port, set `WEBAPP_PORT` when deploying. For example: ```bash WEBAPP_PORT=3002 topo deploy --target @ @@ -210,9 +212,9 @@ The application shows: - classification results - an expandable analysis section with runtime details -You should see something similar to: +The following is a screenshot of the application user interface: -![Screenshot of the web interface running on an Arm-based target, showing an image and the model response. This confirms successful deployment and provides a visual reference for the expected result.#center](topo_npu_classifier.png "Image Classification Web App showing correctly classified German Shepherd") +![Screenshot of the web interface running on an Arm-based target, showing an image and the model response. This confirms successful deployment and provides a visual reference for the expected result.#center](topo_npu_classifier.png "Image classification web app showing correctly classified German Shepherd") When you select an image in the browser and click **Classify**, the web application: @@ -226,6 +228,6 @@ Try this out with an image from an ImageNet-supported class. ## What you've accomplished -You have prepared an FRDM i.MX 93 board for shared-memory NPU inference, deployed the `topo-imx93-npu-deployment` Template with Topo, started Cortex-M33 firmware through `remoteproc-runtime`, and used a browser-based application to stage the ExecuTorch `.pte` program and input tensor for MobileNetV2 classification with Ethos-U65 acceleration. +You've prepared an FRDM i.MX 93 board for shared-memory NPU inference, deployed the `topo-imx93-npu-deployment` template with Topo, started Cortex-M33 firmware through `remoteproc-runtime`, and used a browser-based application to stage the ExecuTorch `.pte` program and input tensor for MobileNetV2 classification with Ethos-U65 acceleration. You can now use the deployed application as a reference for your own heterogeneous Arm applications, or adapt the model, firmware runner, web interface, or Topo metadata for another target. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md index dd27918320..8afaa8738d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md @@ -1,45 +1,45 @@ --- -title: Overview - deploying an image classification app on i.MX 93 with Topo +title: Understand the architecture of the ML image classification application weight: 2 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## What you'll learn +## What you'll deploy -In this Learning Path, you will deploy the [topo-imx93-npu-deployment](https://github.com/Arm-Examples/topo-imx93-npu-deployment) Topo Template to an NXP FRDM i.MX 93 board, and understand how this Topo Template was created. +[Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm used to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo Templates are the standardized format by which projects are deployed with Topo. -To refresh, [Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm used to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo Templates are the standardized format by which projects are deployed with Topo. +In this Learning Path, you'll deploy the [topo-imx93-npu-deployment](https://github.com/Arm-Examples/topo-imx93-npu-deployment) Topo Template to an NXP FRDM i.MX 93 board, and understand how this Topo Template was created. The Topo Template builds and deploys a browser-based MobileNetV2 image classifier. The user interface runs on the Cortex-A (Linux) side of the SoC. The inference runner is packaged as Cortex-M33 firmware and is started by [remoteproc-runtime](https://github.com/arm/remoteproc-runtime). The model is exported to an [ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) `.pte` [file](https://docs.pytorch.org/executorch/stable/pte-file-format.html) for Ethos-U65 NPU acceleration. ## Prerequisites -Before getting started, ensure that your i.MX 93 board is set up with Linux and accessible over SSH. You can use this Learning Path as a guide: [Use Linux on the NXP FRDM i.MX 93 board](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/linux-nxp-board/). +Before getting started, ensure that your i.MX 93 board is set up with Linux and accessible over SSH. Use the Learning Path [Use Linux on the NXP FRDM i.MX 93 board](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/linux-nxp-board/) as a guide. -You should also be familiar with Topo and have it installed on your host development machine. You can complete the Learning Path [Deploy containerized workloads to Arm-based Linux targets with Topo](https://learn.arm.com/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/) to learn how to install Topo, run host and target health checks, inspect a target, list compatible Templates, and deploy a containerized workload. +Complete the Learning Path [Deploy containerized workloads to Arm-based Linux targets with Topo](https://learn.arm.com/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/) to learn how to install Topo, run host and target health checks, inspect a target, list compatible Topo Templates, and deploy a containerized workload. ## (Optional) Background reading -To understand more about Topo Templates, and how to create a basic Topo Template for a web application, you can complete the introductory [Create and deploy a custom Topo Template](https://learn.arm.com/learning-paths/cross-platform/create-your-own-topo-templates/) Learning Path. However, this is not required for this guide. +To learn more about Topo Templates, and how to create a basic Topo Template for a web application, you can optionally complete the introductory [Create and deploy a custom Topo Template](https://learn.arm.com/learning-paths/cross-platform/create-your-own-topo-templates/) Learning Path. -For more background on the underlying NPU example, use the [Deploy ExecuTorch firmware on NXP FRDM i.MX 93 for Ethos-U65 acceleration](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/) Learning Path. This can help explain the model, firmware, and [Ethos-U65](https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65) execution flow. +To learn more about the model, firmware, and [Ethos-U65](https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65) execution flow foe the underlying NPU example, see the [Deploy ExecuTorch firmware on NXP FRDM i.MX 93 for Ethos-U65 acceleration](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/) Learning Path. -## What does the Template do? +## What the template does -Deploying the Template starts two runtime services on the target: +Deploying the Topo Template starts two runtime services on the target: - `webapp`: Web application running on the Cortex-A Linux host. It receives an image input from the user and outputs the results of the ML image classification. - `cm33-runner`: Cortex-M33 firmware that receives the image tensor from the web application, runs the compiled MobileNetV2 ExecuTorch `.pte` program, delegates supported operators to the Ethos-U65 NPU, and runs non-delegated operators on the Cortex-M33 CPU. -## System Architecture +## System architecture The deployed application spans three processing domains on the i.MX 93: -- **Cortex-A Linux host**: runs Docker, Topo-deployed containers, the Flask web app, and the Linux `remoteproc` and `RPMsg` interfaces. -- **Cortex-M33 firmware domain**: runs the ExecuTorch runner firmware loaded by `remoteproc-runtime`. -- **Ethos-U65 NPU**: accelerates delegated neural network operators from the ExecuTorch MobileNetV2 program. +- Cortex-A Linux host: runs Docker, Topo-deployed containers, the Flask web app, and the Linux `remoteproc` and `RPMsg` interfaces. +- Cortex-M33 firmware domain: runs the ExecuTorch runner firmware loaded by `remoteproc-runtime`. +- Ethos-U65 NPU: accelerates delegated neural network operators from the ExecuTorch MobileNetV2 program. The high-level data flow is: @@ -66,8 +66,8 @@ Cortex-M33 returns classification results over RPMsg Browser displays ImageNet top-1 and top-5 results ``` -## What you've accomplished and what's next +## What you've learned and what's next -You now understand that the Topo Template deploys a Cortex-A web application, a Cortex-M33 ExecuTorch runner, and Ethos-U65 NPU acceleration as one heterogeneous application. You have also seen how inference uses reserved memory for the `.pte` program and input tensor, with `RPMsg` carrying commands and results between Cortex-A and Cortex-M33. +You now understand that the Topo Template deploys a Cortex-A web application, a Cortex-M33 ExecuTorch runner, and Ethos-U65 NPU acceleration as one heterogeneous application. You've also seen how inference uses reserved memory for the `.pte` program and input tensor, with `RPMsg` carrying commands and results between Cortex-A and Cortex-M33. -Next, you will review the toolchains and runtime interfaces used by the Template. +Next, you'll review the toolchains and runtime interfaces used by the Template. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md index d5b9d40f0e..1009629a6f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md @@ -1,43 +1,37 @@ --- -title: Understand the toolchains +title: Understand the toolchains used in the Topo Template weight: 3 ### FIXED, DO NOT MODIFY layout: learningpathall --- -## Understand the build and runtime pieces +## Understand the build and runtime components -The `topo-imx93-npu-deployment` Template combines several toolchains. Topo hides much of the deployment plumbing, but it is useful to understand what is being built and where each component runs. +The `topo-imx93-npu-deployment` Topo Template combines several toolchains. Topo hides much of the deployment plumbing, but it's useful to understand what's being built and where each component runs. -## ExecuTorch +### ExecuTorch -[ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) is PyTorch's runtime for deploying PyTorch models to edge devices. By using different backends within ExecuTorch, you can target specific hardware. For example, you can target Ethos-U65 by using the Ethos-U backend. To learn more about how the MobileNetV2 model was exported from PyTorch to ExecuTorch, and delegated to the Ethos-U, look at [Build ExecuTorch models for Ethos-U65](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte/). +[ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) is PyTorch's runtime for deploying PyTorch models to edge devices. By using different backends within ExecuTorch, you can target specific hardware. For example, you can target Ethos-U65 by using the Ethos-U backend. To learn more about how the MobileNetV2 model was exported from PyTorch to ExecuTorch and delegated to the Ethos-U, see [Build ExecuTorch models for Ethos-U65](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte/). -In this Template, ExecuTorch is used in two places: +In this Topo Template, ExecuTorch is used in two places: -- At build time, the Template exports a MobileNetV2 model to an ExecuTorch `.pte` program. +- At build time, the template exports a MobileNetV2 model to an ExecuTorch `.pte` program. - At run time, the Cortex-M33 firmware loads and executes that `.pte` program. -The export pipeline targets `ethos-u65-256`, which means the Ethos-U65 has 256 multiply-accumulate (MAC) units. The model is quantized and lowered so supported neural network operators can be delegated to the Ethos-U65 NPU. The generated file is: +The export pipeline targets `ethos-u65-256`, which means the Ethos-U65 has 256 multiply-accumulate (MAC) units. The model is quantized and lowered so supported neural network operators can be delegated to the Ethos-U65 NPU. -```output -mv2_ethosu65_256.pte -``` +The generated file is `mv2_ethosu65_256.pte`. The web application includes this `.pte` file in its container image. During inference, it writes the file into the reserved physical memory range starting at `0xC0000000`, where the Cortex-M33 runner can read it. -## Cortex-M33 firmware runner - -The firmware runner is built as: +### Cortex-M33 firmware runner -```output -executorch_runner_cm33.elf -``` +The firmware runner is built as `executorch_runner_cm33.elf`. This firmware runs on the Cortex-M33 core. It waits for commands coming from the Linux web application over `RPMsg`, reads the input image tensors from reserved memory, executes inference through ExecuTorch, and writes classification output back over `RPMsg`. -The Template packages the firmware as the entrypoint of the `cm33-runner` image: +The Topo Template packages the firmware as the entrypoint of the `cm33-runner` image: ```yaml cm33-runner: @@ -48,9 +42,9 @@ cm33-runner: The `runtime: io.containerd.remoteproc.v1` setting tells containerd to use the remote processor runtime instead of the normal Linux container runtime. The `remoteproc.name` annotation identifies the target remote processor driver, `imx-rproc`. -## remoteproc-runtime +### remoteproc-runtime -Linux includes a `remoteproc` framework for loading and controlling auxiliary processors such as the Cortex-M33 on the i.MX 93. `remoteproc-runtime` adds an Open Container Initiative interface on top of this framework, allowing firmware to be packaged and launched using container tooling. +Linux includes a `remoteproc` framework for loading and controlling auxiliary processors such as the Cortex-M33 on the i.MX 93. `remoteproc-runtime` adds an Open Container Initiative (OCI) interface on top of this framework, allowing firmware to be packaged and launched using container tooling. Topo uses `remoteproc-runtime` when deploying the `cm33-runner` service. The deployment flow is: @@ -62,29 +56,29 @@ Topo uses `remoteproc-runtime` when deploying the `cm33-runner` service. The dep This is why the target must pass the `Remoteproc Runtime`, `Remoteproc Shim`, and `Subsystem Driver (remoteproc)` checks in `topo health`. -## RPMsg +### RPMsg `RPMsg` is the communication channel between the Cortex-A Linux application and the Cortex-M33 firmware. The web application sends a `RUN` command over a `/dev/ttyRPMSG*` device. The firmware replies with status and classification output. If the deployment succeeds but classification times out, inspect the web app's board checks and the target's `RPMsg` devices. The application expects an `RPMsg` TTY to appear after the Cortex-M33 firmware starts. -## Shared reserved memory +### Shared reserved memory -The web application and firmware exchange model and input data through reserved physical memory. The Template expects the target device tree to reserve: +The web application and firmware exchange model and input data through reserved physical memory. The Topo Template expects the target device tree to reserve: - `model@c0000000`: 4 MiB for the ExecuTorch `.pte` file and input tensor. - `ethosu_region@A8000000`: 128 MiB for Ethos-U65 use. The web application checks these ranges at startup through `/proc/device-tree`. It also checks for `/dev/mem`, `/dev/ethosu0`, the `imx-rproc` remote processor, the `.pte` file, and ImageNet labels. -## Web application +### Web application The `webapp` service is a Python Flask application. It serves the browser UI, preprocesses selected images, stages the .pte program and input tensor in reserved memory, sends inference commands over `RPMsg`, and renders the ImageNet top-1 and top-5 results. By default, the service publishes port `3001` on the target and forwards it to container port `3000`. -## What you've accomplished and what's next +## What you've learned and what's next -You now understand the major toolchains and runtime interfaces used by the Template: ExecuTorch, the Cortex-M33 firmware runner, remoteproc-runtime, RPMsg, reserved memory, and the Flask web application. You have also seen how the web application stages the `.pte` program and input data in reserved memory before sending inference commands to the Cortex-M33 firmware. +You now understand the major toolchains and runtime interfaces used by the Topo Template: ExecuTorch, the Cortex-M33 firmware runner, remoteproc-runtime, RPMsg, reserved memory, and the Flask web application. You've also seen how the web application stages the `.pte` program and input data in reserved memory before sending inference commands to the Cortex-M33 firmware. -Next, you will build the Template from the base projects by adding the Compose services, build artifacts, Remoteproc Runtime metadata, and Topo arguments. +Next, you'll build the Topo Template from the base projects by adding the Compose services, build artifacts, Remoteproc Runtime metadata, and Topo arguments. From 4bf329b3b9cf87c3444d83ae774da9a2dca2769e Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 12:54:13 -0500 Subject: [PATCH 085/137] second pass --- .../deploy-ml-model-to-npu-with-topo/_index.md | 8 ++++---- .../build-the-template.md | 18 +++++++++++------- .../deploy-ml-model-to-npu-with-topo/deploy.md | 12 ++++++------ .../overview.md | 8 ++++---- .../what-are-the-toolchains.md | 10 ++++++---- 5 files changed, 31 insertions(+), 25 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index 247f38ca22..7c191c7e41 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,16 +1,16 @@ --- -title: Deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo +title: Build and deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo -description: Use Topo to deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. +description: Use Topo to build and deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. minutes_to_complete: 60 who_is_this_for: This is an introductory topic for embedded/edge software developers who want to deploy machine learning workloads to heterogeneous Arm-based Linux targets using Topo, including leveraging Arm Ethos-U NPUs. learning_objectives: - - Explain how Topo deploys an application that spans Cortex-A, Cortex-M, and Ethos-U + - Understand how Topo deploys an application that spans Cortex-A, Cortex-M, and Ethos-U - Deploy the topo-imx93-npu-deployment Template, which operates across Cortex-A, Cortex-M, and Ethos-U, to perform image classification using an ExecuTorch MobileNetV2 model - - Describe how the Template is bootstrapped from Compose services, Remoteproc Runtime metadata, and Topo arguments and follow this process yourself + - Understand how the Template is bootstrapped from Compose services, Remoteproc Runtime metadata, and Topo arguments and follow this process yourself - Understand how to take similar projects and create Topo Templates, including using Agent Skills prerequisites: diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index 3081949f0f..10271a071d 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -8,7 +8,7 @@ layout: learningpathall ## What you will build -In this section, you'll build the `topo-imx93-npu-deployment` Template starting from two non-Topo, non-Compose projects: +In this section, you'll build the `topo-imx93-npu-deployment` Topo Template starting from two non-Topo, non-Compose projects: - a Cortex-A web application that prepares images, writes model and tensor data into shared memory, and sends inference commands over `RPMsg` - a Cortex-M33 ExecuTorch runner firmware project for the FRDM i.MX 93 @@ -70,7 +70,11 @@ The Compose project provides the container build and runtime structure. A Docker For a general introduction to Compose projects, services, and the `compose.yaml` file, see Docker's [How Compose works](https://docs.docker.com/compose/intro/compose-application-model/) documentation. -When you're creating a file for any of the following steps, paste the complete file contents shown. When you're adding or updating part of an existing Compose file for a step, merge the YAML into the existing top-level key shown by the snippet. For example, if a snippet starts with `services:`, add the named service under the existing top-level `services:` map. Don't create a second `services:` block in the same file. +{{% notice Note %}} +When you creating a file for any of the following steps, paste the complete file contents as shown. + +When you update part of an existing Compose file for a step, merge the YAML into the existing top-level key shown by the snippet. For example, if a snippet starts with `services:`, add the named service under the existing top-level `services:` map. Don't create a second `services:` block in the same file. +{{% /notice %}} ## Turn the sources into a Compose project @@ -132,7 +136,7 @@ Check that Compose can read the project: docker compose config ``` -You should see output that includes the resolved `webapp` service: +The output includes the resolved `webapp` service, and is similar to: ```output services: @@ -263,7 +267,7 @@ services: Keep the existing `webapp`, `pte-artifacts`, and `runner-artifacts` services in the same file. This step adds one more service and doesn't replace any of the previous services. -This is the heterogeneous deployment hook. Docker still builds an image, but the service is not started as a Linux userspace process. The runtime `io.containerd.remoteproc.v1` selects Remoteproc Runtime, and the `remoteproc.name` annotation tells the shim to use the i.MX remote processor driver. +This is the heterogeneous deployment hook. Docker still builds an image, but the service doesn't start as a Linux userspace process. The runtime `io.containerd.remoteproc.v1` selects Remoteproc Runtime, and the `remoteproc.name` annotation tells the shim to use the i.MX remote processor driver. Update the existing root `webapp` service so it depends on the CM33 runner and passes the cache image values into the build. Keep the existing `extends` block, then add `depends_on` and `build.args` as shown: @@ -284,7 +288,7 @@ services: The web app is privileged and mounts `/sys` and `/dev` because it checks the device tree, reads remoteproc state through `/sys/class/remoteproc`, talks to `/dev/ttyRPMSG*`, writes shared memory through `/dev/mem`, and checks for `/dev/ethosu0`. -Keep the web app build context in `webapp/compose.yaml`. The root `webapp.build.args` block above supplies only Topo-collected build arguments. It shouldn't replace the extended build context and Dockerfile from `webapp/compose.yaml`. +Keep the web app build context in `webapp/compose.yaml`. The root `webapp.build.args` block supplies only Topo-collected build arguments. It shouldn't replace the extended build context and Dockerfile from `webapp/compose.yaml`. ## Add Topo metadata and arguments @@ -310,7 +314,7 @@ x-topo: default: ghcr.io/arm-examples/topo-imx93-npu-deployment/imx93-runner-build:mcux-v25.09.00-armgcc14.2-ubuntu24.04 ``` -The `features` value tells Topo that this Template requires `remoteproc-runtime` support on the target. This is useful when checking for project compatibility with the `topo templates --target ` command. +The `features` value tells Topo that this template requires `remoteproc-runtime` support on the target. This is useful when checking for project compatibility with the `topo templates --target ` command. The `args` entries describe configurable build inputs. Compose consumes those values through the `cache_from` interpolation you added earlier: @@ -411,4 +415,4 @@ Review these points: You started with two non-Topo, non-Compose projects, made them a standard Compose project, and then converted that Compose project into a Topo Template. You created the web app image, added artifact builds for the ExecuTorch `.pte` model and Cortex-M33 ELF, packaged the firmware as a Remoteproc Runtime service, and exposed the build cache inputs as Topo arguments. -Next, you'll prepare the FRDM i.MX 93 target, deploy the Template with Topo, and run the image classification application. +Next, you'll prepare the FRDM i.MX 93 target, deploy the template with Topo, and run the image classification application. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index ac9ad4d7b5..bc923a7fcd 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -54,7 +54,7 @@ topo health --target @ ## Reserve memory in the device tree -The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for the Ethos-U65. This prevents Linux from allocating memory that the Cortex-M33 firmware and Ethos-U65 need to access by physical address. +The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for the Ethos-U65. This prevents Linux from allocating memory that the firmware and Ethos-U65 access by physical address. You're now going to modify the device tree and reboot the target so that these modifications take effect. @@ -136,7 +136,7 @@ topo health --target @ ## Deploy to the board -You can choose to deploy from the original Topo Template, or from the template you built from scratch. If you've not already cloned the original template, clone it now: +You can choose to deploy from the original Topo Template, or from the template you built from scratch. If you haven't already cloned the original template, clone it now: ```bash topo clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git @@ -157,7 +157,7 @@ cd new-topo-npu-template ``` {{% notice Note %}} -If not pulling from the cache, the first build can take a long time and requires about 25 GB of free disk space. It downloads and builds ExecuTorch, the Arm GNU toolchain, MCUX SDK components, RPMsg-Lite, and the Cortex-M33 runner sources. Later builds are faster when Docker can reuse local cache layers or import the configured GHCR cache layers. +If Docker doesn't pull from the cache, the first build can take a long time and requires about 25 GB of free disk space. It downloads and builds ExecuTorch, the Arm GNU toolchain, MCUX SDK components, RPMsg-Lite, and the Cortex-M33 runner sources. Later builds are faster when Docker can reuse local cache layers or import the configured GHCR cache layers. {{% /notice %}} Deploy the project to your target: @@ -212,11 +212,11 @@ The application shows: - classification results - an expandable analysis section with runtime details -The following is a screenshot of the application user interface: +The following screenshot shows the expected application user interface: ![Screenshot of the web interface running on an Arm-based target, showing an image and the model response. This confirms successful deployment and provides a visual reference for the expected result.#center](topo_npu_classifier.png "Image classification web app showing correctly classified German Shepherd") -When you select an image in the browser and click **Classify**, the web application: +When you choose an image in the browser and select **Classify**, the web application: 1. Resizes and normalizes the image to classify into an input tensor compatible with the [MobileNetV2](https://arxiv.org/abs/1801.04381) model. 2. Writes the ExecuTorch `.pte` program and input tensor into reserved physical memory. @@ -228,6 +228,6 @@ Try this out with an image from an ImageNet-supported class. ## What you've accomplished -You've prepared an FRDM i.MX 93 board for shared-memory NPU inference, deployed the `topo-imx93-npu-deployment` template with Topo, started Cortex-M33 firmware through `remoteproc-runtime`, and used a browser-based application to stage the ExecuTorch `.pte` program and input tensor for MobileNetV2 classification with Ethos-U65 acceleration. +You've prepared an FRDM i.MX 93 board for shared-memory NPU inference, deployed the `topo-imx93-npu-deployment` template with Topo, and started Cortex-M33 firmware through `remoteproc-runtime`. You used a browser-based application to stage the ExecuTorch `.pte` program and input tensor for MobileNetV2 classification with Ethos-U65 acceleration. You can now use the deployed application as a reference for your own heterogeneous Arm applications, or adapt the model, firmware runner, web interface, or Topo metadata for another target. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md index 8afaa8738d..66b0a090be 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md @@ -8,7 +8,7 @@ layout: learningpathall ## What you'll deploy -[Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm used to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo Templates are the standardized format by which projects are deployed with Topo. +[Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm that you can use to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo Templates are the standardized format by which projects are deployed with Topo. In this Learning Path, you'll deploy the [topo-imx93-npu-deployment](https://github.com/Arm-Examples/topo-imx93-npu-deployment) Topo Template to an NXP FRDM i.MX 93 board, and understand how this Topo Template was created. @@ -22,9 +22,9 @@ Complete the Learning Path [Deploy containerized workloads to Arm-based Linux ta ## (Optional) Background reading -To learn more about Topo Templates, and how to create a basic Topo Template for a web application, you can optionally complete the introductory [Create and deploy a custom Topo Template](https://learn.arm.com/learning-paths/cross-platform/create-your-own-topo-templates/) Learning Path. +To learn more about Topo Templates, and how to create a basic Topo Template for a web application, complete the introductory [Create and deploy a custom Topo Template](https://learn.arm.com/learning-paths/cross-platform/create-your-own-topo-templates/) Learning Path. -To learn more about the model, firmware, and [Ethos-U65](https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65) execution flow foe the underlying NPU example, see the [Deploy ExecuTorch firmware on NXP FRDM i.MX 93 for Ethos-U65 acceleration](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/) Learning Path. +To learn more about the model, firmware, and [Ethos-U65](https://www.arm.com/products/silicon-ip-cpu/ethos/ethos-u65) execution flow behind this NPU example, see the [Deploy ExecuTorch firmware on NXP FRDM i.MX 93 for Ethos-U65 acceleration](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/) Learning Path. ## What the template does @@ -70,4 +70,4 @@ Browser displays ImageNet top-1 and top-5 results You now understand that the Topo Template deploys a Cortex-A web application, a Cortex-M33 ExecuTorch runner, and Ethos-U65 NPU acceleration as one heterogeneous application. You've also seen how inference uses reserved memory for the `.pte` program and input tensor, with `RPMsg` carrying commands and results between Cortex-A and Cortex-M33. -Next, you'll review the toolchains and runtime interfaces used by the Template. +Next, you'll review the toolchains and runtime interfaces used by the Topo Template. diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md index 1009629a6f..49115d78d3 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md @@ -12,7 +12,9 @@ The `topo-imx93-npu-deployment` Topo Template combines several toolchains. Topo ### ExecuTorch -[ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) is PyTorch's runtime for deploying PyTorch models to edge devices. By using different backends within ExecuTorch, you can target specific hardware. For example, you can target Ethos-U65 by using the Ethos-U backend. To learn more about how the MobileNetV2 model was exported from PyTorch to ExecuTorch and delegated to the Ethos-U, see [Build ExecuTorch models for Ethos-U65](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte/). +[ExecuTorch](https://docs.pytorch.org/executorch/stable/index.html) is PyTorch's runtime for deploying PyTorch models to edge devices. By using different backends within ExecuTorch, you can target specific hardware. For example, you can target Ethos-U65 by using the Ethos-U backend. + +To learn more about how the MobileNetV2 model was exported from PyTorch to ExecuTorch and delegated to the Ethos-U, see [Build ExecuTorch models for Ethos-U65](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/observing-ethos-u-on-nxp/7-build-executorch-pte/). In this Topo Template, ExecuTorch is used in two places: @@ -29,7 +31,7 @@ The web application includes this `.pte` file in its container image. During inf The firmware runner is built as `executorch_runner_cm33.elf`. -This firmware runs on the Cortex-M33 core. It waits for commands coming from the Linux web application over `RPMsg`, reads the input image tensors from reserved memory, executes inference through ExecuTorch, and writes classification output back over `RPMsg`. +This firmware runs on the Cortex-M33 core. It waits for commands coming from the Linux web application over `RPMsg`, reads input image tensors from reserved memory, runs inference through ExecuTorch, and writes classification output back over `RPMsg`. The Topo Template packages the firmware as the entrypoint of the `cm33-runner` image: @@ -54,7 +56,7 @@ Topo uses `remoteproc-runtime` when deploying the `cm33-runner` service. The dep 4. `remoteproc-runtime` passes the ELF file to the Linux `remoteproc` driver. 5. The kernel loads the ELF segments and releases the Cortex-M33. -This is why the target must pass the `Remoteproc Runtime`, `Remoteproc Shim`, and `Subsystem Driver (remoteproc)` checks in `topo health`. +The target must pass the `Remoteproc Runtime`, `Remoteproc Shim`, and `Subsystem Driver (remoteproc)` checks in `topo health`. ### RPMsg @@ -73,7 +75,7 @@ The web application checks these ranges at startup through `/proc/device-tree`. ### Web application -The `webapp` service is a Python Flask application. It serves the browser UI, preprocesses selected images, stages the .pte program and input tensor in reserved memory, sends inference commands over `RPMsg`, and renders the ImageNet top-1 and top-5 results. +The `webapp` service is a Python Flask application. The application serves the browser UI and preprocesses selected images. It stages the `.pte` program and input tensor in reserved memory, sends inference commands over `RPMsg`, and renders the ImageNet top-1 and top-5 results. By default, the service publishes port `3001` on the target and forwards it to container port `3000`. From 54c559196943f61a49bc116a7621a36a77fcf22b Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 13:06:38 -0500 Subject: [PATCH 086/137] restoring draft flags with skill --- .../deploy-ml-model-to-npu-with-topo/_index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index 7c191c7e41..912edfa160 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,6 +1,10 @@ --- title: Build and deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo +draft: true +cascade: + draft: true + description: Use Topo to build and deploy a Cortex-A web application that sends MobileNetV2 image classification requests to Cortex-M33 firmware accelerated by the Ethos-U65 NPU. minutes_to_complete: 60 From 02620e15542fcac8eff04a3ffd2022070b2133a3 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 13:16:38 -0500 Subject: [PATCH 087/137] adding descriptions --- .../deploy-ml-model-to-npu-with-topo/build-the-template.md | 1 + .../deploy-ml-model-to-npu-with-topo/deploy.md | 1 + .../deploy-ml-model-to-npu-with-topo/overview.md | 1 + .../deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md | 1 + 4 files changed, 4 insertions(+) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index 10271a071d..864091de96 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -1,5 +1,6 @@ --- title: Build the Topo Template from scratch +description: Create a Topo Template from the web application and Cortex-M33 firmware sources by adding Compose services, build artifacts, remoteproc-runtime metadata, and Topo arguments. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index bc923a7fcd..3f73e20507 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -1,5 +1,6 @@ --- title: Clone and deploy the application with Topo +description: Prepare the NXP FRDM i.MX 93 target, deploy the image classification Topo Template, and validate MobileNetV2 inference through the browser application. weight: 5 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md index 66b0a090be..ce92d44ee1 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md @@ -1,5 +1,6 @@ --- title: Understand the architecture of the ML image classification application +description: Review how the Topo Template deploys a Cortex-A web application, Cortex-M33 firmware, and Ethos-U65 NPU acceleration for image classification on NXP FRDM i.MX 93. weight: 2 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md index 49115d78d3..aaabebb3da 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/what-are-the-toolchains.md @@ -1,5 +1,6 @@ --- title: Understand the toolchains used in the Topo Template +description: Identify the build and runtime components that connect ExecuTorch, remoteproc-runtime, RPMsg, reserved memory, and the Flask web application in the Topo Template. weight: 3 ### FIXED, DO NOT MODIFY From 58ffd62618bf52fbf583c9b66fd0a6561ac8d8f6 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 15:14:26 -0500 Subject: [PATCH 088/137] edits --- .../deploy-ml-model-to-npu-with-topo/_index.md | 8 ++++---- .../build-the-template.md | 14 +++++++------- .../deploy-ml-model-to-npu-with-topo/deploy.md | 18 ++++++++---------- .../overview.md | 4 ++-- 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index 912edfa160..c6cf515661 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -1,5 +1,5 @@ --- -title: Build and deploy an ML application to the Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo +title: Deploy a machine learning application to the Arm Ethos-U65 NPU on NXP FRDM i.MX 93 with Topo draft: true cascade: @@ -12,16 +12,16 @@ minutes_to_complete: 60 who_is_this_for: This is an introductory topic for embedded/edge software developers who want to deploy machine learning workloads to heterogeneous Arm-based Linux targets using Topo, including leveraging Arm Ethos-U NPUs. learning_objectives: - - Understand how Topo deploys an application that spans Cortex-A, Cortex-M, and Ethos-U + - Explain how Topo deploys an application that spans Cortex-A, Cortex-M, and Ethos-U - Deploy the topo-imx93-npu-deployment Template, which operates across Cortex-A, Cortex-M, and Ethos-U, to perform image classification using an ExecuTorch MobileNetV2 model - - Understand how the Template is bootstrapped from Compose services, Remoteproc Runtime metadata, and Topo arguments and follow this process yourself + - Describe how the Template is bootstrapped from Compose services, Remoteproc Runtime metadata, and Topo arguments and follow this process yourself - Understand how to take similar projects and create Topo Templates, including using Agent Skills prerequisites: - A host machine (x86 or Arm) with Linux, macOS, or Windows - An NXP FRDM i.MX 93 target board with Linux setup, accessible over SSH with root access. To do this, see [Use Linux on the NXP FRDM i.MX 93 board](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/linux-nxp-board/). - Docker installed on the host and target. For installation steps, see [Install Docker](https://learn.arm.com/install-guides/docker/). - - At least 25 GB of free disk space on the host if you are building without cache images. + - At least 25 GB of free disk space on the host if you're building without cache images. - The Device Tree Compiler (`dtc`) installed on the host. - lscpu installed on the target (pre-installed on most Linux distributions) - Topo installed on the host. For installation steps, see [Deploy containerized workloads to Arm-based Linux targets with Topo](https://learn.arm.com/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/). diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index 864091de96..15c7331218 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -14,11 +14,11 @@ In this section, you'll build the `topo-imx93-npu-deployment` Topo Template star - a Cortex-A web application that prepares images, writes model and tensor data into shared memory, and sends inference commands over `RPMsg` - a Cortex-M33 ExecuTorch runner firmware project for the FRDM i.MX 93 -You will combine those sources into one repository, then make the repository a normal Compose project, and only then add the Topo metadata and Remoteproc Runtime services. +You'll combine those sources into one repository, then make the repository a normal Compose project. Then, you'll add the Topo metadata and Remoteproc Runtime services. ## Create the repository from the base projects -You'll copy the original base projects from the Topo Template. +Start by copying the original base projects from the Topo Template. Clone the Topo Template Format repository for the validation schema, clone the original Topo Template for the source files, and start a new empty repository: @@ -58,7 +58,7 @@ cp -R ../topo-imx93-npu-deployment/licenses . cp ../topo-imx93-npu-deployment/.gitignore . ``` -You now have two sets of source code, combined into one repository. It's not a Compose project and it's not a Topo Template. +You have two sets of source code combined into one repository. It's not a Compose project and it's not a Topo Template. You'll now create a Compose project and Topo Template around the source code. @@ -67,7 +67,7 @@ The Compose project provides the container build and runtime structure. A Docker - `webapp/Dockerfile` builds the Flask image. - `webapp/compose.yaml` keeps the web app's build context and Linux runtime settings close to the web app source. - `executorch-runner/Dockerfile` builds the ExecuTorch `.pte` model and Cortex-M33 runner ELF through multi-stage Docker builds. -- the root `compose.yaml` is the Template entry point. It combines the web app, artifact build services, the Remoteproc Runtime service, and the root-level `x-topo` metadata. +- the root `compose.yaml` is the Topo Template entry point. It combines the web app, artifact build services, the Remoteproc Runtime service, and the root-level `x-topo` metadata. For a general introduction to Compose projects, services, and the `compose.yaml` file, see Docker's [How Compose works](https://docs.docker.com/compose/intro/compose-application-model/) documentation. @@ -151,7 +151,7 @@ services: published: "3001" ``` -At this point, Compose can build and run the Cortex-A web application as a normal Linux container. The image runs `webapp/src/app.py`, packages the Jinja templates from `webapp/src/templates/`, the static assets from `webapp/src/static/`, and the ImageNet labels from `webapp/src/data/imagenet_classes.txt`. The container listens on port `3000`, and Compose publishes it on host port `3001` unless you set `WEBAPP_PORT` to another value. +At this point, Compose can build and run the Cortex-A web application as a normal Linux container. The image runs `webapp/src/app.py`. It packages the Jinja templates from `webapp/src/templates/`, the static assets from `webapp/src/static/`, and the ImageNet labels from `webapp/src/data/imagenet_classes.txt`. The container listens on port `3000`, and Compose publishes it on host port `3001` unless you set `WEBAPP_PORT` to another value. ## Add the ExecuTorch artifact pipeline @@ -317,7 +317,7 @@ x-topo: The `features` value tells Topo that this template requires `remoteproc-runtime` support on the target. This is useful when checking for project compatibility with the `topo templates --target ` command. -The `args` entries describe configurable build inputs. Compose consumes those values through the `cache_from` interpolation you added earlier: +The `args` entries describe configurable build inputs. Compose consumes those values through the `cache_from` interpolation that you added earlier: ```output cache_from: @@ -326,7 +326,7 @@ cache_from: The root `webapp.build.args` block also makes the Topo-provided values visible in the Compose build model while preserving the `webapp/` build context inherited through `extends`. -Keep runtime settings such as `WEBAPP_PORT` as normal Compose interpolation unless you intentionally want Topo to collect them as Template setup arguments. +Keep runtime settings such as `WEBAPP_PORT` as normal Compose interpolation unless you intentionally want Topo to collect them as Topo Template setup arguments. ## (Optional) Use an Agent Skill to add the Topo metadata diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index 3f73e20507..c535c46b10 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -55,9 +55,9 @@ topo health --target @ ## Reserve memory in the device tree -The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for the Ethos-U65. This prevents Linux from allocating memory that the firmware and Ethos-U65 access by physical address. +The web application and Cortex-M33 firmware exchange data through reserved physical memory. The target device tree must reserve memory for the model/input buffer and for the Ethos-U65. This prevents Linux from allocating memory that the firmware and Ethos-U65 need to access by physical address. -You're now going to modify the device tree and reboot the target so that these modifications take effect. +You'll now modify the device tree and reboot the target so that these modifications take effect. {{% notice Warning %}} Back up the board's original device tree before modifying it. The exact boot partition can differ between Linux images, so check the paths on your board before copying files. @@ -73,7 +73,7 @@ dtc -I dtb -O dts -o devicetree/live.dts devicetree/live.dtb 2. Open `devicetree/live.dts` in a text editor of your choice. -3. Under `remoteproc-cm33`, add the CM33 power domain if it is not already present: +3. Under `remoteproc-cm33`, add the CM33 power domain if it's not already present: ```dts power-domains = <0x61>; @@ -88,7 +88,7 @@ model@c0000000 { }; ``` -5. Update the Ethos-U reserved-memory node so it is reserved and not reusable: +5. Update the Ethos-U reserved-memory node so it's reserved and not reusable: ```dts ethosu_region@A8000000 { @@ -145,6 +145,10 @@ topo clone https://github.com/Arm-Examples/topo-imx93-npu-deployment.git Topo prompts for optional build cache image arguments. Accept the defaults unless you have your own cache images. +{{% notice Note %}} +If you build without cache images, the first build can take a long time and requires about 25 GB of free disk space. The first build involves downloading and building ExecuTorch, the Arm GNU toolchain, MCUX SDK components, RPMsg-Lite, and the Cortex-M33 runner sources. Later builds are faster when Docker can reuse local cache layers or import the configured GHCR cache layers. +{{% /notice %}} + Then `cd` into the correct directory: ```bash @@ -157,10 +161,6 @@ Or: cd new-topo-npu-template ``` -{{% notice Note %}} -If Docker doesn't pull from the cache, the first build can take a long time and requires about 25 GB of free disk space. It downloads and builds ExecuTorch, the Arm GNU toolchain, MCUX SDK components, RPMsg-Lite, and the Cortex-M33 runner sources. Later builds are faster when Docker can reuse local cache layers or import the configured GHCR cache layers. -{{% /notice %}} - Deploy the project to your target: ```bash @@ -213,8 +213,6 @@ The application shows: - classification results - an expandable analysis section with runtime details -The following screenshot shows the expected application user interface: - ![Screenshot of the web interface running on an Arm-based target, showing an image and the model response. This confirms successful deployment and provides a visual reference for the expected result.#center](topo_npu_classifier.png "Image classification web app showing correctly classified German Shepherd") When you choose an image in the browser and select **Classify**, the web application: diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md index ce92d44ee1..d9c9467c65 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/overview.md @@ -1,5 +1,5 @@ --- -title: Understand the architecture of the ML image classification application +title: Understand the architecture of the machine learning application description: Review how the Topo Template deploys a Cortex-A web application, Cortex-M33 firmware, and Ethos-U65 NPU acceleration for image classification on NXP FRDM i.MX 93. weight: 2 @@ -9,7 +9,7 @@ layout: learningpathall ## What you'll deploy -[Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm that you can use to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo Templates are the standardized format by which projects are deployed with Topo. +[Topo](https://github.com/arm/topo) is an open-source command-line tool developed by Arm that you can use to deploy projects to an Arm-based Linux target over SSH. Topo builds container images on the host, transfers them to the target, and starts the services on the target. Topo Templates are the standardized format for deploying projects with Topo. In this Learning Path, you'll deploy the [topo-imx93-npu-deployment](https://github.com/Arm-Examples/topo-imx93-npu-deployment) Topo Template to an NXP FRDM i.MX 93 board, and understand how this Topo Template was created. From fe7404c6ee71382023aacbe427432f55a53f2967 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 15:32:07 -0500 Subject: [PATCH 089/137] removing bullets --- .../deploy.md | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md index c535c46b10..2ec4d19baa 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/deploy.md @@ -63,7 +63,7 @@ You'll now modify the device tree and reboot the target so that these modificati Back up the board's original device tree before modifying it. The exact boot partition can differ between Linux images, so check the paths on your board before copying files. {{% /notice %}} -1. On your host, create a working directory and dump the live device tree from the target: +On your host, create a working directory and dump the live device tree from the target: ```bash mkdir -p devicetree @@ -71,15 +71,13 @@ ssh @ 'cat /sys/firmware/fdt' > devicetree/live.dtb dtc -I dtb -O dts -o devicetree/live.dts devicetree/live.dtb ``` -2. Open `devicetree/live.dts` in a text editor of your choice. - -3. Under `remoteproc-cm33`, add the CM33 power domain if it's not already present: +Open `devicetree/live.dts` in a text editor of your choice. Then, under `remoteproc-cm33`, add the CM33 power domain if it's not already present: ```dts power-domains = <0x61>; ``` -4. Under `reserved-memory`, add the model memory range: +Under `reserved-memory`, add the model memory range: ```dts model@c0000000 { @@ -88,7 +86,7 @@ model@c0000000 { }; ``` -5. Update the Ethos-U reserved-memory node so it's reserved and not reusable: +Update the Ethos-U reserved-memory node so it's reserved and not reusable: ```dts ethosu_region@A8000000 { @@ -99,25 +97,25 @@ ethosu_region@A8000000 { }; ``` -6. Add `iomem=relaxed` to `chosen.bootargs`. For example: +Add `iomem=relaxed` to `chosen.bootargs`. For example: ```dts bootargs = "clk-imx93.mcore_booted console=ttyLP0,115200 earlycon root=/dev/mmcblk1p2 rootwait rw iomem=relaxed"; ``` -7. Return to your host machine terminal and build the patched device tree: +Return to your host machine terminal and build the patched device tree: ```bash dtc -I dts -O dtb -o devicetree/patched.dtb devicetree/live.dts ``` -8. Copy it to the board: +Copy it to the board: ```bash scp devicetree/patched.dtb @:/tmp/patched.dtb ``` -9. Install it on the board. Adjust the boot partition path if your image uses a different location: +Install it on the board. Adjust the boot partition path if your image uses a different location: ```bash ssh @ @@ -129,7 +127,7 @@ sync reboot ``` -10. After the board reboots, run the Topo health check again from the host and verify everything is still correct: +After the board reboots, run the Topo health check again from the host and verify everything is still correct: ```bash topo health --target @ From fb381e4f9a15be59472a5caace1381a9a428ceb4 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 15:39:16 -0500 Subject: [PATCH 090/137] nit --- .../deploy-ml-model-to-npu-with-topo/_index.md | 2 +- .../deploy-ml-model-to-npu-with-topo/build-the-template.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index c6cf515661..72055af253 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -26,7 +26,7 @@ prerequisites: - lscpu installed on the target (pre-installed on most Linux distributions) - Topo installed on the host. For installation steps, see [Deploy containerized workloads to Arm-based Linux targets with Topo](https://learn.arm.com/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/). - Basic familiarity with containers, SSH, and CLI tools - - (Optional) Access to an Agent, such as Codex, or Claude Code + - (Optional) Access to an agent, such as Codex, or Claude Code author: Tomas Agustin Gonzalez Orlando diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md index 15c7331218..2649551d4f 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/build-the-template.md @@ -332,7 +332,7 @@ Keep runtime settings such as `WEBAPP_PORT` as normal Compose interpolation unle The [Topo Template Format](https://github.com/arm/topo-template-format) repository includes public authoring skills for agents that support skill installation: -- `topo-template-context`: provides Topo and Topo Template reference context for `x-topo` metadata, schema, docs, and CLI Template behavior. +- `topo-template-context`: provides Topo and Topo Template reference context for `x-topo` metadata, schema, docs, and CLI template behavior. - `topo-template-bootstrap`: converts a Compose repository into a Topo Template by adding or improving `compose.yaml` and `x-topo` metadata. - `topo-template-lint`: reviews a Topo Template for schema correctness, metadata consistency, deployment success messages, and build argument wiring. From 1d522192fe3f755b1072c4c30435612a084aeaf2 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 15:39:28 -0500 Subject: [PATCH 091/137] nit --- .../deploy-ml-model-to-npu-with-topo/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md index 72055af253..ed372cc867 100644 --- a/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/deploy-ml-model-to-npu-with-topo/_index.md @@ -26,7 +26,7 @@ prerequisites: - lscpu installed on the target (pre-installed on most Linux distributions) - Topo installed on the host. For installation steps, see [Deploy containerized workloads to Arm-based Linux targets with Topo](https://learn.arm.com/learning-paths/cross-platform/deploy-containerized-workloads-with-topo/). - Basic familiarity with containers, SSH, and CLI tools - - (Optional) Access to an agent, such as Codex, or Claude Code + - (Optional) Access to an agent, such as Codex or Claude Code author: Tomas Agustin Gonzalez Orlando From 127fe69ff719d0746d41f3c42887417451969b36 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 16:13:22 -0500 Subject: [PATCH 092/137] editorial review --- .../servers-and-cloud-computing/aws-cdk/_index.md | 8 ++++++-- .../servers-and-cloud-computing/aws-cdk/app.md | 6 +++--- .../servers-and-cloud-computing/aws-cdk/cdk.md | 4 ++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index 86736128e9..2c6191f2a2 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -16,8 +16,8 @@ learning_objectives: - Deploy application resources on Arm-based AWS compute using Amazon ECS and the AWS CDK prerequisites: - - An Amazon Web Services (AWS) account - - A local computer with the AWS CLI, AWS CDK CLI, and Node.js installed + - An Amazon Web Services (AWS) account + - A local computer with the AWS CLI, AWS CDK CLI, and Node.js installed, with AWS credentials configured. - Familiarity with the Linux command line and JavaScript author: Anupras Mohapatra @@ -51,6 +51,10 @@ further_reading: title: AWS CLI install guide link: /install-guides/aws-cli/ type: install-guide + - resource: + title: Amazon ECS task definitions for 64-bit Arm workloads + link: https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-arm64.html + type: documentation ### FIXED, DO NOT MODIFY # ================================================================================ diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md index 75973da5c1..0e3c93691f 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/app.md @@ -8,7 +8,7 @@ layout: "learningpathall" ## Set up a sample AWS CDK application -The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (IaC) software development framework. +The AWS Cloud Development Kit (AWS CDK) is an open-source infrastructure as code (IaC) software development framework. In this section, you'll create a JavaScript CDK application that defines an Amazon Elastic Container Service (ECS) service running on Arm-based AWS Fargate compute. @@ -82,7 +82,7 @@ In the project, you'll find a file called `arm-cdk-app-stack.js` in the `lib` di Update `lib/arm-cdk-app-stack.js` to define a load-balanced Amazon ECS service that runs an NGINX web server on an Arm-based AWS Fargate runtime platform. -Replace the contents of the file with the code below: +Replace the contents of the file with the following code: ```javascript const cdk = require('aws-cdk-lib'); @@ -112,6 +112,6 @@ module.exports = { ArmCdkAppStack }; ## What you've accomplished and what's next -You've now set up a sample application using AWS CDK. +You've now set up a sample JavaScript application using AWS CDK and defined an Amazon ECS service that runs on Arm-based AWS Fargate compute. Next, you'll use AWS CDK to synthesize and deploy the application. diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index ca6e694953..e6fb506d63 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -45,10 +45,10 @@ cdk deploy --require-approval never ``` {{% notice Note %}} -The deployment can take a couple minutes to complete. +The deployment can take a few minutes to complete. {{% /notice %}} -When the deployment completes, the last couple lines of the output will include a URL to the web server and the load balancer's DNS name: +When the deployment completes, the final lines of the output will include a URL to the web server and the load balancer's DNS name: ```output Outputs: From 8ac489b0fb212a03358099b824cae769a6671988 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 16:18:07 -0500 Subject: [PATCH 093/137] nits --- .../learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md index e6fb506d63..1fecf39844 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/cdk.md @@ -38,7 +38,7 @@ cdk deploy ``` By default, the AWS CDK CLI will prompt you to approve IAM-related changes during deployment. -For the AWS CDK CLI to deploy the application without the need for approval, set the `--require-approval` flag to `never` during deployment: +If you want the AWS CDK CLI to deploy the application without the need for approval, set the `--require-approval` flag to `never` during deployment: ```bash cdk deploy --require-approval never @@ -73,7 +73,7 @@ cdk destroy ``` By default, the AWS CDK CLI will prompt you to approve the deletion of `ArmCDKAppStack`. -For the AWS CDK CLI to clean up resources without the need for approval, use the `--force` or `-f` flag: +If you want the AWS CDK CLI to clean up resources without the need for approval, use the `--force` or `-f` flag: ```bash cdk destroy -f From f7f0f33083d6a8c57df9ea51a623bab4345f66e4 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 16:27:25 -0500 Subject: [PATCH 094/137] install guide edits --- content/install-guides/aws-cdk.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/content/install-guides/aws-cdk.md b/content/install-guides/aws-cdk.md index d58b11865a..64eb1a2772 100644 --- a/content/install-guides/aws-cdk.md +++ b/content/install-guides/aws-cdk.md @@ -11,22 +11,21 @@ official_docs: https://docs.aws.amazon.com/cdk/v2/guide/home.html test_images: - ubuntu:latest test_maintenance: true -draft: true title: AWS CDK CLI description: Install the AWS CDK CLI on Arm Linux and macOS using npm, then verify the setup with the `cdk` command. tool_install: true weight: 1 --- -The AWS Cloud Development Kit (CDK) is an open-source infrastructure as code (IaC) software development framework. You can use the AWS CDK to define and deploy applications on Arm-based cloud infrastructure powered by AWS Graviton. +The AWS Cloud Development Kit (AWS CDK) is an open-source infrastructure as code (IaC) software development framework. You can use the AWS CDK to define and deploy applications on Arm-based cloud infrastructure powered by AWS Graviton. -With the CDK, you can write applications in a supported programming language of your choice. You can then use the AWS CDK CLI to translate the code into an AWS CloudFormation template and deploy the application. +You can write applications in a supported programming language of your choice. Then, you can use the AWS CDK CLI to translate the code into an AWS CloudFormation template and deploy the application. In this guide, you'll learn how to install the CDK CLI and verify that the CLI installation was successful. ## Before you begin -Make sure that you have the AWS CLI installed: +Verify that you have the AWS CLI installed: ```bash aws --version @@ -37,7 +36,7 @@ The output is similar to: ```output aws-cli/2.34.56 Python/3.14.5 Darwin/25.5.0 exe/arm64 ``` -For more information about setting up AWS credentials and installing the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys/) and [AWS CLI](/install-guides/aws-cli/) install guides. +For instructions to set up AWS credentials and install the AWS CLI, see the [AWS Credentials](/install-guides/aws_access_keys/) and [AWS CLI](/install-guides/aws-cli/) install guides. Make sure you have Node.js 22 or later installed: @@ -52,7 +51,7 @@ v26.2.0 ``` If you don't have Node.js installed, or if the installed version is earlier than Node.js 22, download a suitable version from the [Node.js website](https://nodejs.org/en/download). -You'll also need to install prerequisites specific to the programming languages that you want to use. For more information about language-specific prerequisites, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. +You'll also need to install prerequisites specific to the programming languages that you want to use. For more information, see [Install Node.js and programming language prerequisites](https://docs.aws.amazon.com/cdk/v2/guide/prerequisites.html#prerequisites-node) in the AWS CDK documentation. ## Install the AWS CDK CLI @@ -79,4 +78,4 @@ The output is similar to: You've now installed the AWS CDK CLI and verified that the installation was successful. -Next, you can use the AWS CDK to create and deploy applications on Arm-based compute powered by AWS Graviton. To learn how you can use the CDK and Amazon Elastic Container Service (ECS) to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](/learning-paths/servers-and-cloud-computing/aws-cdk/). +Next, you can use the AWS CDK to create and deploy applications on Arm-based compute powered by AWS Graviton. To learn how you can use the AWS CDK and Amazon Elastic Container Service (Amazon ECS) to run containers on Arm-based compute, see [Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK](/learning-paths/servers-and-cloud-computing/aws-cdk/). From 98d91828e293d51f48385172bc40c3c53760ab55 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 16:40:57 -0500 Subject: [PATCH 095/137] removing draft flag --- .../servers-and-cloud-computing/aws-cdk/_index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index 2c6191f2a2..ea2c216c53 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -2,10 +2,6 @@ title: Deploy containers on Arm-based compute using Amazon ECS and the AWS CDK description: Learn how to define and deploy a containerized application on Arm-based compute using the AWS Cloud Development Kit. -draft: true -cascade: - draft: true - minutes_to_complete: 45 who_is_this_for: This is an introductory topic for software developers who want to use the AWS Cloud Development Kit (AWS CDK) to deploy applications on Arm-based AWS infrastructure. From 71f92c9a163ed84fa73bc655a136d99d2c4170ac Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Tue, 23 Jun 2026 16:42:04 -0500 Subject: [PATCH 096/137] description nit --- .../servers-and-cloud-computing/aws-cdk/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md index ea2c216c53..71bba85179 100644 --- a/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/aws-cdk/_index.md @@ -4,7 +4,7 @@ description: Learn how to define and deploy a containerized application on Arm-b minutes_to_complete: 45 -who_is_this_for: This is an introductory topic for software developers who want to use the AWS Cloud Development Kit (AWS CDK) to deploy applications on Arm-based AWS infrastructure. +who_is_this_for: This is an introductory topic for software developers who want to use the AWS Cloud Development Kit (AWS CDK) to deploy containerized applications on Arm-based AWS infrastructure. learning_objectives: - Create an example AWS CDK application in JavaScript From 500c796b8bfe7de45a0f57490685c5041132d118 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 10:38:35 -0500 Subject: [PATCH 097/137] adding summaries and faqs to automotive LPs --- .../automotive/openadkit1_container/_index.md | 50 +++++++++++++++- .../openadkit2_safetyisolation/_index.md | 57 ++++++++++++++++++- .../automotive/system76-auto/_index.md | 51 ++++++++++++++++- .../automotive/zenacssdebug/_index.md | 50 +++++++++++++++- 4 files changed, 203 insertions(+), 5 deletions(-) diff --git a/content/learning-paths/automotive/openadkit1_container/_index.md b/content/learning-paths/automotive/openadkit1_container/_index.md index dd2af119e6..3a9fb8a97c 100644 --- a/content/learning-paths/automotive/openadkit1_container/_index.md +++ b/content/learning-paths/automotive/openadkit1_container/_index.md @@ -15,9 +15,57 @@ prerequisites: - An Arm Neoverse cloud instance, or a local Arm Neoverse Linux computer with at least 16 CPUs and 32GB of RAM - Familiarity with Docker and Docker Compose +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-24T15:35:34Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 37913b2c4aed914d32dbdad054ebdd2b1d4587da3ede1a33ba81e3e68bf504a3 + summary_generated_at: '2026-06-24T15:35:34Z' + summary_source_hash: 37913b2c4aed914d32dbdad054ebdd2b1d4587da3ede1a33ba81e3e68bf504a3 + faq_generated_at: '2026-06-24T15:35:34Z' + faq_source_hash: 37913b2c4aed914d32dbdad054ebdd2b1d4587da3ede1a33ba81e3e68bf504a3 + summary: >- + This Learning Path guides learners through deploying and running a containerized Autoware + Open AD Kit simulation on Arm Neoverse using Docker and Docker Compose, within a SOAFEE-aligned + Shift-Left workflow. It introduces Software-Defined Vehicles and SOAFEE, then outlines ROS + 2 and Open AD Kit concepts used in the demo. Learners prepare an Arm Neoverse Linux system + and use Docker Compose to start the Visualizer first, followed by continuously executing Planning + and Simulation services defined in docker/docker-compose.yml. The workflow has been exercised + on both cloud (AWS EC2) and on-premise Arm Neoverse platforms, enabling evaluation on available + infrastructure. By the end, learners can launch the containers, inspect the compose file, + and recognize a running simulation on Arm Neoverse. + faqs: + - question: What result should I expect after launching the Docker Compose stack? + answer: >- + The Visualizer service starts in detached mode, followed by continuously running Planning + and Simulation services. Active containers for these components indicate the demo is operating + as intended. + - question: Where are the ROS 2 commands and service configurations defined? + answer: >- + They are defined in the docker/docker-compose.yml file. Reviewing that file shows the launch + order, container settings, and ROS 2 commands used by the demo. + - question: Can I run the same workflow on cloud and on-prem Arm Neoverse systems? + answer: >- + Yes. The example has been tested on AWS EC2 and an Ampere Altra workstation, so you can + choose either a cloud instance or an on-premise Arm Neoverse system. + - question: What should I check before starting the demo to avoid resource-related failures? + answer: >- + Verify the Arm Neoverse system provides at least 16 CPUs and 32 GB of RAM. Ensure Docker + and Docker Compose are installed and available. + - question: If I stop and restart the demo, do I need to reconfigure anything? + answer: >- + No. Docker Compose enables you to start with the previous session’s settings without modifications, + so the configuration persists between runs. +# END generated_summary_faq + author: Odin Shen -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 0bbae6a5c4..cb9da37843 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -16,11 +16,66 @@ prerequisites: - Completion of the [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) Learning Path - Basic familiarity with Docker +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-24T15:35:59Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf + summary_generated_at: '2026-06-24T15:35:59Z' + summary_source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf + faq_generated_at: '2026-06-24T15:35:59Z' + faq_source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf + summary: >- + This Learning Path guides learners through prototyping safety‑critical isolation for autonomous + driving workloads on Arm Neoverse by applying functional safety concepts, ISO 26262 and ASIL + guidance, and a safety‑island architecture. It frames how to separate safety‑critical control + logic from non‑safety functions, then connect components using a publish‑subscribe model (DDS/ROS + 2) within containerized deployments or across Arm‑based instances. The path emphasizes lifecycle + practices aligned with the V‑model, including clear requirements, version control, impact + analysis, and regression testing. By the end, learners organize simulation components into + isolated units with defined interfaces and documentation suitable for advancing ISO 26262‑oriented + development on Neoverse. + faqs: + - question: How do I decide which components belong on the safety island versus the general + ECU? + answer: >- + Place time‑critical, safety‑relevant control logic (for example, braking or steering) on + the safety island, and keep non‑critical features (such as infotainment) on the general + ECU. The goal is strong isolation, determinism, and minimized coupling for safety‑critical + paths. + - question: What should I verify to confirm the isolation boundaries are defined correctly? + answer: >- + Check that safety‑critical components run independently from non‑critical services and communicate + only through defined publish‑subscribe interfaces. Ensure data exchanged is minimal and + purpose‑specific so that safety logic is not impacted by unrelated functions. + - question: How do ISO 26262 ASIL levels influence my development workflow in this prototype? + answer: >- + Higher ASIL targets require more rigorous processes and evidence across the V‑model. For + example, ASIL‑D changes go through full impact analysis and regression testing to prevent + introducing new risks. + - question: Should I separate components using containers on one host or across multiple Arm + Neoverse instances? + answer: >- + Both approaches support prototyping: containers model software isolation on one system, + while multiple instances model stronger physical separation. Choose the option that best + matches the isolation assumptions you want to evaluate. + - question: What artifacts should I capture to support ISO 26262 traceability in this prototype? + answer: >- + Maintain clear safety requirements, rationale for the safety‑island split, defined DDS/ROS + 2 interfaces, and mapped tests to requirements. Record versioned changes, impact analyses, + and verification results aligned to the V‑model stages. +# END generated_summary_faq + author: - Odin Shen - Julien Jayat -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false diff --git a/content/learning-paths/automotive/system76-auto/_index.md b/content/learning-paths/automotive/system76-auto/_index.md index 6985d98f30..f98324ab6b 100644 --- a/content/learning-paths/automotive/system76-auto/_index.md +++ b/content/learning-paths/automotive/system76-auto/_index.md @@ -12,11 +12,58 @@ learning_objectives: - Build and run the Arm Automotive Solutions Software Reference Stack locally. prerequisites: - - A System76 Thelio Astra desktop computer running Ubuntu 24.04. + - A System76 Thelio Astra desktop computer running Ubuntu 24.04. + +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-24T15:36:29Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 2b758d2dcf28a683ab164e28578a736d6d730b81dfbc01a6765619052fcdebd0 + summary_generated_at: '2026-06-24T15:36:29Z' + summary_source_hash: 2b758d2dcf28a683ab164e28578a736d6d730b81dfbc01a6765619052fcdebd0 + faq_generated_at: '2026-06-24T15:36:29Z' + faq_source_hash: 2b758d2dcf28a683ab164e28578a736d6d730b81dfbc01a6765619052fcdebd0 + summary: >- + This Learning Path shows how to use a System76 Thelio Astra Arm desktop to build and run the + Arm Automotive Solutions Software Reference Stack in a local Multipass virtual machine. Learners + create an Ubuntu 20.04 guest, isolate builds, and clone the stack sources to compile Yocto-based + components targeting a Fixed Virtual Platform that models the Arm Reference Design‑1 AE. The + path introduces the Thelio Astra platform and the software stack context, then guides running + example applications. A highlighted example is the Parsec‑enabled TLS demo, which establishes + an HTTPS session to transfer a simple web page using Parsec services. Arm-based cloud instances + are noted as an alternative environment if a local build host is not preferred. + faqs: + - question: Which Multipass install guide should I follow before creating the VM? + answer: >- + Use the Multipass install guide for Arm Linux before starting the steps. This ensures Multipass + is set up correctly on the Thelio Astra running Ubuntu. + - question: Which Ubuntu release runs inside the Multipass virtual machine for this build? + answer: >- + The build is performed from the command line of an Ubuntu 20.04 Multipass virtual machine. + - question: Why use a Multipass VM on the Thelio Astra instead of building directly on the host? + answer: >- + A Multipass VM creates an isolated automotive development environment and lets you split + the resources of the Thelio Astra between development tasks. It keeps the build and test + process contained. + - question: What target platform is used when running the software stack examples? + answer: >- + The examples run on a Fixed Virtual Platform that models the Arm Reference Design‑1 AE (RD‑1 + AE) hardware system. + - question: What result should I expect from the Parsec-enabled TLS demo? + answer: >- + The demo establishes an HTTPS session and transfers a simple web page over a TLS connection. + Parsec provides the common API to the underlying security and cryptographic services used + by the demo. +# END generated_summary_faq author: Jason Andrews -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false diff --git a/content/learning-paths/automotive/zenacssdebug/_index.md b/content/learning-paths/automotive/zenacssdebug/_index.md index 84d35f8ca3..0abba69ed4 100644 --- a/content/learning-paths/automotive/zenacssdebug/_index.md +++ b/content/learning-paths/automotive/zenacssdebug/_index.md @@ -18,9 +18,57 @@ prerequisites: - Arm Development Studio 2024.1 or later with a valid license - for support see the [Install Guide for Arm DS](/install-guides/armds/) - Basic understanding of the Arm Zena CSS software stack, Armv8-A/Armv9-A cores, and Linux +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-24T15:37:11Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 74740788edbfe7ea09bf955455b4aeaed00e667fa8c9d68467353c1f64528b08 + summary_generated_at: '2026-06-24T15:37:11Z' + summary_source_hash: 74740788edbfe7ea09bf955455b4aeaed00e667fa8c9d68467353c1f64528b08 + faq_generated_at: '2026-06-24T15:37:11Z' + faq_source_hash: 74740788edbfe7ea09bf955455b4aeaed00e667fa8c9d68467353c1f64528b08 + summary: >- + This Learning Path guides developers through debugging the Arm Zena Compute Subsystem Reference + Software Stack on a Fixed Virtual Platform using Arm Development Studio. Learners launch the + FVP with the Iris debug server enabled, then create and save a custom Arm DS configuration + because no out-of-the-box target is provided. The workflow covers establishing connections + to each heterogeneous component—Cortex-M55–based Runtime Security Engine from reset with Trusted + Firmware-M symbols, Cortex-R82AE Safety Island firmware, and the Cortex-A720AE primary compute + cores—to debug the Linux kernel and user processes. By the end, learners create reusable .launch + files, step through early RSE boot, and attach to Safety Island and Linux targets to inspect + execution across the system. + faqs: + - question: Which FVP launch method should be used for debugging? + answer: >- + Use the launch invocation that enables the Iris debug server. The default build-environment + command runs the stack but does not enable Iris, so Arm Development Studio cannot connect. + - question: How should I organize and save my debug connections in Arm Development Studio? + answer: >- + Create a General Project to store the connection files and save each connection as a .launch + file. This makes it easy to reuse and enhance configurations for each subsystem. + - question: What is the expected workflow to debug the RSE from reset? + answer: >- + Start the FVP with Iris enabled and hold the model at reset, then connect from Arm Development + Studio. Load Trusted Firmware‑M symbols and step through the early boot code. + - question: Can I connect to all Zena CSS processors at the same time? + answer: >- + Yes. Arm Development Studio supports heterogeneous systems, so you can connect to the RSE, + Safety Island, and primary compute cores simultaneously, though you may prefer to set up + one connection fully before adding others. + - question: Why isn’t there a predefined Zena CSS target in Arm Development Studio? + answer: >- + As of Arm Development Studio 2025.0, there is no out-of-the-box configuration for the Zena + CSS FVP. Create one using the Iris interface as shown in the steps. +# END generated_summary_faq + author: Ronan Synnott -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false From f819369b95e8dfb763b9fa6b8196c9655c912839 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Wed, 24 Jun 2026 11:45:49 -0500 Subject: [PATCH 098/137] EKS cluster with Graviton nodes using Rafay --- .../rafay-eks/_index.md | 70 +++ .../rafay-eks/_next-steps.md | 8 + .../rafay-eks/cluster.md | 182 ++++++++ .../images/rafay-cloud-credential.webp | Bin 0 -> 8894 bytes .../rafay-eks/nginx.md | 169 +++++++ .../rafay-eks/setup.md | 441 ++++++++++++++++++ 6 files changed, 870 insertions(+) create mode 100644 content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/rafay-eks/_next-steps.md create mode 100644 content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md create mode 100644 content/learning-paths/servers-and-cloud-computing/rafay-eks/images/rafay-cloud-credential.webp create mode 100644 content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md create mode 100644 content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md new file mode 100644 index 0000000000..53f46080f4 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md @@ -0,0 +1,70 @@ +--- +title: "Deploy an EKS cluster with Graviton nodes using Rafay" + +description: Use the Rafay Kubernetes Operations Platform to provision an Amazon EKS cluster with an Arm Graviton node group and deploy NGINX to verify the setup. + +draft: true +cascade: + draft: true + +minutes_to_complete: 60 + +who_is_this_for: > + This is an advanced topic for software developers familiar with Kubernetes and AWS who want to learn how to use the Rafay platform to provision and manage EKS clusters backed by Arm Graviton instances. + +learning_objectives: + - Connect your AWS account to the Rafay platform using a cross-account IAM role + - Provision an Amazon EKS cluster with an Arm Graviton node group using Rafay + - Deploy and verify NGINX on Arm nodes and clean up all cloud resources + +prerequisites: + - An Amazon Web Services (AWS) [account](https://aws.amazon.com/) + - A [Rafay account](https://rafay.co) + - The [AWS CLI](/install-guides/aws-cli/) installed and configured + +author: Jason Andrews + +generate_summary_faq: true +rerun_summary: false +rerun_faqs: false + +### Tags +skilllevels: Advanced +subjects: Containers and Virtualization +cloud_service_providers: + - AWS +armips: + - Neoverse +operatingsystems: + - Linux +tools_software_languages: + - Kubernetes + - AWS Elastic Kubernetes Service (EKS) + - Rafay + - NGINX + - rctl + +# FIXED, DO NOT MODIFY +# ================================================================================ +further_reading: + - resource: + title: Rafay CLI overview + link: https://docs.rafay.co/cli/overview/ + type: documentation + - resource: + title: Amazon EKS documentation + link: https://aws.amazon.com/eks/ + type: documentation + - resource: + title: AWS Graviton processors + link: https://aws.amazon.com/ec2/graviton/ + type: documentation + - resource: + title: Kubernetes documentation + link: https://kubernetes.io/docs/home/ + type: documentation + +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # Indicates this should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_next-steps.md new file mode 100644 index 0000000000..727b395ddd --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # The weight controls the order of the pages. _index.md always has weight 1. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md new file mode 100644 index 0000000000..b14b9ad2a5 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md @@ -0,0 +1,182 @@ +--- +title: "Create the EKS cluster" +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +In this section, you define and provision an EKS cluster with a Graviton-based node group using Rafay's declarative manifest format. You then apply the manifest with RCTL, wait for the cluster to reach a ready state, and download the kubeconfig so you can interact with the cluster. + +## Create the cluster manifest + +The Rafay platform uses a declarative YAML manifest to define your EKS cluster. Create a file named `demo-eks-graviton.yaml` with the following content: + +```yaml +apiVersion: infra.k8smgmt.io/v3 +kind: Cluster +metadata: + # The name of the cluster + name: demo-eks-graviton + # The name of the project the cluster will be created in + project: defaultproject +spec: + blueprintConfig: + # The name of the blueprint the cluster will use + name: minimal + # The version of the blueprint the cluster will use + version: latest + # The name of the cloud credential that will be used to create the cluster + cloudCredentials: aws-cloud-credential + config: + # The EKS addons that will be applied to the cluster + addons: + - name: kube-proxy + version: latest + - name: vpc-cni + version: latest + - name: coredns + version: latest + managedNodeGroups: + # The AWS AMI family type the nodes will use + - amiFamily: AmazonLinux2023 + # The desired number of nodes that can run in the node group + desiredCapacity: 1 + iam: + withAddonPolicies: + # Enables the IAM policy for cluster autoscaler + autoScaler: true + # Allows for full ECR (Elastic Container Registry) access. This is useful for building, for example, a CI server that needs to push images to ECR + imageBuilder: true + # The AWS EC2 instance type that will be used for the nodes + instanceType: m7g.large + # The maximum number of nodes that can run in the node group + maxSize: 1 + # The minimum number of nodes that can run in the node group + minSize: 1 + # The name of the node group that will be created in AWS + name: graviton + metadata: + # The name of the cluster + name: demo-eks-graviton + # The AWS region the cluster will be created in + region: us-east-1 + # The tags that will be applied to the AWS cluster resources + tags: + email: user@rafay.co + env: qa + # The Kubernetes version that will be installed on the cluster + version: latest + vpc: + # AutoAllocateIPV6 requests an IPv6 CIDR block with /56 prefix for the VPC + autoAllocateIPv6: false + clusterEndpoints: + # Enables private access to the Kubernetes API server endpoints + privateAccess: true + # Enables public access to the Kubernetes API server endpoints + publicAccess: false + # The CIDR that will be used by the cluster VPC + cidr: 192.168.0.0/16 + type: aws-eks +``` + +Key fields to note: + +- `cloudCredentials` — must exactly match the credential name you entered in the Rafay console +- `project` - must be the project you attached the credential to +- `instanceType: m7g.large` — a Graviton3 instance with Arm Neoverse processors +- `publicAccess: false` — the Kubernetes API server has no public endpoint. You reach the cluster exclusively through RCTL, which routes traffic through the Rafay control plane. + +## Apply the cluster manifest + +Submit the manifest to Rafay using `rctl`: + +```console +rctl apply -f demo-eks-graviton.yaml +``` + +The output is similar to: + +```output +[ + { + "tasksetId": "ko9176k", + "tasksetOperations": [ + { + "operationName": "ClusterCreation", + "resourceName": "demo-eks-graviton", + "operationStatus": "PROVISION_TASK_STATUS_INPROGRESS" + }, + { + "operationName": "NodegroupCreation", + "resourceName": "graviton", + "operationStatus": "PROVISION_TASK_STATUS_PENDING" + }, + { + "operationName": "BlueprintSync", + "resourceName": "demo-eks-graviton", + "operationStatus": "PROVISION_TASK_STATUS_PENDING" + } + ], + "tasksetStatus": "PROVISION_TASKSET_STATUS_INPROGRESS", + "comments": "Configuration is being applied to the cluster" + } +] +``` + +## Monitor cluster provisioning + +Poll the cluster status until it reports `READY`. Provisioning typically takes 15–20 minutes as Rafay creates the VPC, EKS control plane, and managed node group. + +```console +rctl get cluster demo-eks-graviton +``` + +The output is similar to: + +```output ++-------------------+-----------------------------+---------+-----------+-----------+---------------------------+---------------------+ +| NAME | CREATED AT | TYPE | STATUS | BLUEPRINT | PROVISION STATUS | ENVIRONMENT CREATED | ++-------------------+-----------------------------+---------+-----------+-----------+---------------------------+---------------------+ +| demo-eks-graviton | 2026-06-24T15:32:19.936269Z | aws-eks | NOT_READY | minimal | INFRA_CREATION_INPROGRESS | false | ++-------------------+-----------------------------+---------+-----------+-----------+---------------------------+---------------------+ +``` + +While waiting, you can run the command again every few minutes. You will see various status values before the status changes to `READY`. You can also check the AWS CloudFormation console to see project and look for any stack errors. + +## Download the kubeconfig + +Once the cluster is `READY`, download the kubeconfig file: + +```console +rctl kubeconfig download --cluster demo-eks-graviton -f ~/.kube/demo-eks-graviton.kubeconfig +``` + +The output is similar to: + +```output +kubeconfig downloaded to ~/.kube/demo-eks-graviton.kubeconfig +``` + +Export the path so that `kubectl` uses this cluster: + +```console +export KUBECONFIG=~/.kube/demo-eks-graviton.kubeconfig +``` + +## Verify the nodes + +Confirm that the cluster has a running node and that it reports the `arm64` architecture: + +```console +kubectl get nodes -L kubernetes.io/arch +``` + +The output is similar to: + +```output +NAME STATUS ROLES AGE VERSION ARCH +ip-192-168-13-74.ec2.internal Ready 26m v1.36.2-eks-93b80c6 arm64 +``` + +The `arm64` value in the `ARCH` column confirms that the node is running on an AWS Graviton instance. Your EKS cluster is ready to accept workloads. In the next section, you will deploy NGINX to this cluster and verify it runs on the Graviton node. diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/images/rafay-cloud-credential.webp b/content/learning-paths/servers-and-cloud-computing/rafay-eks/images/rafay-cloud-credential.webp new file mode 100644 index 0000000000000000000000000000000000000000..b9dd2a8265e346c40960374912c87595da86bd30 GIT binary patch literal 8894 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 S3 80/TCP 30s +``` + +## Test NGINX connectivity + +The NGINX service is type `ClusterIP`, which means it has no external IP and is only reachable from within the cluster network. The cluster also has `publicAccess: false`, so there is no public Kubernetes API endpoint. Both constraints mean you cannot test connectivity from your laptop directly. Instead, run a one-off pod inside the cluster that sends a request to the service and then deletes itself: + +```console +kubectl run curl-test --rm -it --image=curlimages/curl --restart=Never -- curl http://nginx-arm-svc.nginx.svc +``` + +The output is similar to: + +```output + + + +Welcome to nginx! + + +

Welcome to nginx!

+

If you see this page, the nginx web server is successfully installed and +working. Further configuration is required.

+ + +pod "curl-test" deleted +``` + +The NGINX welcome page confirms that the workload is running and reachable on your Graviton-backed EKS cluster. + +## Clean up + +Remove the NGINX workload and then delete the cluster to avoid ongoing AWS charges. + +Delete the NGINX resources: + +```console +kubectl delete -f nginx-graviton.yaml +``` + +The output is similar to: + +```output +namespace "nginx" deleted +deployment.apps "nginx-arm-deployment" deleted +service "nginx-arm-svc" deleted +``` + +{{< notice warning >}} +Deleting the cluster through RCTL triggers the removal of the EKS control plane, managed node group, and associated CloudFormation stacks in your AWS account. If you do not run this command, AWS will continue to charge you for the running EC2 instances and EKS control plane. +{{< /notice >}} + +Delete the EKS cluster through Rafay: + +```console +rctl delete cluster demo-eks-graviton +``` + +## Summary + +In this Learning Path you: + +- Connected your AWS account to the Rafay platform using a cross-account IAM role and cloud credential. +- Provisioned a private Amazon EKS cluster with a Graviton (`m7g.large`) node group using a declarative Rafay manifest and `rctl`. +- Deployed NGINX with a `nodeSelector` that pins workloads to `arm64` nodes, confirming that Arm-native containers schedule and run correctly. +- Tested in-cluster connectivity using a one-off curl pod, and cleaned up all AWS and Rafay resources. + +Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, making it straightforward to run private, Graviton-backed EKS clusters at scale. diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md new file mode 100644 index 0000000000..981e9eed12 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md @@ -0,0 +1,441 @@ +--- +title: "Set up your environment" +weight: 2 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Before you begin + +[Rafay](https://rafay.co) is a Kubernetes operations platform that provisions, secures, and manages the full cluster lifecycle across public cloud, private, and hybrid environments. It provides a single control plane for fleet-wide operations including automated provisioning, upgrades, and governance. You can use Rafay to provision an Amazon EKS cluster with an Arm Graviton node group and deploy a workload to verify the setup. + +You need the following accounts and tools before starting this Learning Path: + +- An [AWS account](https://aws.amazon.com/) with sufficient IAM permissions to create roles, EKS clusters, EC2 instances, CloudFormation stacks, and related resources. +- A [Rafay account](https://console.rafay.dev). You can [sign up](https://console.rafay.dev/#/signup) if you do not have an account. +- The AWS CLI installed and configured with credentials that have the required permissions. + +Confirm your AWS CLI is working by running the following command, which prints your account and user information: + +```console +aws sts get-caller-identity +``` + +## Install kubectl + +Install the Kubernetes command-line tool, by following the [kubectl install guide](/install-guides/kubectl/). + +Confirm the installation: + +```console +kubectl version --client +``` + +The output is similar to: + +```output +Client Version: v1.32.1 +Kustomize Version: v5.5.0 +``` + +## Install RCTL + +RCTL is the Rafay CLI. You use it to submit cluster manifests, check cluster status, download kubeconfig files, and delete clusters. + +To download RCTL, log in to the Rafay console, navigate to **My Tools** > **Download CLI**, and download the binary for your operating system. + +The downloads are `.tar.bz2` files. + +On macOS with Apple Silicon extract the file with: + +```console +tar xvf rctl-darwin-arm64.tar.bz2 +``` + +On Arm Linux, use the filename: + +```console +tar xvf rctl-linux-arm64.tar.bz2 +``` + +{{% notice Note %}} +RCTL is also available for x86_64 Linux and Windows. Modify the filename to match your platform as needed. +{{% /notice %}} + +Move the binary to a directory in your search path: + +```console +sudo mv rctl /usr/local/bin/ +``` + +## Configure RCTL + +Download the RCTL configuration file from the Rafay console. Navigate to **My Tools** > **Download CLI Config** and save the file. + +The file name is formatted for your user information. + +Copy the downloaded file to a known location and initialize `rctl` with it: + +```console +cp ~/Downloads/.json ~/rafay-config.json +rctl config init ~/rafay-config.json +``` + +The config command doesn't have any output. + +Verify the installation: + +```console +rctl version +``` + +The output is similar to: + +```output +VERSION: r4.2.0 +BUILD: r4.2.0-1 +BUILD-TIME: Thu 04 Jun 2026 07:17:05 AM UTC +ARCH: darwin/arm64 +``` + +Confirm that `rctl` can reach the Rafay platform: + +```console +rctl config show +``` + +The output lists your account information, including the endpoints, keys, project, and organization information. + +## Create an AWS IAM role for Rafay + +Rafay provisions EKS resources in your AWS account using a cross-account IAM role. You need two values from the Rafay console before running the script: + +1. Log in to the Rafay console +2. Select **defaultproject** (or another project) from the project selector in the top navigation bar +3. Navigate to **Infrastructure** > **Cloud Credentials** > **New Credential**. +4. Select **AWS** as the provider select **ROLE**. Copy the **Rafay Account ID** and **External ID** displayed on the screen. You will pass these values to the script below. + +Save the following script as `create-rafay-role.sh`: + +```bash +#!/bin/bash +set -euo pipefail + +read -rp "Enter Rafay Account ID: " RAFAY_ACCOUNT_ID +read -rp "Enter External ID: " EXTERNAL_ID + +ROLE_NAME="RafayEKSProvisioner" +REGION="us-east-1" + +TRUST_POLICY=$(cat < **Cloud Credentials** > **New Credential** in the Rafay console +2. Paste the Role ARN into the **Role ARN** field. +4. Enter `aws-cloud-credential` as the credential name. +5. Click **Save**. + +![Screenshot of the Rafay console showing the cloud credential registration form with the AWS Role ARN field filled in #center](images/rafay-cloud-credential.webp "Registered AWS cloud credential in the Rafay console") + +You now have `kubectl` and `rctl` installed, `rctl` authenticated to Rafay, and an AWS cloud credential registered. You are ready to create the EKS cluster. From 3f735c965762c98344d66a16e8799f518f4bc5a2 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 12:33:41 -0500 Subject: [PATCH 099/137] updating generated summaries for style --- .../automotive/openadkit1_container/_index.md | 19 ++++++------------- .../openadkit2_safetyisolation/_index.md | 10 +++++----- .../automotive/system76-auto/_index.md | 16 ++++++---------- .../automotive/zenacssdebug/_index.md | 17 +++++++---------- 4 files changed, 24 insertions(+), 38 deletions(-) diff --git a/content/learning-paths/automotive/openadkit1_container/_index.md b/content/learning-paths/automotive/openadkit1_container/_index.md index 3a9fb8a97c..8e2edac98d 100644 --- a/content/learning-paths/automotive/openadkit1_container/_index.md +++ b/content/learning-paths/automotive/openadkit1_container/_index.md @@ -30,20 +30,13 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:35:34Z' faq_source_hash: 37913b2c4aed914d32dbdad054ebdd2b1d4587da3ede1a33ba81e3e68bf504a3 summary: >- - This Learning Path guides learners through deploying and running a containerized Autoware - Open AD Kit simulation on Arm Neoverse using Docker and Docker Compose, within a SOAFEE-aligned - Shift-Left workflow. It introduces Software-Defined Vehicles and SOAFEE, then outlines ROS - 2 and Open AD Kit concepts used in the demo. Learners prepare an Arm Neoverse Linux system - and use Docker Compose to start the Visualizer first, followed by continuously executing Planning - and Simulation services defined in docker/docker-compose.yml. The workflow has been exercised - on both cloud (AWS EC2) and on-premise Arm Neoverse platforms, enabling evaluation on available - infrastructure. By the end, learners can launch the containers, inspect the compose file, - and recognize a running simulation on Arm Neoverse. + In this Learning Path, you'll deploy a containerized Autoware + Open AD Kit simulation on Arm Neoverse using Docker and Docker Compose, within a SOAFEE-aligned Shift-Left workflow. You'll first learn about software-defined vehicles (SDVs), SOAFEE, ROS 2, and the Open AD Kit components used in the demo. You'll then prepare an Arm Neoverse Linux system and use Docker Compose to start the Open AD Kit visualizer, planning, and simulation services. By the end, you'll review a running simulation. The workflow has been tested on both cloud (Amazon EC2) and on-premise Arm Neoverse platforms. faqs: - question: What result should I expect after launching the Docker Compose stack? answer: >- - The Visualizer service starts in detached mode, followed by continuously running Planning - and Simulation services. Active containers for these components indicate the demo is operating + The visualizer service starts in detached mode, followed by continuously running planning + and simulation services. Active containers for these components indicate the demo is operating as intended. - question: Where are the ROS 2 commands and service configurations defined? answer: >- @@ -51,7 +44,7 @@ generated_summary_faq: order, container settings, and ROS 2 commands used by the demo. - question: Can I run the same workflow on cloud and on-prem Arm Neoverse systems? answer: >- - Yes. The example has been tested on AWS EC2 and an Ampere Altra workstation, so you can + Yes. The worklow has been tested on Amazon EC2 and an Ampere Altra workstation, so you can choose either a cloud instance or an on-premise Arm Neoverse system. - question: What should I check before starting the demo to avoid resource-related failures? answer: >- @@ -59,7 +52,7 @@ generated_summary_faq: and Docker Compose are installed and available. - question: If I stop and restart the demo, do I need to reconfigure anything? answer: >- - No. Docker Compose enables you to start with the previous session’s settings without modifications, + No. Docker Compose allows you to start with the previous session’s settings without modifications, so the configuration persists between runs. # END generated_summary_faq diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index cb9da37843..f9ad28bb7b 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -31,15 +31,15 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:35:59Z' faq_source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf summary: >- - This Learning Path guides learners through prototyping safety‑critical isolation for autonomous + In this Learning Path, you'll learn about prototyping safety‑critical isolation for autonomous driving workloads on Arm Neoverse by applying functional safety concepts, ISO 26262 and ASIL - guidance, and a safety‑island architecture. It frames how to separate safety‑critical control + guidance, and a safety‑island architecture. You'll understand how to separate safety‑critical control logic from non‑safety functions, then connect components using a publish‑subscribe model (DDS/ROS - 2) within containerized deployments or across Arm‑based instances. The path emphasizes lifecycle + 2) within containerized deployments or across Arm‑based instances. You'll explore lifecycle practices aligned with the V‑model, including clear requirements, version control, impact - analysis, and regression testing. By the end, learners organize simulation components into + analysis, and regression testing. By the end, you'll organize simulation components into isolated units with defined interfaces and documentation suitable for advancing ISO 26262‑oriented - development on Neoverse. + development on Arm Neoverse. faqs: - question: How do I decide which components belong on the safety island versus the general ECU? diff --git a/content/learning-paths/automotive/system76-auto/_index.md b/content/learning-paths/automotive/system76-auto/_index.md index f98324ab6b..3c0e1138fc 100644 --- a/content/learning-paths/automotive/system76-auto/_index.md +++ b/content/learning-paths/automotive/system76-auto/_index.md @@ -29,23 +29,19 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:36:29Z' faq_source_hash: 2b758d2dcf28a683ab164e28578a736d6d730b81dfbc01a6765619052fcdebd0 summary: >- - This Learning Path shows how to use a System76 Thelio Astra Arm desktop to build and run the - Arm Automotive Solutions Software Reference Stack in a local Multipass virtual machine. Learners - create an Ubuntu 20.04 guest, isolate builds, and clone the stack sources to compile Yocto-based - components targeting a Fixed Virtual Platform that models the Arm Reference Design‑1 AE. The - path introduces the Thelio Astra platform and the software stack context, then guides running - example applications. A highlighted example is the Parsec‑enabled TLS demo, which establishes - an HTTPS session to transfer a simple web page using Parsec services. Arm-based cloud instances - are noted as an alternative environment if a local build host is not preferred. + In this Learning Path, you'll use a System76 Thelio Astra Arm desktop to build and run the + Arm Automotive Solutions Software Reference Stack in a local Multipass virtual machine. You'll + create an Ubuntu 20.04 guest, isolate builds, and compile Yocto-based + components targeting a Fixed Virtual Platform that models the Arm Reference Design-1 AE. You'll review the Thelio Astra platform and the software stack context, then run a Parsec-enabled TLS demo that establishes an HTTPS session to transfer a web page. faqs: - - question: Which Multipass install guide should I follow before creating the VM? + - question: Which Multipass install guide should I follow before creating the virtual machine? answer: >- Use the Multipass install guide for Arm Linux before starting the steps. This ensures Multipass is set up correctly on the Thelio Astra running Ubuntu. - question: Which Ubuntu release runs inside the Multipass virtual machine for this build? answer: >- The build is performed from the command line of an Ubuntu 20.04 Multipass virtual machine. - - question: Why use a Multipass VM on the Thelio Astra instead of building directly on the host? + - question: Why use a Multipass virtual machine on the Thelio Astra instead of building directly on the host? answer: >- A Multipass VM creates an isolated automotive development environment and lets you split the resources of the Thelio Astra between development tasks. It keeps the build and test diff --git a/content/learning-paths/automotive/zenacssdebug/_index.md b/content/learning-paths/automotive/zenacssdebug/_index.md index 0abba69ed4..b7dafbef1a 100644 --- a/content/learning-paths/automotive/zenacssdebug/_index.md +++ b/content/learning-paths/automotive/zenacssdebug/_index.md @@ -33,23 +33,20 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:37:11Z' faq_source_hash: 74740788edbfe7ea09bf955455b4aeaed00e667fa8c9d68467353c1f64528b08 summary: >- - This Learning Path guides developers through debugging the Arm Zena Compute Subsystem Reference - Software Stack on a Fixed Virtual Platform using Arm Development Studio. Learners launch the - FVP with the Iris debug server enabled, then create and save a custom Arm DS configuration - because no out-of-the-box target is provided. The workflow covers establishing connections - to each heterogeneous component—Cortex-M55–based Runtime Security Engine from reset with Trusted - Firmware-M symbols, Cortex-R82AE Safety Island firmware, and the Cortex-A720AE primary compute - cores—to debug the Linux kernel and user processes. By the end, learners create reusable .launch + In this Learning Path, you'll debug the Arm Zena Compute Subsystem (CSS) reference + software stack on a Fixed Virtual Platform using Arm Development Studio. You'll launch the + FVP with the Iris debug server enabled, then create and save a custom Arm DS configuration. You'll establish connections + to each heterogeneous component within Zena CSS to debug the Linux kernel and user processes. By the end, you'll create reusable `.launch` files, step through early RSE boot, and attach to Safety Island and Linux targets to inspect execution across the system. faqs: - - question: Which FVP launch method should be used for debugging? + - question: Which FVP launch method should I use for debugging? answer: >- Use the launch invocation that enables the Iris debug server. The default build-environment command runs the stack but does not enable Iris, so Arm Development Studio cannot connect. - question: How should I organize and save my debug connections in Arm Development Studio? answer: >- - Create a General Project to store the connection files and save each connection as a .launch + Create a General Project to store the connection files and save each connection as a `.launch` file. This makes it easy to reuse and enhance configurations for each subsystem. - question: What is the expected workflow to debug the RSE from reset? answer: >- @@ -63,7 +60,7 @@ generated_summary_faq: - question: Why isn’t there a predefined Zena CSS target in Arm Development Studio? answer: >- As of Arm Development Studio 2025.0, there is no out-of-the-box configuration for the Zena - CSS FVP. Create one using the Iris interface as shown in the steps. + CSS FVP. Create one using the Iris interface as shown in the Learning Path. # END generated_summary_faq author: Ronan Synnott From e60c3b8e970171d6ab5f7aa3228a971fd0f88cef Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 13:02:48 -0500 Subject: [PATCH 100/137] may -> might --- content/learning-paths/automotive/zenacssdebug/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/automotive/zenacssdebug/_index.md b/content/learning-paths/automotive/zenacssdebug/_index.md index b7dafbef1a..9339cf9b13 100644 --- a/content/learning-paths/automotive/zenacssdebug/_index.md +++ b/content/learning-paths/automotive/zenacssdebug/_index.md @@ -55,7 +55,7 @@ generated_summary_faq: - question: Can I connect to all Zena CSS processors at the same time? answer: >- Yes. Arm Development Studio supports heterogeneous systems, so you can connect to the RSE, - Safety Island, and primary compute cores simultaneously, though you may prefer to set up + Safety Island, and primary compute cores simultaneously, though you might prefer to set up one connection fully before adding others. - question: Why isn’t there a predefined Zena CSS target in Arm Development Studio? answer: >- From 79693715119e1449aaa698010232603bcc7151cd Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 14:49:34 -0500 Subject: [PATCH 101/137] first pass edits --- .../rafay-eks/cluster.md | 25 +++++++++------ .../rafay-eks/nginx.md | 26 +++++++--------- .../rafay-eks/setup.md | 31 +++++++++++-------- 3 files changed, 45 insertions(+), 37 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md index b14b9ad2a5..ef2b657f4b 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md @@ -1,16 +1,16 @@ --- -title: "Create the EKS cluster" +title: Create an Amazon EKS cluster weight: 3 ### FIXED, DO NOT MODIFY layout: learningpathall --- -In this section, you define and provision an EKS cluster with a Graviton-based node group using Rafay's declarative manifest format. You then apply the manifest with RCTL, wait for the cluster to reach a ready state, and download the kubeconfig so you can interact with the cluster. - ## Create the cluster manifest -The Rafay platform uses a declarative YAML manifest to define your EKS cluster. Create a file named `demo-eks-graviton.yaml` with the following content: +The Rafay platform uses a declarative YAML manifest to define your EKS cluster. + +Create a file named `demo-eks-graviton.yaml` with the following content: ```yaml apiVersion: infra.k8smgmt.io/v3 @@ -48,7 +48,7 @@ spec: autoScaler: true # Allows for full ECR (Elastic Container Registry) access. This is useful for building, for example, a CI server that needs to push images to ECR imageBuilder: true - # The AWS EC2 instance type that will be used for the nodes + # The Amazon EC2 instance type that will be used for the nodes instanceType: m7g.large # The maximum number of nodes that can run in the node group maxSize: 1 @@ -126,11 +126,12 @@ The output is similar to: ## Monitor cluster provisioning -Poll the cluster status until it reports `READY`. Provisioning typically takes 15–20 minutes as Rafay creates the VPC, EKS control plane, and managed node group. +Poll the cluster status until it reports `READY`: ```console rctl get cluster demo-eks-graviton ``` +Provisioning typically takes 15–20 minutes as Rafay creates the VPC, EKS control plane, and managed node group. The output is similar to: @@ -142,11 +143,11 @@ The output is similar to: +-------------------+-----------------------------+---------+-----------+-----------+---------------------------+---------------------+ ``` -While waiting, you can run the command again every few minutes. You will see various status values before the status changes to `READY`. You can also check the AWS CloudFormation console to see project and look for any stack errors. +While waiting, you can run the command again every few minutes. You'll see various status values before the status changes to `READY`. You can also check the AWS CloudFormation console to see project and look for any stack errors. ## Download the kubeconfig -Once the cluster is `READY`, download the kubeconfig file: +After the cluster is `READY`, download the kubeconfig file: ```console rctl kubeconfig download --cluster demo-eks-graviton -f ~/.kube/demo-eks-graviton.kubeconfig @@ -179,4 +180,10 @@ NAME STATUS ROLES AGE VERSION AR ip-192-168-13-74.ec2.internal Ready 26m v1.36.2-eks-93b80c6 arm64 ``` -The `arm64` value in the `ARCH` column confirms that the node is running on an AWS Graviton instance. Your EKS cluster is ready to accept workloads. In the next section, you will deploy NGINX to this cluster and verify it runs on the Graviton node. +The `arm64` value in the `ARCH` column confirms that the node is running on an AWS Graviton instance. Your EKS cluster is ready to accept workloads. + +## What you've accomplished and what's next + +You've now defined and provisioned an Amazon EKS cluster with a Graviton-based node group using Rafay's declarative manifest format. You then applied the manifest with RCTL, waited for the cluster to reach a ready state, and downloaded the kubeconfig so you can interact with the cluster. + +In the next section, you'll deploy NGINX to this cluster and verify it runs on the Graviton-based node. diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md index 6f1c2cbba1..f8c5879164 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md @@ -1,16 +1,14 @@ --- -title: "Deploy NGINX and clean up" +title: Deploy NGINX to the Amazon EKS cluster and clean up weight: 4 ### FIXED, DO NOT MODIFY layout: learningpathall --- -With the cluster running, you can now validate it by deploying a workload. In this section, you deploy NGINX using a manifest that pins pods to `arm64` nodes, verify the pod reaches a `Running` state, and test connectivity from inside the cluster. You then clean up all provisioned resources. - ## Deploy NGINX -With the EKS cluster running on Graviton nodes, deploy NGINX to confirm that arm64 workloads schedule and run correctly. +With the Amazon EKS cluster running on Graviton nodes, deploy NGINX to confirm that `arm64` workloads schedule and run correctly. Create a file named `nginx-graviton.yaml` with the following content: @@ -104,7 +102,9 @@ nginx-arm-svc ClusterIP 10.100.42.137 80/TCP 30s ## Test NGINX connectivity -The NGINX service is type `ClusterIP`, which means it has no external IP and is only reachable from within the cluster network. The cluster also has `publicAccess: false`, so there is no public Kubernetes API endpoint. Both constraints mean you cannot test connectivity from your laptop directly. Instead, run a one-off pod inside the cluster that sends a request to the service and then deletes itself: +The NGINX service is type `ClusterIP`, which means it has no external IP and is reachable only from within the cluster network. The cluster also has `publicAccess: false`, so there's no public Kubernetes API endpoint. Both constraints mean you can't test connectivity from your laptop directly. + +Instead, run a one-off pod inside the cluster that sends a request to the service and then deletes itself: ```console kubectl run curl-test --rm -it --image=curlimages/curl --restart=Never -- curl http://nginx-arm-svc.nginx.svc @@ -127,9 +127,9 @@ working. Further configuration is required.

pod "curl-test" deleted ``` -The NGINX welcome page confirms that the workload is running and reachable on your Graviton-backed EKS cluster. +The NGINX welcome page confirms that the workload is running and reachable on your Graviton-based EKS cluster. -## Clean up +## Clean up resources Remove the NGINX workload and then delete the cluster to avoid ongoing AWS charges. @@ -148,7 +148,7 @@ service "nginx-arm-svc" deleted ``` {{< notice warning >}} -Deleting the cluster through RCTL triggers the removal of the EKS control plane, managed node group, and associated CloudFormation stacks in your AWS account. If you do not run this command, AWS will continue to charge you for the running EC2 instances and EKS control plane. +Deleting the cluster through RCTL triggers the removal of the EKS control plane, managed node group, and associated CloudFormation stacks in your AWS account. If you don't run this command, AWS will continue to charge you for the running EC2 instances and EKS control plane. {{< /notice >}} Delete the EKS cluster through Rafay: @@ -157,13 +157,9 @@ Delete the EKS cluster through Rafay: rctl delete cluster demo-eks-graviton ``` -## Summary +## What you've accomplished -In this Learning Path you: +You've now deployed NGINX using a manifest that pins pods to `arm64` nodes, verify the pod reaches a `Running` state, and test connectivity from inside the cluster. You then cleaned up all provisioned resources. -- Connected your AWS account to the Rafay platform using a cross-account IAM role and cloud credential. -- Provisioned a private Amazon EKS cluster with a Graviton (`m7g.large`) node group using a declarative Rafay manifest and `rctl`. -- Deployed NGINX with a `nodeSelector` that pins workloads to `arm64` nodes, confirming that Arm-native containers schedule and run correctly. -- Tested in-cluster connectivity using a one-off curl pod, and cleaned up all AWS and Rafay resources. +Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, making it straightforward to run private, Graviton-based EKS clusters at scale. -Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, making it straightforward to run private, Graviton-backed EKS clusters at scale. diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md index 981e9eed12..67220e1862 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md @@ -1,5 +1,5 @@ --- -title: "Set up your environment" +title: Set up your environment weight: 2 ### FIXED, DO NOT MODIFY @@ -8,13 +8,13 @@ layout: learningpathall ## Before you begin -[Rafay](https://rafay.co) is a Kubernetes operations platform that provisions, secures, and manages the full cluster lifecycle across public cloud, private, and hybrid environments. It provides a single control plane for fleet-wide operations including automated provisioning, upgrades, and governance. You can use Rafay to provision an Amazon EKS cluster with an Arm Graviton node group and deploy a workload to verify the setup. +[Rafay](https://rafay.co) is a Kubernetes operations platform that provisions, secures, and manages the full cluster lifecycle across public cloud, private, and hybrid environments. It provides a single control plane for fleet-wide operations including automated provisioning, upgrades, and governance. In this Learning Path, you'll use Rafay to provision an Amazon EKS cluster with an AWS Graviton-based node group and deploy a workload to verify the setup. You need the following accounts and tools before starting this Learning Path: - An [AWS account](https://aws.amazon.com/) with sufficient IAM permissions to create roles, EKS clusters, EC2 instances, CloudFormation stacks, and related resources. - A [Rafay account](https://console.rafay.dev). You can [sign up](https://console.rafay.dev/#/signup) if you do not have an account. -- The AWS CLI installed and configured with credentials that have the required permissions. +- The AWS CLI installed and configured with credentials that have the required permissions. For setup instructions, see the [AWS CLI](/install-guides/aws-cli/) and the [AWS Credentials](/install-guides/aws_access_keys/) install guides. Confirm your AWS CLI is working by running the following command, which prints your account and user information: @@ -41,13 +41,13 @@ Kustomize Version: v5.5.0 ## Install RCTL -RCTL is the Rafay CLI. You use it to submit cluster manifests, check cluster status, download kubeconfig files, and delete clusters. +RCTL is the Rafay CLI. You'll use it to submit cluster manifests, check cluster status, download kubeconfig files, and delete clusters. To download RCTL, log in to the Rafay console, navigate to **My Tools** > **Download CLI**, and download the binary for your operating system. The downloads are `.tar.bz2` files. -On macOS with Apple Silicon extract the file with: +On macOS with Apple Silicon, extract the file with: ```console tar xvf rctl-darwin-arm64.tar.bz2 @@ -114,7 +114,7 @@ Rafay provisions EKS resources in your AWS account using a cross-account IAM rol 1. Log in to the Rafay console 2. Select **defaultproject** (or another project) from the project selector in the top navigation bar 3. Navigate to **Infrastructure** > **Cloud Credentials** > **New Credential**. -4. Select **AWS** as the provider select **ROLE**. Copy the **Rafay Account ID** and **External ID** displayed on the screen. You will pass these values to the script below. +4. Select **AWS** as the provider select **ROLE**. Copy the **Rafay Account ID** and **External ID** displayed on the screen. You will pass these values to the script that follows. Save the following script as `create-rafay-role.sh`: @@ -411,9 +411,9 @@ chmod +x create-rafay-role.sh ./create-rafay-role.sh ``` -You are prompted for the Account ID nad External ID. Enter these values from the previous step. +You'll be prompted for the Account ID nad External ID. Enter these values from the previous step. -The output is shown below. The Account ID and External ID are sample values. +The output is similar to: ```output Enter Rafay Account ID: 123456789012 @@ -424,18 +424,23 @@ Attaching inline policy to role Role ARN (copy this value into the Rafay console): arn:aws:iam::111122223333:role/Proj-RafayEKSProvisioner ``` +The `Account ID`, `External ID`, and `Role ARN` are sample values. -Copy the Role ARN from the output. +Copy the `Role ARN` from the output. ## Register the cloud credential in Rafay -With the Role ARN copied, complete the credential registration in the Rafay console: +With the `Role ARN` copied, complete the credential registration in the Rafay console: 1. Return to **Infrastructure** > **Cloud Credentials** > **New Credential** in the Rafay console -2. Paste the Role ARN into the **Role ARN** field. +2. Paste the `Role ARN` into the **Role ARN** field. 4. Enter `aws-cloud-credential` as the credential name. -5. Click **Save**. +5. Select **Save**. ![Screenshot of the Rafay console showing the cloud credential registration form with the AWS Role ARN field filled in #center](images/rafay-cloud-credential.webp "Registered AWS cloud credential in the Rafay console") -You now have `kubectl` and `rctl` installed, `rctl` authenticated to Rafay, and an AWS cloud credential registered. You are ready to create the EKS cluster. +## What you've accomplished and what's next + +You've now installed `kubectl` and `rctl`, authenticated `rctl` to Rafay, and registered an AWS cloud credential. + +Next, you'll create the EKS cluster. From ae2e1c6af0f2085d7fcb61faadd9a12dc43d3e35 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 15:23:00 -0500 Subject: [PATCH 102/137] second pass --- .../rafay-eks/cluster.md | 4 ++-- .../servers-and-cloud-computing/rafay-eks/nginx.md | 6 +++--- .../servers-and-cloud-computing/rafay-eks/setup.md | 14 ++++++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md index ef2b657f4b..7fdeaa01c6 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md @@ -84,7 +84,7 @@ Key fields to note: - `cloudCredentials` — must exactly match the credential name you entered in the Rafay console - `project` - must be the project you attached the credential to -- `instanceType: m7g.large` — a Graviton3 instance with Arm Neoverse processors +- `instanceType: m7g.large` — a Graviton3-based instance with Arm Neoverse processors - `publicAccess: false` — the Kubernetes API server has no public endpoint. You reach the cluster exclusively through RCTL, which routes traffic through the Rafay control plane. ## Apply the cluster manifest @@ -143,7 +143,7 @@ The output is similar to: +-------------------+-----------------------------+---------+-----------+-----------+---------------------------+---------------------+ ``` -While waiting, you can run the command again every few minutes. You'll see various status values before the status changes to `READY`. You can also check the AWS CloudFormation console to see project and look for any stack errors. +While waiting, you can run the command again every few minutes. You'll see various status values before the status changes to `READY`. You can also check the AWS CloudFormation console to look for any stack errors. ## Download the kubeconfig diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md index f8c5879164..dfff9ec197 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md @@ -8,7 +8,7 @@ layout: learningpathall ## Deploy NGINX -With the Amazon EKS cluster running on Graviton nodes, deploy NGINX to confirm that `arm64` workloads schedule and run correctly. +With the Amazon EKS cluster running on Graviton-based nodes, deploy NGINX to confirm that `arm64` workloads schedule and run correctly. Create a file named `nginx-graviton.yaml` with the following content: @@ -102,7 +102,7 @@ nginx-arm-svc ClusterIP 10.100.42.137 80/TCP 30s ## Test NGINX connectivity -The NGINX service is type `ClusterIP`, which means it has no external IP and is reachable only from within the cluster network. The cluster also has `publicAccess: false`, so there's no public Kubernetes API endpoint. Both constraints mean you can't test connectivity from your laptop directly. +The NGINX service is type `ClusterIP`, which means it has no external IP and is reachable only from within the cluster network. The cluster also has `publicAccess: false`, so there's no public Kubernetes API endpoint. Both constraints mean you can't test connectivity from your local machine directly. Instead, run a one-off pod inside the cluster that sends a request to the service and then deletes itself: @@ -159,7 +159,7 @@ rctl delete cluster demo-eks-graviton ## What you've accomplished -You've now deployed NGINX using a manifest that pins pods to `arm64` nodes, verify the pod reaches a `Running` state, and test connectivity from inside the cluster. You then cleaned up all provisioned resources. +You've now deployed NGINX using a manifest that pins pods to `arm64` nodes, verified the pod reaches a `Running` state, and tested connectivity from inside the cluster. You then cleaned up all provisioned resources. Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, making it straightforward to run private, Graviton-based EKS clusters at scale. diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md index 67220e1862..c47215ac97 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md @@ -1,5 +1,5 @@ --- -title: Set up your environment +title: Set up Rafay and AWS access weight: 2 ### FIXED, DO NOT MODIFY @@ -8,7 +8,9 @@ layout: learningpathall ## Before you begin -[Rafay](https://rafay.co) is a Kubernetes operations platform that provisions, secures, and manages the full cluster lifecycle across public cloud, private, and hybrid environments. It provides a single control plane for fleet-wide operations including automated provisioning, upgrades, and governance. In this Learning Path, you'll use Rafay to provision an Amazon EKS cluster with an AWS Graviton-based node group and deploy a workload to verify the setup. +[Rafay](https://rafay.co) is a Kubernetes operations platform that provisions, secures, and manages the full cluster lifecycle across public cloud, private, and hybrid environments. It provides a single control plane for fleet-wide operations including automated provisioning, upgrades, and governance. + +In this Learning Path, you'll use Rafay to provision an Amazon EKS cluster with an AWS Graviton-based node group and deploy a workload to verify the setup. You need the following accounts and tools before starting this Learning Path: @@ -114,7 +116,7 @@ Rafay provisions EKS resources in your AWS account using a cross-account IAM rol 1. Log in to the Rafay console 2. Select **defaultproject** (or another project) from the project selector in the top navigation bar 3. Navigate to **Infrastructure** > **Cloud Credentials** > **New Credential**. -4. Select **AWS** as the provider select **ROLE**. Copy the **Rafay Account ID** and **External ID** displayed on the screen. You will pass these values to the script that follows. +4. Select **AWS** as the provider, then select **ROLE**. Copy the **Rafay Account ID** and **External ID** displayed on the screen. You'll pass these values to the script that follows. Save the following script as `create-rafay-role.sh`: @@ -411,7 +413,7 @@ chmod +x create-rafay-role.sh ./create-rafay-role.sh ``` -You'll be prompted for the Account ID nad External ID. Enter these values from the previous step. +You'll be prompted for the Account ID and External ID. Enter these values from the previous step. The output is similar to: @@ -434,8 +436,8 @@ With the `Role ARN` copied, complete the credential registration in the Rafay co 1. Return to **Infrastructure** > **Cloud Credentials** > **New Credential** in the Rafay console 2. Paste the `Role ARN` into the **Role ARN** field. -4. Enter `aws-cloud-credential` as the credential name. -5. Select **Save**. +3. Enter `aws-cloud-credential` as the credential name. +4. Select **Save**. ![Screenshot of the Rafay console showing the cloud credential registration form with the AWS Role ARN field filled in #center](images/rafay-cloud-credential.webp "Registered AWS cloud credential in the Rafay console") From 06a103a438a3b6565122586e023455344048506b Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 15:27:24 -0500 Subject: [PATCH 103/137] adding descriptions to each page --- .../servers-and-cloud-computing/rafay-eks/cluster.md | 1 + .../servers-and-cloud-computing/rafay-eks/nginx.md | 1 + .../servers-and-cloud-computing/rafay-eks/setup.md | 1 + 3 files changed, 3 insertions(+) diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md index 7fdeaa01c6..ce61e59acf 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md @@ -1,5 +1,6 @@ --- title: Create an Amazon EKS cluster +description: Create and apply a Rafay cluster manifest to provision an Amazon EKS cluster with an AWS Graviton-based node group, then download kubeconfig and verify the nodes report arm64. weight: 3 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md index dfff9ec197..de75f89964 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md @@ -1,5 +1,6 @@ --- title: Deploy NGINX to the Amazon EKS cluster and clean up +description: Deploy NGINX to an Amazon EKS cluster on AWS Graviton-based nodes, test in-cluster connectivity, and clean up the Kubernetes and cloud resources. weight: 4 ### FIXED, DO NOT MODIFY diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md index c47215ac97..28f887f6c5 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md @@ -1,5 +1,6 @@ --- title: Set up Rafay and AWS access +description: Install kubectl and rctl, configure Rafay CLI access, and register an AWS cloud credential so Rafay can provision a Graviton-based Amazon EKS cluster. weight: 2 ### FIXED, DO NOT MODIFY From 1d44281f2213b79bf0e622dc00f0b10a4fe07bb8 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 16:01:45 -0500 Subject: [PATCH 104/137] adding summary and faqs --- .../rafay-eks/_index.md | 65 ++++++++++++++++--- .../rafay-eks/cluster.md | 2 +- 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md index 53f46080f4..ea5b7c0ce7 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md @@ -1,30 +1,74 @@ --- -title: "Deploy an EKS cluster with Graviton nodes using Rafay" +title: Deploy an Amazon EKS cluster with AWS Graviton-based nodes using Rafay -description: Use the Rafay Kubernetes Operations Platform to provision an Amazon EKS cluster with an Arm Graviton node group and deploy NGINX to verify the setup. +description: Use the Rafay Kubernetes Operations Platform to provision an Amazon EKS cluster with an AWS Graviton-based node group and deploy NGINX to verify the setup. -draft: true -cascade: - draft: true minutes_to_complete: 60 who_is_this_for: > - This is an advanced topic for software developers familiar with Kubernetes and AWS who want to learn how to use the Rafay platform to provision and manage EKS clusters backed by Arm Graviton instances. + This is an advanced topic for software developers familiar with Kubernetes and AWS who want to learn how to use the Rafay platform to provision and manage EKS clusters backed by AWS Graviton-based instances. learning_objectives: - Connect your AWS account to the Rafay platform using a cross-account IAM role - - Provision an Amazon EKS cluster with an Arm Graviton node group using Rafay - - Deploy and verify NGINX on Arm nodes and clean up all cloud resources + - Provision an Amazon EKS cluster with an AWS Graviton-based node group using Rafay + - Deploy and verify NGINX on arm64 nodes and clean up all cloud resources prerequisites: - An Amazon Web Services (AWS) [account](https://aws.amazon.com/) - A [Rafay account](https://rafay.co) - The [AWS CLI](/install-guides/aws-cli/) installed and configured +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-24T20:45:31Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 76cbd5e4b3a61e9604e0df9b3ba2a5e5af4aa9a0c295ece3c4ee5a98ec365630 + summary_generated_at: '2026-06-24T20:45:31Z' + summary_source_hash: 76cbd5e4b3a61e9604e0df9b3ba2a5e5af4aa9a0c295ece3c4ee5a98ec365630 + faq_generated_at: '2026-06-24T20:45:31Z' + faq_source_hash: 76cbd5e4b3a61e9604e0df9b3ba2a5e5af4aa9a0c295ece3c4ee5a98ec365630 + summary: >- + In this Learning Path, you'll provision an Amazon EKS cluster on Arm using + the Rafay Kubernetes Operations Platform and validate workloads on AWS Graviton-based nodes. + You'll define a declarative cluster manifest in Rafay referencing an existing project, + blueprint, and cloud credential. Then, you'll create the EKS cluster and deploy NGINX pinned to arm64 + to confirm scheduling on Graviton-based instances. Finally, you'll remove the NGINX workload and deprovision the EKS resources to avoid ongoing cloud costs. + faqs: + - question: How do I know the AWS connection to Rafay is set up correctly before creating the + cluster? + answer: >- + Ensure the cross-account IAM role is configured in AWS and added to Rafay as a cloud credential. + In the cluster manifest, reference this credential by name. If it's missing or has insufficient + permissions, cluster creation will fail. + - question: Which fields in the Rafay cluster manifest must match existing configuration? + answer: >- + The project, blueprint name and version, and the cloud credential must already exist in + Rafay. If any of these do not match, the cluster won't be created. + - question: What result should I expect when the EKS cluster is ready to use? + answer: >- + A running cluster with a Graviton-based (`arm64`) node group will be available for workloads. + Nodes should advertise the label `kubernetes.io/arch=arm64`, indicating they can run `arm64` + pods. + - question: How do I verify that the NGINX deployment is running on Graviton nodes? + answer: >- + The provided manifest pins the pods using `nodeSelector: kubernetes.io/arch: arm64`. After + deployment, the pod should schedule and run on nodes labeled `arm64`. If it remains `Pending`, + verify the node group is active and the selector matches node labels. + - question: What should I cleanup to avoid ongoing AWS charges? + answer: >- + Delete the NGINX workload and namespace created for the test, then deprovision the EKS cluster + from Rafay. This releases the associated AWS resources. +# END generated_summary_faq + author: Jason Andrews -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false @@ -53,7 +97,7 @@ further_reading: type: documentation - resource: title: Amazon EKS documentation - link: https://aws.amazon.com/eks/ + link: https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html type: documentation - resource: title: AWS Graviton processors @@ -68,3 +112,4 @@ weight: 1 # _index.md always has weight of 1 to order corr layout: "learningpathall" # All files under learning paths have this same wrapper learning_path_main_page: "yes" # Indicates this should be surfaced when looking for related content. Only set for _index.md of learning path content. --- + diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md index ce61e59acf..3bb890b4ec 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md @@ -181,7 +181,7 @@ NAME STATUS ROLES AGE VERSION AR ip-192-168-13-74.ec2.internal Ready 26m v1.36.2-eks-93b80c6 arm64 ``` -The `arm64` value in the `ARCH` column confirms that the node is running on an AWS Graviton instance. Your EKS cluster is ready to accept workloads. +The `arm64` value in the `ARCH` column confirms that the node is running on an AWS Graviton-based instance. Your EKS cluster is ready to accept workloads. ## What you've accomplished and what's next From 535296fa178d4a42f6ec8e12b36d01e5ee1fbfbe Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Wed, 24 Jun 2026 17:04:35 -0500 Subject: [PATCH 105/137] edits --- .../rafay-eks/_index.md | 12 ++++++------ .../rafay-eks/cluster.md | 10 +++++----- .../servers-and-cloud-computing/rafay-eks/nginx.md | 2 +- .../servers-and-cloud-computing/rafay-eks/setup.md | 14 +++++++------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md index ea5b7c0ce7..19fa6f5f24 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md @@ -12,12 +12,12 @@ who_is_this_for: > learning_objectives: - Connect your AWS account to the Rafay platform using a cross-account IAM role - Provision an Amazon EKS cluster with an AWS Graviton-based node group using Rafay - - Deploy and verify NGINX on arm64 nodes and clean up all cloud resources + - Deploy and verify workloads on arm64 nodes and clean up all cloud resources prerequisites: - - An Amazon Web Services (AWS) [account](https://aws.amazon.com/) - - A [Rafay account](https://rafay.co) - - The [AWS CLI](/install-guides/aws-cli/) installed and configured + - An Amazon Web Services (AWS) [account](https://aws.amazon.com/) with sufficient IAM permissions to create roles, EKS clusters, EC2 instances, CloudFormation stacks, and related resources. + - A [Rafay account](https://rafay.co). + - The [AWS CLI](/install-guides/aws-cli/) installed and configured. # START generated_summary_faq generated_summary_faq: @@ -49,7 +49,7 @@ generated_summary_faq: - question: Which fields in the Rafay cluster manifest must match existing configuration? answer: >- The project, blueprint name and version, and the cloud credential must already exist in - Rafay. If any of these do not match, the cluster won't be created. + Rafay. If any of these don't match, the cluster won't be created. - question: What result should I expect when the EKS cluster is ready to use? answer: >- A running cluster with a Graviton-based (`arm64`) node group will be available for workloads. @@ -60,7 +60,7 @@ generated_summary_faq: The provided manifest pins the pods using `nodeSelector: kubernetes.io/arch: arm64`. After deployment, the pod should schedule and run on nodes labeled `arm64`. If it remains `Pending`, verify the node group is active and the selector matches node labels. - - question: What should I cleanup to avoid ongoing AWS charges? + - question: What should I clean up to avoid ongoing AWS charges? answer: >- Delete the NGINX workload and namespace created for the test, then deprovision the EKS cluster from Rafay. This releases the associated AWS resources. diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md index 3bb890b4ec..0695230889 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/cluster.md @@ -1,5 +1,5 @@ --- -title: Create an Amazon EKS cluster +title: Create an Amazon EKS cluster using a Rafay cluster manifest description: Create and apply a Rafay cluster manifest to provision an Amazon EKS cluster with an AWS Graviton-based node group, then download kubeconfig and verify the nodes report arm64. weight: 3 @@ -83,10 +83,10 @@ spec: Key fields to note: -- `cloudCredentials` — must exactly match the credential name you entered in the Rafay console -- `project` - must be the project you attached the credential to -- `instanceType: m7g.large` — a Graviton3-based instance with Arm Neoverse processors -- `publicAccess: false` — the Kubernetes API server has no public endpoint. You reach the cluster exclusively through RCTL, which routes traffic through the Rafay control plane. +- `cloudCredentials` must exactly match the credential name you entered in the Rafay console. +- `project` must be the project you attached the credential to. +- `instanceType` must be a Graviton-based EC2 instance type with Arm Neoverse processors. In this manifest, it's Graviton3-based `m7g.large`. +- `publicAccess` must be `false`. The Kubernetes API server has no public endpoint. You reach the cluster exclusively through RCTL, which routes traffic through the Rafay control plane. ## Apply the cluster manifest diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md index de75f89964..bf8feba2ea 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md @@ -162,5 +162,5 @@ rctl delete cluster demo-eks-graviton You've now deployed NGINX using a manifest that pins pods to `arm64` nodes, verified the pod reaches a `Running` state, and tested connectivity from inside the cluster. You then cleaned up all provisioned resources. -Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, making it straightforward to run private, Graviton-based EKS clusters at scale. +Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, so you can use Rafay to run private, Graviton-based EKS clusters at scale. diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md index 28f887f6c5..76c181ac20 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/setup.md @@ -16,7 +16,7 @@ In this Learning Path, you'll use Rafay to provision an Amazon EKS cluster with You need the following accounts and tools before starting this Learning Path: - An [AWS account](https://aws.amazon.com/) with sufficient IAM permissions to create roles, EKS clusters, EC2 instances, CloudFormation stacks, and related resources. -- A [Rafay account](https://console.rafay.dev). You can [sign up](https://console.rafay.dev/#/signup) if you do not have an account. +- A [Rafay account](https://console.rafay.dev). You can [sign up](https://console.rafay.dev/#/signup) if you don't have an account. - The AWS CLI installed and configured with credentials that have the required permissions. For setup instructions, see the [AWS CLI](/install-guides/aws-cli/) and the [AWS Credentials](/install-guides/aws_access_keys/) install guides. Confirm your AWS CLI is working by running the following command, which prints your account and user information: @@ -27,7 +27,7 @@ aws sts get-caller-identity ## Install kubectl -Install the Kubernetes command-line tool, by following the [kubectl install guide](/install-guides/kubectl/). +Install the Kubernetes command-line tool by following the [kubectl install guide](/install-guides/kubectl/). Confirm the installation: @@ -114,8 +114,8 @@ The output lists your account information, including the endpoints, keys, projec Rafay provisions EKS resources in your AWS account using a cross-account IAM role. You need two values from the Rafay console before running the script: -1. Log in to the Rafay console -2. Select **defaultproject** (or another project) from the project selector in the top navigation bar +1. Log in to the Rafay console. +2. Select **defaultproject** (or another project) from the project selector in the navigation bar. 3. Navigate to **Infrastructure** > **Cloud Credentials** > **New Credential**. 4. Select **AWS** as the provider, then select **ROLE**. Copy the **Rafay Account ID** and **External ID** displayed on the screen. You'll pass these values to the script that follows. @@ -427,7 +427,7 @@ Attaching inline policy to role Role ARN (copy this value into the Rafay console): arn:aws:iam::111122223333:role/Proj-RafayEKSProvisioner ``` -The `Account ID`, `External ID`, and `Role ARN` are sample values. +The `Account ID`, `External ID`, and `Role ARN` in this output are sample values. Copy the `Role ARN` from the output. @@ -435,12 +435,12 @@ Copy the `Role ARN` from the output. With the `Role ARN` copied, complete the credential registration in the Rafay console: -1. Return to **Infrastructure** > **Cloud Credentials** > **New Credential** in the Rafay console +1. Return to **Infrastructure** > **Cloud Credentials** > **New Credential** in the Rafay console. 2. Paste the `Role ARN` into the **Role ARN** field. 3. Enter `aws-cloud-credential` as the credential name. 4. Select **Save**. -![Screenshot of the Rafay console showing the cloud credential registration form with the AWS Role ARN field filled in #center](images/rafay-cloud-credential.webp "Registered AWS cloud credential in the Rafay console") +![Screenshot of the Rafay Cloud Credentials page showing the aws-cloud-credential entry with provider AWS, credential type ROLE, and a masked RafayEKSProvisioner role detail#center](images/rafay-cloud-credential.webp "Registered AWS cloud credential in the Rafay console") ## What you've accomplished and what's next From 19c02fef720cc59d25a84dfcd9eeb70adf8b73be Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 10:34:10 -0500 Subject: [PATCH 106/137] updates to account for summaries and faqs in metadata --- .github/skills/frontmatter-audit/SKILL.md | 3 ++- .github/skills/writing-style-review/SKILL.md | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/skills/frontmatter-audit/SKILL.md b/.github/skills/frontmatter-audit/SKILL.md index b62b68678d..ec0be2d0ec 100644 --- a/.github/skills/frontmatter-audit/SKILL.md +++ b/.github/skills/frontmatter-audit/SKILL.md @@ -25,13 +25,14 @@ For a Learning Path directory: - Public pages should have unique `weight` values within the directory. - Every page except for `_next-steps.md` must include a description. - `_index.md` must include `description`. -- Required `_index.md` fields include `title`, `description`, `weight`, `layout`, `minutes_to_complete`, `prerequisites`, `author`, `subjects`, `armips`, `tools_software_languages`, `skilllevels`, and `operatingsystems`. +- Required `_index.md` fields include `title`, `description`, `weight`, `layout`, `minutes_to_complete`, `prerequisites`, `author`, `generate_summary_faq`, `rerun_summary`, `rerun_faqs`, `subjects`, `armips`, `tools_software_languages`, `skilllevels`, and `operatingsystems`. - `layout` is usually `learningpathall`. - `title` should be task-led and use an imperative structure: verb + technology/tool + outcome. - `skilllevels` values are only `Introductory` or `Advanced`. - `subjects` and `operatingsystems` must match the closed lists in `content/learning-paths/cross-platform/_example-learning-path/write-2-metadata/`. - `armips` should use Arm IP families such as Neoverse, Cortex-A, or Cortex-M, not specific CPU models or Arm architecture versions. - `author` can list multiple authors with YAML list syntax. +- `generate_summary_faq`, `rerun_summary`, and `rerun_faqs` values are only `true` and `false`. - Skip `_next-steps.md` for description updates unless the user explicitly asks how to handle it. ## Install guide checks diff --git a/.github/skills/writing-style-review/SKILL.md b/.github/skills/writing-style-review/SKILL.md index a980254b01..e7ffbc52f5 100644 --- a/.github/skills/writing-style-review/SKILL.md +++ b/.github/skills/writing-style-review/SKILL.md @@ -74,7 +74,7 @@ Use this skill for granular prose, voice, readability, terminology, and style re - Use `set up` as a verb and `setup` as a noun. - Use `avoid` instead of `try not to`. - Use `such as` instead of `like`. -- Use `after` instead of `once`. +- Use `after` or `when` instead of `once`. ## Tone cleanup @@ -111,7 +111,7 @@ Use this skill for granular prose, voice, readability, terminology, and style re - Use `arm64` or `aarch64` for CPU architecture based on tool, package, or OS convention. - Use `ARM64` only when referring to Windows on Arm or Microsoft documentation. - Capitalize `Learning Path`. -- Use `Azure Cobalt`, `Google Axion`, and `AWS Graviton` as processor names, not VM names. +- Use `Azure Cobalt`, `Google Axion`, and `AWS Graviton` as processor names, not VM names. `Graviton-based instances`, not `Graviton instances`, for example. - Do not use bold or italics for product names such as LiteRT, XNNPACK, KleidiAI, and SME2 unless they are headings or UI labels. ## Avoid AI-sounding prose From fd763d56b00a052281ac3f1628818e5f959df185 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 10:42:26 -0500 Subject: [PATCH 107/137] more updates for summaries and faqs --- .github/skills/writing-style-review/SKILL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/skills/writing-style-review/SKILL.md b/.github/skills/writing-style-review/SKILL.md index e7ffbc52f5..cf631a0227 100644 --- a/.github/skills/writing-style-review/SKILL.md +++ b/.github/skills/writing-style-review/SKILL.md @@ -18,8 +18,8 @@ Use this skill for granular prose, voice, readability, terminology, and style re ## Voice and tone -- Use second person: `you` and `your`. -- Avoid first person: `I` and `we`. +- Use second person: `you` and `your` for Learning Path summaries, Learning Path content, install guide content, answers to FAQs, and metadata descriptions. Avoid first person for these content types. +- Use first person: `I` and `we` for FAQs. - Use active voice. - Use present tense for descriptions. - Use imperative mood for commands. From b576709742d8c5a536cf72f89e32136def9a22cc Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 12:24:52 -0500 Subject: [PATCH 108/137] first pass refactor of performance studio LP --- .../mobile-graphics-and-gaming/ams/_index.md | 9 ++-- .../mobile-graphics-and-gaming/ams/ams.md | 38 ++++++++++--- .../mobile-graphics-and-gaming/ams/fa.md | 31 ++++++----- .../mobile-graphics-and-gaming/ams/malioc.md | 12 ++++- .../mobile-graphics-and-gaming/ams/pa.md | 29 +++++----- .../ams/pa_example.md | 15 ++++-- .../ams/renderdoc.md | 17 +++--- .../ams/setup_tasks.md | 53 ++++++++----------- .../ams/streamline.md | 11 +++- .../ams/streamline_example.md | 19 ++++--- 10 files changed, 151 insertions(+), 83 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md index 3a9b8533fb..6a3e97f78b 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md @@ -1,14 +1,17 @@ --- -title: Get started with Arm Performance Studio +title: Profile an Android application with Arm Performance Studio description: Learn how to use each of the tools supplied with Arm Performance Studio (formerly known as Arm Mobile Studio). minutes_to_complete: 60 -who_is_this_for: Android application and games developers new to Arm Performance Studio. +who_is_this_for: This is an introductory topic for Android application and games developers new to Arm Performance Studio. learning_objectives: - - Learn the basic features of each component of Arm Performance Studio. + - Capture a Streamline profile from a debuggable Android application + - Generate and inspect a Performance Advisor report + - Capture and analyze a frame with Frame Advisor and RenderDoc for Arm GPUs + - Use Mali Offline Compiler to estimate shader cost - Get started profiling and optimizing your application. prerequisites: diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md index 6db0edfda6..fd875867b8 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md @@ -1,13 +1,15 @@ --- # User change -title: "What is Arm Performance Studio?" +title: Set up Arm Performance Studio weight: 2 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- -[Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a performance analysis tool suite for developers to performance test their applications on devices with Mali-based GPUs. It consists of 4 easy-to-use tools that show you how well your application performs either on off-the-shelf Android devices, or Linux targets. The tools help you to identify problems that might slow down performance, overheat the device, or drain the battery. +## What is Arm Performance Studio? + +[Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a performance analysis tool suite for developers to performance test their applications on devices with Mali-based GPUs. It consists of four easy-to-use tools that show you how well your application performs either on off-the-shelf Android devices, or Linux targets. The tools help you to identify problems that might slow down performance, overheat the device, or drain the battery. | Component | Functionality | |----------|-------------| @@ -16,11 +18,29 @@ layout: "learningpathall" | [Mali Offline Compiler](https://developer.arm.com/Tools%20and%20Software/Mali%20Offline%20Compiler) | Analyze how efficiently your shader programs perform on a range of Mali GPUs. | | [RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) | The industry-standard tool for debugging Vulkan graphics applications, including early support for Arm GPU extensions and Android features. | -## Download and Install Arm Performance Studio +## Download and install Arm Performance Studio + +Arm Performance Studio is supported on Windows, Linux, and macOS hosts. To download Arm Performance Studio, see the [Arm Performance Studio downloads page](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio#Downloads). + +For installation instructions, see the [Arm Performance Studio install guide](/install-guides/ams/). + +## Update your PATH environment variable (Linux and macOS) + +Edit your `PATH` environment variable to add the paths to the Streamline and Mali Offline Compiler executables. This is so that you can run Streamline's `Streamline-cli -pa` command and Mali Offline Compiler's `malioc` command from any directory. This step is not necessary on Windows, as this is done automatically when Arm Performance Studio is installed. -Arm Performance Studio is supported on Windows, Linux, and macOS hosts. Get the [Arm Performance Studio installation package](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio#Downloads). +On macOS, edit your `/etc/paths` file to add the following paths: -Refer to the [Arm Performance Studio install guide](/install-guides/ams/) for installation instructions. +``` +//streamline +//mali_offline_compiler +``` + +On Linux, edit your `PATH` environment variable to add the paths to the Performance Advisor executable. Add this command to the `.bashrc` file in your home directory, so that this environment variable is set whenever you initialize a shell session. + +``` + PATH=$PATH://streamline + PATH=$PATH://mali_offline_compiler +``` ## Launch the tools @@ -29,4 +49,10 @@ To open the tools, launch the Performance Studio Hub: - On Windows, search for Performance Studio. - On macOS and Linux, open the Performance Studio application file from the install directory. - ![Performance Studio Hub](images/ps_hub.png) +![Performance Studio Hub](images/ps_hub.png) + +## What you've accomplished and what's next + +You've now set up Arm Performance Studio and updated your PATH environment variable so you can use suite of available tools to profile applications. + +Next, you'll set up the application that you'll profile in this Learning Path. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md index 5d83889000..9819a628e1 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md @@ -1,19 +1,18 @@ --- # User change -title: "Frame Advisor" +title: "Analyze your application with Frame Advisor" weight: 8 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- -[Frame Advisor](https://developer.arm.com/Tools%20and%20Software/Frame%20Advisor) offers in-depth frame-based analysis for mobile graphics in Android applications. By capturing the API calls and rendering processes of a specific frame, you can identify potential performance bottlenecks that may be causing slowdowns in your application. -## Prerequisites +## Connect to your Android device -Build your application, and setup the Android device as described in [Setup tasks](/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks/). +[Frame Advisor](https://developer.arm.com/Tools%20and%20Software/Frame%20Advisor) offers in-depth frame-based analysis for mobile graphics in Android applications. By capturing the API calls and rendering processes of a specific frame, you can identify potential performance bottlenecks that may be causing slowdowns in your application. -## Connect to the device +Start by connecting to your device. 1. Launch the Performance Studio Hub and open Frame Advisor. - On Windows, search for Performance Studio. @@ -21,33 +20,35 @@ Build your application, and setup the Android device as described in [Setup task ![Performance Studio Hub](images/ps_hub.png) -1. Select `New trace` to start a new trace. +2. Select `New trace` to start a new trace. ![Frame Advisor launch screen](images/fa_launch_screen.png) -1. Select your device, and the application that you want to capture frames from. +3. Select your device, and the application that you want to capture frames from. ![Device connection screen](images/fa_connect.png) -1. If your application uses the Vulkan API, change the selection in the API settings to `Vulkan`. +4. If your application uses the Vulkan API, change the selection in the API settings to `Vulkan`. -1. Click `Next` to continue. +5. Click `Next` to continue. Unless you chose the `Pause on connect` option in the `Device connection` screen, the application starts automatically on the device. ## Capture a frame burst +After connecting to your device, you can capture a frame burst. + 1. The `Capture` screen provides options for your capture session. ![Frame Advisor capture screen](images/fa_capture.png) When you approach the part of your game where the problem occurs, click `Pause` and use the `Step` button to focus in just before it. -1. You can capture one frame burst of up to 3 consecutive frames. Adjust the `Frame count` as required. +2. You can capture one frame burst of up to 3 consecutive frames. Adjust the `Frame count` as required. -1. Click the `Capture` button to start capturing the frame burst. Wait for the capture to complete. This may take several seconds. +3. Click the `Capture` button to start capturing the frame burst. Wait for the capture to complete. This may take several seconds. -1. Click `Analyze` to see the results. It may take a few minutes to analyze the data. +4. Click `Analyze` to see the results. It may take a few minutes to analyze the data. ## Analyze the capture @@ -76,3 +77,9 @@ Explore each frame to evaluate how efficiently they were rendered on the device. ![Detailed Metrics view](images/fa_detailed_metrics_view.png) Watch this [video tutorial](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Capture%20and%20analyze%20a%20problem%20frame%20with%20Frame%20Advisor) to see how to capture and analyze a problem frame with Frame Advisor. + +## What you've accomplished and what's next + +You've now analyzed your application with Frame Advisor. + +Next, you'll use RenderDoc for Arm GPUs to capture frames and select application events for debugging. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 54bc14ba31..0994ab882d 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -1,12 +1,15 @@ --- # User change -title: "Mali Offline Compiler" +title: Generate a performance report with Mali Offline Compiler weight: 10 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- + +## Before you begin + Mali Offline Compiler is a command-line tool that you can use to compile all shaders and kernels from OpenGL ES and Vulkan, and generate a performance report for the GPU of interest. In a terminal, test that Mali Offline Compiler is installed correctly, by typing: @@ -134,3 +137,10 @@ A = Arithmetic, LS = Load/Store, V = Varying, T = Texture Observe that the number of `Arithmetic` cycles has been significantly reduced. Understanding the output of the report is key to the usefulness of the Mali Offline Compiler. This brief [video tutorial](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Arm%20Mali%20GPU%20Training%20-%20EP3-5) is an excellent starter. + +## What you've accomplished + +You've used Mali Offline Compiler to analyze shader performance on a Mali-based GPU of interest. + +You can use the components and workflows described in this Learning Path to profile your applications and analyze performance using Arm Performance Studio. + diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md index be3098a655..aa6ab7e1ba 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md @@ -1,12 +1,15 @@ --- # User change -title: "Performance Advisor with your application" +title: Create a Performance Advisor report for your application weight: 7 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- + +## Connect to Android device and collect frame data + Now that you have seen a [Performance Advisor example report](/learning-paths/mobile-graphics-and-gaming/ams/pa_example/), you can use it to capture data from your own application. Performance Advisor runs on a Streamline capture file, so the first step is to take a capture with Streamline. Streamline must capture extra frame data from the device, which Performance Advisor needs to generate a report. To capture the extra frame data, you must first run the provided Python script, `streamline_me.py`. @@ -17,13 +20,7 @@ This script does the following: * Temporarily installs the OpenGL ES or Vulkan layer library file on your device, which is needed to collect frame data. * Enables you to specify options for the capture, such as whether to collect screenshots when the FPS drops below a certain threshold. -## Before you begin - -Performance Advisor uses a Python script to connect to your device. You will need `Python 3.8` or later installed on your host machine. - -Build your application, and setup the Android device as described in [Setup tasks](/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks/). - -## Connect to the device +To connect to the Android device and capture frame data, follow these steps: 1. Open a terminal or command prompt, navigate to the `Arm Performance Studio` install directory and locate the `streamline_me.py` script: @@ -31,7 +28,7 @@ Build your application, and setup the Android device as described in [Setup task cd /streamline/bin/android ``` -1. Run the script, enabling frame boundaries, with: +2. Run the script, enabling frame boundaries, with: ```console python3 streamline_me.py --lwi-mode=counters @@ -41,7 +38,7 @@ Build your application, and setup the Android device as described in [Setup task To see all available options, use `python3 streamline_me.py --help` {{% /notice %}} -1. The script returns a numbered list of the Android package names for the debuggable applications that are installed on your device. Enter the number of the application you want to profile. +3. The script returns a numbered list of the Android package names for the debuggable applications that are installed on your device. Enter the number of the application you want to profile. ```python Searching for devices: @@ -64,7 +61,9 @@ To see all available options, use `python3 streamline_me.py --help` The script identifies the GPU in the device, installs the daemon application and layer library, then waits for you to complete the capture in Streamline. -1. Leave the terminal window open, as you need to come back to it after the capture is complete, to stop the script. When the script ends, any captured screenshots are saved to the directory you specified, and the daemon application and layer library are uninstalled from the device. Do not unplug the device until the script has ended. +{{% notice Note %}} +Leave the terminal window open, as you need to come back to it after the capture is complete, to stop the script. When the script ends, any captured screenshots are saved to the directory you specified, and the daemon application and layer library are uninstalled from the device. Do not unplug the device until the script has ended. +{{% /notice %}} See the [Get started with Performance Advisor Tutorial](https://developer.arm.com/documentation/102478/latest/Run-the-streamline-me-py-script) for full instructions. @@ -113,6 +112,12 @@ This feature is particularly useful when used within a [CI workflow](https://dev streamline-cli -pa --type=json:report.json my_capture.apc ``` -## Performance budgets +## Specify performance budgets You can specify a performance budget which will be reflected in the Performance Advisor report. For more information, refer to the [Performance Advisor User Guide](https://developer.arm.com/documentation/102009/latest/Quick-start-guide/Setting-performance-budgets) section on performance budgets. + +## What you've accomplished and what's next + +You've now generated JSON and HTML performance Performance Advisor reports for your application. + +Next, you'll perform frame-based analysis on your application using Frame Advisor. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md index ef80a4fa31..a48b3280f5 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md @@ -1,17 +1,18 @@ --- # User change -title: "Performance Advisor example report " +title: View an example Performance Advisor report weight: 6 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- -Performance Advisor creates an easy-to-read report from a Streamline capture. This helps you quickly understand how your Android application performed on a mobile device. ## Generate a performance report -The supplied [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/) can be used to generate a `Performance Advisor` report. +Performance Advisor creates an easy-to-read report from a Streamline capture that you can use to understand how your Android application performs on a mobile device. + +You can use the [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/) that comes with Arm Performance Studio to generate an example `Performance Advisor` report. 1. Open a terminal, and navigate to the location of the imported capture. @@ -33,4 +34,10 @@ The supplied [Arm Streamline example capture](/learning-paths/mobile-graphics-an ## Evaluate the report -Refer to the [Performance Advisor tutorial](https://developer.arm.com/documentation/102478/latest/Example-Performance-Advisor-report) for a detailed explanation about the charts in the report. +For a detailed explanation on how to interpret the report, see the [Example Performance Advisor report tutorial](https://developer.arm.com/documentation/102478/latest/Example-Performance-Advisor-report) in Arm documentation. + +## What you've accomplished and what's next + +You've now created a performance report from the example Streamline capture that's packaged with Arm Performance Studio to understand the workflow for report creation. + +Next, you'll create a report for your application. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md index f5e529c70b..3541bbd8bb 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md @@ -1,19 +1,18 @@ --- # User change -title: "RenderDoc for Arm GPUs" +title: Debug your application with RenderDoc for Arm GPUs weight: 9 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- -[RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) is an Arm fork of the [RenderDoc](https://renderdoc.org/) open-source debugger. The Arm release includes support for API features and extensions that are available on the latest Arm GPUs, but not yet supported in upstream RenderDoc. Arm intends to contribute changes to the upstream project, but some Arm-specific or Android-specific features may only be available in the Arm fork. -## Prerequisites +## Run RenderDoc for Arm GPUs -Build your application, and setup the Android device as described in [Setup tasks](/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks/). +[RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) is an Arm fork of the [RenderDoc](https://renderdoc.org/) open-source debugger. The Arm release includes support for API features and extensions that are available on the latest Arm GPUs, but not yet supported in upstream RenderDoc. Arm intends to contribute changes to the upstream project, but some Arm-specific or Android-specific features might be available only in the Arm fork. -## Connect to the device +To run RenderDoc for Arm GPUs, follow these steps: 1. Open RenderDoc for Arm GPUs and select your connected device from the **Replay Context** dropdown list at the bottom left of the RenderDoc UI. @@ -49,4 +48,10 @@ Build your application, and setup the Android device as described in [Setup task Selected events are highlighted with a green flag. All the other windows in the UI update to display information that is specific to the selected event. You can use this to view the render state and data resources that are used by the current event, and view the GPU output that resulted from it. -See the [RenderDoc documentation](https://renderdoc.org/docs/index.html#) to explore the full list of features. \ No newline at end of file +See the [RenderDoc documentation](https://renderdoc.org/docs/index.html#) to explore the full list of features. + +## What you've accomplished and what's next + +You've now run RenderDoc for Arm GPUs on your application and learned how to capture frames and select events for debugging. + +Next, you'll run Mali Offline Compiler to compile shaders and generate performance reports. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md index 4efb4d6f45..2c184c5bc2 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md @@ -1,44 +1,27 @@ --- # User change -title: "Setup tasks" +title: Set up the Android application weight: 3 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- -## Installation +## Before you begin -1. Install Arm Performance Studio by following the instructions in the [Arm Performance Studio install guide](/install-guides/ams/). Details about changes since the last release can be found in the [Release Note](https://developer.arm.com/documentation/107649/latest/). -1. Ensure you have installed [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb). `adb` is available with the Android SDK platform tools, which are installed as part of Android Studio. Alternatively, you can download them separately as part of the Android SDK platform tools. -1. Performance Advisor uses a Python script to connect to your device. To run this script, you will need [Python](https://www.python.org/downloads/) 3.8 or later installed. - -## Update your PATH environment variable (Linux and macOS) - -Edit your `PATH` environment variable to add the paths to the Streamline and Mali Offline Compiler executables. This is so that you can run Streamline's `Streamline-cli -pa` command and Mali Offline Compiler's `malioc` command from any directory. This step is not necessary on Windows, as this is done automatically when Arm Performance Studio is installed. - -On macOS, edit your `/etc/paths` file to add the following paths: - -``` -//streamline -//mali_offline_compiler -``` - -On Linux, edit your `PATH` environment variable to add the paths to the Performance Advisor executable. Add this command to the `.bashrc` file in your home directory, so that this environment variable is set whenever you initialize a shell session. +Complete the following prerequisites: - ``` - PATH=$PATH://streamline - PATH=$PATH://mali_offline_compiler -``` +1. Ensure you have installed [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb). `adb` is available with the Android SDK platform tools, which are installed as part of Android Studio. Alternatively, you can download them separately as part of the Android SDK platform tools. +2. Performance Advisor uses a Python script to connect to your device. To run this script, you'll need [Python](https://www.python.org/downloads/) 3.8 or later installed. ## Build your application -The application must be compiled with debug enabled, as well as additional options to facilitate call stack unwinding by Streamline. +You need to compile the application with debug enabled, as well as additional options to facilitate call stack unwinding by Streamline. -* To set [Unity](https://unity.com/) applications to be debuggable, enable [Development Build](https://docs.unity3d.com/6000.0/Documentation/Manual/android-BuildProcess.html) in `Build settings`. -* In Android Studio, use a build variant that includes `debuggable true` (`isDebuggable = true` in Kotlin scripts) in the build configuration. -* In Unreal Engine, open `Project Settings > Project > Packaging > Project`, and ensure that the `For Distribution` checkbox is not set. -* For C++ or Java applications, refer to the [Target setup guide for Android](https://developer.arm.com/documentation/101813/latest/Target-Setup/Compile-your-application) for instructions on how to compile your application with the right options. +- To set [Unity](https://unity.com/) applications to be debuggable, enable [Development Build](https://docs.unity3d.com/6000.0/Documentation/Manual/android-BuildProcess.html) in `Build settings`. +- In Android Studio, use a build variant that includes `debuggable true` (`isDebuggable = true` in Kotlin scripts) in the build configuration. +- In Unreal Engine, open `Project Settings > Project > Packaging > Project`, and ensure that the `For Distribution` checkbox is not set. +- For instructions on how to complie your C++ or Java applications with the right options, see the [Target setup guide for Android](https://developer.arm.com/documentation/101813/latest/Target-Setup/Compile-your-application). {{% notice Tip %}} To assist with readability and add context, you can optionally include [annotations](https://developer.arm.com/documentation/101816/latest/Annotate-your-code/Add-annotations-to-your-code) in your code, which are then displayed in Streamline. @@ -46,10 +29,12 @@ To assist with readability and add context, you can optionally include [annotati ## Set up the Android device +To set up your Android device, follow these steps: + 1. On the device, ensure that [Developer Mode](https://developer.android.com/studio/debug/dev-options) is enabled. -1. Enable `USB Debugging` under `Settings > Developer options`. If your device asks you to authorize connection to your computer, confirm the connection. -1. Connect the device to the host through USB and approve the debug connection on the device when prompted. -1. To test the connection, run the `adb devices` command in a command terminal. If successful, this returns the ID of your device: +2. Enable `USB Debugging` under `Settings > Developer options`. If your device asks you to authorize connection to your computer, confirm the connection. +3. Connect the device to the host through USB and approve the debug connection on the device when prompted. +4. To test the connection, run the `adb devices` command in a command terminal. If successful, this returns the ID of your device: ```command adb devices @@ -59,4 +44,10 @@ To assist with readability and add context, you can optionally include [annotati If you see that the device is listed as `unauthorized`, try disabling and re-enabling `USB Debugging` on the device, and accept the authorization prompt to enable connection to the computer. -1. Install the [debuggable](https://developer.android.com/studio/debug) application on the device. +5. Install the [debuggable](https://developer.android.com/studio/debug) application on the device. + +## What you've accomplished and what's next + +You've now set up your Android device and built the application you'll use for profiling. + +Next, you'll look at an example Arm Streamline report to understand the Streamline component of Arm Performance Studio. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md index e6de786905..f688c34c47 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md @@ -1,16 +1,17 @@ --- # User change -title: "Streamline with your application" +title: Use Arm Streamline to capture data for your application weight: 5 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- -Now that you have seen an [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/), you can use it to capture data from your own application. ## Select the device and application in Streamline +Now that you have seen an [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/), you can use it to capture data from your own application. + 1. Launch the Performance Studio Hub and open Streamline. - On Windows, search for Performance Studio. @@ -45,3 +46,9 @@ Streamline will stop capturing data, remove the daemon, and process the captured The charts in the `Timeline` view show the performance counter activity captured from the device. Hover over the charts to see the values at that point in time. Use the Calipers to focus on particular windows of activity. Refer to the [Streamline User Guide](https://developer.arm.com/documentation/101816/latest/Analyze-your-capture) for full instructions on how to use the features in the `Timeline` view. Understanding the output of Streamline is key to the usefulness of Streamline. The documentation for [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/) on Arm Developer describes how to understand the capture from a number of points of view, depending on what information you are trying to extract from it. + +## What you've accomplished and what's next + +You've now generated and analyzed an Arm Streamline report for your application. + +Next, you'll view an example Performance Advisor report. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md index 0073e1364d..e8703d0e5b 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md @@ -1,26 +1,25 @@ --- # User change -title: "Arm Streamline example capture" +title: Interpret an example Arm Streamline report weight: 4 # 1 is first, 2 is second, etc. # Do not modify these elements layout: "learningpathall" --- -This learning path explores Streamline for Android application profiling on a mobile device. For other use cases, refer to the supporting materials for [Arm Development Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Development%20Studio). -## Example Streamline report +## View the example Arm Streamline report To help you understand the capabilities of Streamline, an example Streamline profile is provided with Arm Performance Studio. 1. To open the example profile, in Streamline, select `File` > `Import`. -1. Select `Import Streamline Sample Captures` and click `Next`. +2. Select `Import Streamline Sample Captures` and click `Next`. ![Import #center](images/import.png "Import Streamline Sample Captures") -1. Select the Android example and click `Finish`. +3. Select the Android example and click `Finish`. ![Samples #center](images/samples.png "Select sample captures") -1. Double-click on the report in `Streamline Data`, then click `Analyze` when prompted. The report will be processed, and an interactive timeline will be shown. +4. Double-click on the report in `Streamline Data`, then click `Analyze` when prompted. After the report is processed, you'll see an interactive timeline. ![Timeline #center](images/timeline.png "Streamline Timeline") ## Analyze the results @@ -28,3 +27,11 @@ To help you understand the capabilities of Streamline, an example Streamline pro The charts in the `Timeline` view show the performance counter activity captured from the device. Hover over the charts to see the values at that point in time. Use the Calipers to focus on particular windows of activity. Refer to the [Streamline User Guide](https://developer.arm.com/documentation/101816/latest/Analyze-your-capture) for full instructions on how to use the features in the `Timeline` view. Understanding the output of Streamline is key to the usefulness of Streamline. [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/) describes how to understand the capture from a number of points of view, depending on what information you are trying to extract from it. + +## What you've accomplished and what's next + +You've now viewed an example Arm Streamline report and interpreted the results using Arm documentation. + +Next, you'll use Arm Streamline to capture data for your application. + + From 12d1bf88a87bd7595400db977e6a71d09dbe830a Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 13:05:54 -0500 Subject: [PATCH 109/137] moving content out of supporting tools into final page --- .../mobile-graphics-and-gaming/ams/_index.md | 2 +- .../mobile-graphics-and-gaming/ams/malioc.md | 15 +++++++++++++++ .../ams/supporting_tools.md | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md index 6a3e97f78b..3e7a59e078 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md @@ -12,7 +12,7 @@ learning_objectives: - Generate and inspect a Performance Advisor report - Capture and analyze a frame with Frame Advisor and RenderDoc for Arm GPUs - Use Mali Offline Compiler to estimate shader cost - - Get started profiling and optimizing your application. + - Get started profiling and optimizing your application prerequisites: - An Android device. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 0994ab882d..3fa91ddb32 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -144,3 +144,18 @@ You've used Mali Offline Compiler to analyze shader performance on a Mali-based You can use the components and workflows described in this Learning Path to profile your applications and analyze performance using Arm Performance Studio. +You can also explore the following supporting tools: + +- [Unity Integration package](https://github.com/ARM-software/mobile-studio-integration-for-unity/). Integrate this package in to your Unity application during development and gain the ability to add more application awareness to Performance Advisor and Streamline profiling reports. This package exports key software counters from the Unity profiler to Streamline, and also exports a C# API to allow developers to export custom annotations and software counters that can be visualized in performance reports. + +- [Unity System Metrics for Mali package](https://forum.unity.com/threads/introducing-system-metrics-mali-package.1126178/). Integrate this package in to your Unity application during development and visualize frame-based Arm GPU performance metrics using the Unity profiler. This allows efficient early triage of performance problems in-editor, allowing developers to switching to Streamline only when they need to investigate rendering performance issues in more detail. + +- [Godot integration package](https://github.com/ARM-software/arm-performance-studio-integration-for-godot). This package provides an open-source Godot game engine integration for Streamline and Performance Advisor. It contains GDScript bindings for the Streamline annotation API, allowing users to export custom software counters, and event annotations. + +- [Arm ASTC Encoder texture compressor](https://github.com/ARM-software/astc-encoder) is an open-source texture compressor for the Adaptive Scalable Texture Compression (ASTC) texture format. It supports all block sizes, all color profiles, as well as both 2D and volumetric 3D textures. The astcenc compressor can be built as either a standalone command-line application or a library that can be integrated into an existing asset creation pipeline. + +- [libGPUInfo library](https://github.com/ARM-software/libGPUInfo) is an open-source utility that can be integrated into an application to query the configuration of the Arm GPU present in the system, including the GPU model, shader core count, shader core performance characteristics, and cache size. This information can be used to adjust the application workload at runtime to match the capabilities of the device being used. + +- [libGPUCounters library](https://github.com/ARM-software/libGPUCounters) is an open-source utility that allows applications to select and sample a set of Arm GPU performance counters. This library provides access to the same counter data that can be visualized in the Streamline tool, allowing integration of Arm GPU data into custom tooling. + +- [libGPULayers library](https://github.com/ARM-software/libGPULayers) is an open-source project that provides tooling to quickly create new Vulkan layers for Android, as well as some off-the-shelf layers that can be used during development. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md b/content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md index adec0314da..41ae22dd50 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md @@ -1,4 +1,4 @@ ---- + From 8f8c35cf9cfbc8d75de0717ec8e422273173a5d4 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 14:44:26 -0500 Subject: [PATCH 110/137] condensing list of tools --- .../mobile-graphics-and-gaming/ams/_index.md | 3 +-- .../mobile-graphics-and-gaming/ams/malioc.md | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md index 3e7a59e078..5c98b3c034 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md @@ -1,7 +1,7 @@ --- title: Profile an Android application with Arm Performance Studio -description: Learn how to use each of the tools supplied with Arm Performance Studio (formerly known as Arm Mobile Studio). +description: Learn how to profile an Android application using Arm Performance Studio (formerly known as Arm Mobile Studio). minutes_to_complete: 60 @@ -12,7 +12,6 @@ learning_objectives: - Generate and inspect a Performance Advisor report - Capture and analyze a frame with Frame Advisor and RenderDoc for Arm GPUs - Use Mali Offline Compiler to estimate shader cost - - Get started profiling and optimizing your application prerequisites: - An Android device. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 3fa91ddb32..8b03118af1 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -19,9 +19,9 @@ malioc --help ``` The `--help` option returns usage instructions and the full list of available options for the malioc command. -Note -{{% notice %}} + +{{% notice Note %}} On macOS, Mali Offline Compiler might not be recognized as an application from an identified developer. To enable Mali Offline Compiler, open **System Preferences > Security & Privacy**, and select **Allow Anyway** for the `malioc` item. {{% /notice %}} @@ -45,6 +45,8 @@ You can compile OpenGL ES (`--opengles`) and Vulkan (`--vulkan`) shader programs A performance report will be generated. +If your frame analysis points to shader cost, compile one of your shaders. You can also use this sample to understand the report. + An example (`OpenGL ES`) shader is provided in the [documentation](https://developer.arm.com/documentation/102468/latest/Compile-your-shader): ```C #version 310 es @@ -146,16 +148,16 @@ You can use the components and workflows described in this Learning Path to prof You can also explore the following supporting tools: -- [Unity Integration package](https://github.com/ARM-software/mobile-studio-integration-for-unity/). Integrate this package in to your Unity application during development and gain the ability to add more application awareness to Performance Advisor and Streamline profiling reports. This package exports key software counters from the Unity profiler to Streamline, and also exports a C# API to allow developers to export custom annotations and software counters that can be visualized in performance reports. +- [Unity Integration package](https://github.com/ARM-software/mobile-studio-integration-for-unity/) to add more application awareness — in the form of custom annotations and software counters — to Performance Advisor and Streamline profiling reports. -- [Unity System Metrics for Mali package](https://forum.unity.com/threads/introducing-system-metrics-mali-package.1126178/). Integrate this package in to your Unity application during development and visualize frame-based Arm GPU performance metrics using the Unity profiler. This allows efficient early triage of performance problems in-editor, allowing developers to switching to Streamline only when they need to investigate rendering performance issues in more detail. +- [Unity System Metrics for Mali package](https://forum.unity.com/threads/introducing-system-metrics-mali-package.1126178/) to visualize frame-based Arm GPU performance metrics using the Unity profiler for efficient early triage of performance problems. -- [Godot integration package](https://github.com/ARM-software/arm-performance-studio-integration-for-godot). This package provides an open-source Godot game engine integration for Streamline and Performance Advisor. It contains GDScript bindings for the Streamline annotation API, allowing users to export custom software counters, and event annotations. +- [Godot integration package](https://github.com/ARM-software/arm-performance-studio-integration-for-godot) to export custom software counters and event annotations. -- [Arm ASTC Encoder texture compressor](https://github.com/ARM-software/astc-encoder) is an open-source texture compressor for the Adaptive Scalable Texture Compression (ASTC) texture format. It supports all block sizes, all color profiles, as well as both 2D and volumetric 3D textures. The astcenc compressor can be built as either a standalone command-line application or a library that can be integrated into an existing asset creation pipeline. +- [Arm ASTC Encoder texture compressor](https://github.com/ARM-software/astc-encoder) to compress and decompress textures using the Adaptive Scalable Texture Compression (ASTC) texture format. -- [libGPUInfo library](https://github.com/ARM-software/libGPUInfo) is an open-source utility that can be integrated into an application to query the configuration of the Arm GPU present in the system, including the GPU model, shader core count, shader core performance characteristics, and cache size. This information can be used to adjust the application workload at runtime to match the capabilities of the device being used. +- [libGPUInfo library](https://github.com/ARM-software/libGPUInfo) to query the configuration of the Arm GPU present in the system to adjust the application workload at runtime. -- [libGPUCounters library](https://github.com/ARM-software/libGPUCounters) is an open-source utility that allows applications to select and sample a set of Arm GPU performance counters. This library provides access to the same counter data that can be visualized in the Streamline tool, allowing integration of Arm GPU data into custom tooling. +- [libGPUCounters library](https://github.com/ARM-software/libGPUCounters) to select and sample a set of Arm GPU performance counters for integration of Arm GPU data into custom tooling. -- [libGPULayers library](https://github.com/ARM-software/libGPULayers) is an open-source project that provides tooling to quickly create new Vulkan layers for Android, as well as some off-the-shelf layers that can be used during development. +- [libGPULayers library](https://github.com/ARM-software/libGPULayers) to create new Vulkan layers for Android development. From 633e0f0d5acc2da76a28206f57d07b8b96862b43 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 14:44:55 -0500 Subject: [PATCH 111/137] spaces between bullets --- .../learning-paths/mobile-graphics-and-gaming/ams/malioc.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 8b03118af1..25a8514beb 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -149,15 +149,9 @@ You can use the components and workflows described in this Learning Path to prof You can also explore the following supporting tools: - [Unity Integration package](https://github.com/ARM-software/mobile-studio-integration-for-unity/) to add more application awareness — in the form of custom annotations and software counters — to Performance Advisor and Streamline profiling reports. - - [Unity System Metrics for Mali package](https://forum.unity.com/threads/introducing-system-metrics-mali-package.1126178/) to visualize frame-based Arm GPU performance metrics using the Unity profiler for efficient early triage of performance problems. - - [Godot integration package](https://github.com/ARM-software/arm-performance-studio-integration-for-godot) to export custom software counters and event annotations. - - [Arm ASTC Encoder texture compressor](https://github.com/ARM-software/astc-encoder) to compress and decompress textures using the Adaptive Scalable Texture Compression (ASTC) texture format. - - [libGPUInfo library](https://github.com/ARM-software/libGPUInfo) to query the configuration of the Arm GPU present in the system to adjust the application workload at runtime. - - [libGPUCounters library](https://github.com/ARM-software/libGPUCounters) to select and sample a set of Arm GPU performance counters for integration of Arm GPU data into custom tooling. - - [libGPULayers library](https://github.com/ARM-software/libGPULayers) to create new Vulkan layers for Android development. From 839f36040d05e953a01e0a436781022a5ab801c3 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 14:54:02 -0500 Subject: [PATCH 112/137] removing supporting tools file in favor of shortened list at the end of final LP section --- .../mobile-graphics-and-gaming/ams/malioc.md | 2 +- .../ams/supporting_tools.md | 25 ------------------- 2 files changed, 1 insertion(+), 26 deletions(-) delete mode 100644 content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 25a8514beb..de320f3e18 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -150,7 +150,7 @@ You can also explore the following supporting tools: - [Unity Integration package](https://github.com/ARM-software/mobile-studio-integration-for-unity/) to add more application awareness — in the form of custom annotations and software counters — to Performance Advisor and Streamline profiling reports. - [Unity System Metrics for Mali package](https://forum.unity.com/threads/introducing-system-metrics-mali-package.1126178/) to visualize frame-based Arm GPU performance metrics using the Unity profiler for efficient early triage of performance problems. -- [Godot integration package](https://github.com/ARM-software/arm-performance-studio-integration-for-godot) to export custom software counters and event annotations. +- [Godot integration package](https://github.com/ARM-software/arm-performance-studio-integration-for-godot) to export custom software counters and event annotations in Godot. - [Arm ASTC Encoder texture compressor](https://github.com/ARM-software/astc-encoder) to compress and decompress textures using the Adaptive Scalable Texture Compression (ASTC) texture format. - [libGPUInfo library](https://github.com/ARM-software/libGPUInfo) to query the configuration of the Arm GPU present in the system to adjust the application workload at runtime. - [libGPUCounters library](https://github.com/ARM-software/libGPUCounters) to select and sample a set of Arm GPU performance counters for integration of Arm GPU data into custom tooling. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md b/content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md deleted file mode 100644 index 41ae22dd50..0000000000 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/supporting_tools.md +++ /dev/null @@ -1,25 +0,0 @@ - From a413f212c7a2d80b6b76cd6dbc30e78fab367c23 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 15:42:00 -0500 Subject: [PATCH 113/137] improved alt-text --- .../mobile-graphics-and-gaming/ams/ams.md | 4 ++-- .../mobile-graphics-and-gaming/ams/fa.md | 22 +++++++++---------- .../ams/pa_example.md | 2 +- .../ams/renderdoc.md | 10 ++++----- .../ams/streamline.md | 8 +++---- .../ams/streamline_example.md | 7 +++--- 6 files changed, 26 insertions(+), 27 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md index fd875867b8..bcd9b063eb 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md @@ -49,10 +49,10 @@ To open the tools, launch the Performance Studio Hub: - On Windows, search for Performance Studio. - On macOS and Linux, open the Performance Studio application file from the install directory. -![Performance Studio Hub](images/ps_hub.png) +![Screenshot of the Arm Performance Studio Hub showing launch cards for Frame Advisor, RenderDoc for Arm GPUs, Streamline, Mali Offline Compiler, and Streamline CLI#center](images/ps_hub.png) ## What you've accomplished and what's next You've now set up Arm Performance Studio and updated your PATH environment variable so you can use suite of available tools to profile applications. -Next, you'll set up the application that you'll profile in this Learning Path. \ No newline at end of file +Next, you'll set up the application that you'll profile in this Learning Path. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md index 9819a628e1..cd4852a1ba 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md @@ -1,6 +1,6 @@ --- # User change -title: "Analyze your application with Frame Advisor" +title: Analyze your application with Frame Advisor weight: 8 # 1 is first, 2 is second, etc. @@ -18,15 +18,15 @@ Start by connecting to your device. - On Windows, search for Performance Studio. - On macOS and Linux, open the Performance Studio application file from the install directory. - ![Performance Studio Hub](images/ps_hub.png) + ![Screenshot of the Arm Performance Studio Hub showing the Frame Advisor launch card used to open Frame Advisor#center](images/ps_hub.png) 2. Select `New trace` to start a new trace. - ![Frame Advisor launch screen](images/fa_launch_screen.png) + ![Screenshot of the Frame Advisor welcome screen showing the New trace button used to start a frame capture session#center](images/fa_launch_screen.png) 3. Select your device, and the application that you want to capture frames from. - ![Device connection screen](images/fa_connect.png) + ![Screenshot of Frame Advisor showing a connected Android device, a selected debuggable application, OpenGL ES selected, and the Next button for starting the session#center](images/fa_connect.png) 4. If your application uses the Vulkan API, change the selection in the API settings to `Vulkan`. @@ -40,7 +40,7 @@ After connecting to your device, you can capture a frame burst. 1. The `Capture` screen provides options for your capture session. - ![Frame Advisor capture screen](images/fa_capture.png) + ![Screenshot of the Frame Advisor Capture frames for analysis screen showing the live application preview, frame count control, and Capture button#center](images/fa_capture.png) When you approach the part of your game where the problem occurs, click `Pause` and use the `Step` button to focus in just before it. @@ -54,27 +54,27 @@ After connecting to your device, you can capture a frame burst. Frame Advisor presents the captured data in the `Analysis` screen. See your captured frames in the `Frame Hierarchy` view. -![Example Analysis screen](images/fa_example_analysis_screen_1-1.png) +![Screenshot of the Frame Advisor Analysis screen showing Frame Hierarchy, Render Graph, API Calls, Framebuffers, Content Metrics, and Detailed Metrics panels for a captured frame#center](images/fa_example_analysis_screen_1-1.png) Explore each frame to evaluate how efficiently they were rendered on the device. 1. Look at the Render Graph to see how the frame was constructed. - ![Render Graph](images/fa_render_graph_1.1.gif) + ![Render Graph view in Frame Advisor showing render passes connected by texture and render-buffer dependencies so unused attachments can be identified#center](images/fa_render_graph_1.1.gif) Evaluate the render graph to look for render passes or input or output attachments that aren’t used in the final output, and could be removed, saving processing power and bandwidth. 1. Expand a frame in the `Frame Hierarchy` view, to see the render passes and draw calls within it. Step through the draw calls and watch the scene being built up in the `Framebuffers` view with each draw. Look for draw calls that could be eliminated, such as those that do not contribute anything to the final output. Look for identical draw calls that could be batched together into one draw. - ![Framebuffers view](images/fa_frame_buffer_view.png) + ![Framebuffers view in Frame Advisor showing the selected draw call output so you can step through how the frame is built#center](images/fa_frame_buffer_view.png) 1. In the `Content Metrics` view, sort draw calls by the number of primitives to find the most expensive objects. See whether these objects could be simplified. - ![Content Metrics view](images/fa_content_metrics.png) + ![Content Metrics view in Frame Advisor sorted by primitive count with the Prims column highlighted to identify expensive draw calls#center](images/fa_content_metrics.png) 1. For an expensive object, check the `Detailed Metrics` view to see how efficiently the object's mesh is being rendered to the screen. Look for objects with duplicated vertices, or those that do not efficiently reuse indices. - ![Detailed Metrics view](images/fa_detailed_metrics_view.png) + ![Detailed Metrics view in Frame Advisor showing mesh complexity, locality, redundancy, and memory layout for the selected draw call#center](images/fa_detailed_metrics_view.png) Watch this [video tutorial](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Capture%20and%20analyze%20a%20problem%20frame%20with%20Frame%20Advisor) to see how to capture and analyze a problem frame with Frame Advisor. @@ -82,4 +82,4 @@ Watch this [video tutorial](https://developer.arm.com/Additional%20Resources/Vid You've now analyzed your application with Frame Advisor. -Next, you'll use RenderDoc for Arm GPUs to capture frames and select application events for debugging. \ No newline at end of file +Next, you'll use RenderDoc for Arm GPUs to capture frames and select application events for debugging. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md index a48b3280f5..a7bb43da54 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md @@ -30,7 +30,7 @@ You can use the [Arm Streamline example capture](/learning-paths/mobile-graphics Report performance_advisor-.html" successfully generated ``` Open the report in a browser and explore the report. - ![Performance Advisor #center](images/pa.png "Performance Advisor report") + ![Screenshot of a Performance Advisor report showing device information, capture summary, average frame rate, boundedness distribution, and resource utilization#center](images/pa.png "Performance Advisor report") ## Evaluate the report diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md index 3541bbd8bb..127c862c02 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md @@ -16,7 +16,7 @@ To run RenderDoc for Arm GPUs, follow these steps: 1. Open RenderDoc for Arm GPUs and select your connected device from the **Replay Context** dropdown list at the bottom left of the RenderDoc UI. - ![Replay Context dropdown location in RenderDoc](images/rd_replay_context.png) + ![Screenshot of the RenderDoc Replay Context selector at the bottom left, where you choose the connected Android target before launching the app#center](images/rd_replay_context.png) The RenderDoc APK starts running on your target. @@ -26,7 +26,7 @@ To run RenderDoc for Arm GPUs, follow these steps: 1. Click **Launch**, to start the application running on your target. After a successful launch, a new target-specific tab opens in the UI where you can select the frames that you want to capture. - ![Capture frame controls in RenderDoc](images/rd_capture_controls.png) + ![Screenshot of RenderDoc for Arm GPUs showing an established Android target connection, capture frame controls, and collected frame thumbnails#center](images/rd_capture_controls.png) As your application runs, you can choose to: @@ -40,11 +40,11 @@ To run RenderDoc for Arm GPUs, follow these steps: 1. Select a capture from the **Captures collected** window and click **Open**. When the frame has loaded, it is displayed on the target and in the **Texture Viewer** tab, and the **Event Browser** is populated. - ![A captured frame loaded into RenderDoc](images/rd_full_ui.png) + ![Screenshot of a captured frame opened in RenderDoc showing the Event Browser, Texture Viewer, API Inspector, and output preview for the selected event#center](images/rd_full_ui.png) By default, the **Event Browser** shows all `action()` events, which include draws, copies, and clears. Enter a search term in the **Filter** dropdown to filter these events. - ![Event Browser in RenderDoc](images/rd_event_browser.png) + ![Screenshot of the RenderDoc Event Browser filtered for draw events with a selected draw call highlighted for debugging frame state#center](images/rd_event_browser.png) Selected events are highlighted with a green flag. All the other windows in the UI update to display information that is specific to the selected event. You can use this to view the render state and data resources that are used by the current event, and view the GPU output that resulted from it. @@ -54,4 +54,4 @@ See the [RenderDoc documentation](https://renderdoc.org/docs/index.html#) to exp You've now run RenderDoc for Arm GPUs on your application and learned how to capture frames and select events for debugging. -Next, you'll run Mali Offline Compiler to compile shaders and generate performance reports. \ No newline at end of file +Next, you'll run Mali Offline Compiler to compile shaders and generate performance reports. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md index f688c34c47..9b59e04264 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md @@ -17,14 +17,14 @@ Now that you have seen an [Arm Streamline example capture](/learning-paths/mobil - On Windows, search for Performance Studio. - On macOS and Linux, open the Performance Studio application file from the install directory. - ![Performance Studio Hub](images/ps_hub.png) + ![Screenshot of the Arm Performance Studio Hub showing the Streamline launch card used to open Streamline#center](images/ps_hub.png) 1. In the Streamline `Start` view, select `Android (adb)` as your device type, then select your device from the list of detected devices. This installs the `gatord` daemon and connects to the device. 1. Wait for the list of available packages to populate, then select the one you wish to profile. 1. With `Capture Arm GPU profile` selected, Streamline will detect the Arm GPU in the device, and select an appropriate counter template for it. Alternatively, to choose a different template or to build your own configuration, select `Use advanced mode` and click `Configure counters`. - ![Connect to device #center](images/start.png "Connect to the device") + ![Screenshot of the Streamline Start view with Android adb selected, a connected Samsung device selected, a debuggable application selected, and Capture Arm GPU profile enabled#center](images/start.png "Connect to the device") {{% notice Tip %}} Optionally, you can set a preferred location to store your captures using `Window` > `Preferences` > `Data Locations`. New reports will be created in the topmost folder specified. @@ -37,7 +37,7 @@ Optionally, you can set a preferred location to store your captures using `Windo 1. The application starts automatically on the device. Interact with the application as desired for the profiling run you wish to do. 1. When you have collected enough data, click `Stop capture`. -![Stop capture #center](images/stop_capture.webp "Stop Capture") +![Screenshot of Streamline during a capture with the Stop capture button highlighted and performance charts updating in the Timeline view#center](images/stop_capture.webp "Stop Capture") Streamline will stop capturing data, remove the daemon, and process the captured data. @@ -51,4 +51,4 @@ Understanding the output of Streamline is key to the usefulness of Streamline. T You've now generated and analyzed an Arm Streamline report for your application. -Next, you'll view an example Performance Advisor report. \ No newline at end of file +Next, you'll view an example Performance Advisor report. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md index e8703d0e5b..d48a0b2814 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md @@ -14,13 +14,13 @@ To help you understand the capabilities of Streamline, an example Streamline pro 1. To open the example profile, in Streamline, select `File` > `Import`. 2. Select `Import Streamline Sample Captures` and click `Next`. - ![Import #center](images/import.png "Import Streamline Sample Captures") + ![Screenshot of the Streamline Import dialog with Import Streamline Sample Captures selected before clicking Next#center](images/import.png "Import Streamline Sample Captures") 3. Select the Android example and click `Finish`. - ![Samples #center](images/samples.png "Select sample captures") + ![Screenshot of the Import Sample Captures dialog with the Android GPU Bound Example selected before clicking Finish#center](images/samples.png "Select sample captures") 4. Double-click on the report in `Streamline Data`, then click `Analyze` when prompted. After the report is processed, you'll see an interactive timeline. -![Timeline #center](images/timeline.png "Streamline Timeline") +![Screenshot of the Streamline Timeline tab for the Android GPU Bound Example showing CPU cycles, draw calls, frame rate, Mali core cycles, and process activity#center](images/timeline.png "Streamline Timeline") ## Analyze the results @@ -34,4 +34,3 @@ You've now viewed an example Arm Streamline report and interpreted the results u Next, you'll use Arm Streamline to capture data for your application. - From 647efcad543fc2b33aa8c4a75ef7bce4e92b96e1 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 16:06:33 -0500 Subject: [PATCH 114/137] update link text --- .../learning-paths/mobile-graphics-and-gaming/ams/fa.md | 8 ++++---- .../mobile-graphics-and-gaming/ams/malioc.md | 7 ++++--- .../learning-paths/mobile-graphics-and-gaming/ams/pa.md | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md index cd4852a1ba..6049c3d15e 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md @@ -64,19 +64,19 @@ Explore each frame to evaluate how efficiently they were rendered on the device. Evaluate the render graph to look for render passes or input or output attachments that aren’t used in the final output, and could be removed, saving processing power and bandwidth. -1. Expand a frame in the `Frame Hierarchy` view, to see the render passes and draw calls within it. Step through the draw calls and watch the scene being built up in the `Framebuffers` view with each draw. Look for draw calls that could be eliminated, such as those that do not contribute anything to the final output. Look for identical draw calls that could be batched together into one draw. +2. Expand a frame in the `Frame Hierarchy` view, to see the render passes and draw calls within it. Step through the draw calls and watch the scene being built up in the `Framebuffers` view with each draw. Look for draw calls that could be eliminated, such as those that do not contribute anything to the final output. Look for identical draw calls that could be batched together into one draw. ![Framebuffers view in Frame Advisor showing the selected draw call output so you can step through how the frame is built#center](images/fa_frame_buffer_view.png) -1. In the `Content Metrics` view, sort draw calls by the number of primitives to find the most expensive objects. See whether these objects could be simplified. +3. In the `Content Metrics` view, sort draw calls by the number of primitives to find the most expensive objects. See whether these objects could be simplified. ![Content Metrics view in Frame Advisor sorted by primitive count with the Prims column highlighted to identify expensive draw calls#center](images/fa_content_metrics.png) -1. For an expensive object, check the `Detailed Metrics` view to see how efficiently the object's mesh is being rendered to the screen. Look for objects with duplicated vertices, or those that do not efficiently reuse indices. +4. For an expensive object, check the `Detailed Metrics` view to see how efficiently the object's mesh is being rendered to the screen. Look for objects with duplicated vertices, or those that do not efficiently reuse indices. ![Detailed Metrics view in Frame Advisor showing mesh complexity, locality, redundancy, and memory layout for the selected draw call#center](images/fa_detailed_metrics_view.png) -Watch this [video tutorial](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Capture%20and%20analyze%20a%20problem%20frame%20with%20Frame%20Advisor) to see how to capture and analyze a problem frame with Frame Advisor. +To see how to capture and analyze a problem frame with Frame Advisor, see the [Capture and analyze a problem frame with Frame Advisor video tutorial](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Capture%20and%20analyze%20a%20problem%20frame%20with%20Frame%20Advisor). ## What you've accomplished and what's next diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index de320f3e18..130b1266bc 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -47,7 +47,7 @@ A performance report will be generated. If your frame analysis points to shader cost, compile one of your shaders. You can also use this sample to understand the report. -An example (`OpenGL ES`) shader is provided in the [documentation](https://developer.arm.com/documentation/102468/latest/Compile-your-shader): +An example (`OpenGL ES`) shader is provided in [Compile your shader](https://developer.arm.com/documentation/102468/latest/Compile-your-shader) in the Arm documentation: ```C #version 310 es #define WINDOW_SIZE 5 @@ -99,7 +99,8 @@ Longest path cycles: 4.53 0.00 0.25 2.50 A A = Arithmetic, LS = Load/Store, V = Varying, T = Texture ``` -An example optimization is explained in the [documentation](https://developer.arm.com/documentation/102468/latest/Optimize-your-shader). +An example optimization is described in [Optimize your shader](https://developer.arm.com/documentation/102468/latest/Optimize-your-shader) in the Arm documentation: + ```C #version 310 es #define WINDOW_SIZE 5 @@ -138,7 +139,7 @@ A = Arithmetic, LS = Load/Store, V = Varying, T = Texture ``` Observe that the number of `Arithmetic` cycles has been significantly reduced. -Understanding the output of the report is key to the usefulness of the Mali Offline Compiler. This brief [video tutorial](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Arm%20Mali%20GPU%20Training%20-%20EP3-5) is an excellent starter. +Understanding the output of the report is key to the usefulness of the Mali Offline Compiler. For more information, see the [Arm GPU Training - Episode 3.5: Mali Offline Compiler](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Arm%20Mali%20GPU%20Training%20-%20EP3-5) video tutorial. ## What you've accomplished diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md index aa6ab7e1ba..e8cd84a9a0 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md @@ -89,7 +89,7 @@ See the [Get started with Performance Advisor Tutorial](https://developer.arm.co streamline-cli -pa my_capture.apc ``` - The available options are documented in the [Performance Advisor User Guide](https://developer.arm.com/documentation/102009/latest/Command-line-options/The-pa-command), else can be seen with: + For a list of available options, see [The Streamline-cli -pa command](https://developer.arm.com/documentation/102009/9-7/Command-line-options/The-Streamline-cli--pa-command) in the Arm documentation, or run the following command: ```console streamline-cli -pa -h @@ -114,7 +114,7 @@ This feature is particularly useful when used within a [CI workflow](https://dev ## Specify performance budgets -You can specify a performance budget which will be reflected in the Performance Advisor report. For more information, refer to the [Performance Advisor User Guide](https://developer.arm.com/documentation/102009/latest/Quick-start-guide/Setting-performance-budgets) section on performance budgets. +You can specify a performance budget which will be reflected in the Performance Advisor report. For more information, see [Setting performance budgets](https://developer.arm.com/documentation/102009/latest/Quick-start-guide/Setting-performance-budgets) in the Arm documentation. ## What you've accomplished and what's next From 80dc3ae53b02d9b1c4b767b205b22cce6b5eb842 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 17:37:20 -0500 Subject: [PATCH 115/137] second pass style edits --- .../mobile-graphics-and-gaming/ams/_index.md | 5 ++- .../mobile-graphics-and-gaming/ams/ams.md | 10 +++--- .../mobile-graphics-and-gaming/ams/fa.md | 32 +++++++++-------- .../mobile-graphics-and-gaming/ams/malioc.md | 24 +++++++------ .../mobile-graphics-and-gaming/ams/pa.md | 34 ++++++++++--------- .../ams/pa_example.md | 10 +++--- .../ams/renderdoc.md | 22 ++++++------ .../ams/setup_tasks.md | 20 +++++------ .../ams/streamline.md | 20 ++++++----- .../ams/streamline_example.md | 17 +++++----- 10 files changed, 103 insertions(+), 91 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md index 5c98b3c034..a0ef9c4dc9 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md @@ -15,12 +15,11 @@ learning_objectives: prerequisites: - An Android device. - - Arm Performance Studio supports applications built with OpenGL ES versions 2.0 to 3.2, or Vulkan versions 1.0 to 1.2. + - An debuggable build of your application built with OpenGL ES versions 2.0 to 3.2, or Vulkan versions 1.0 to 1.2. - For OpenGL ES applications, your device must be running Android 10 or later. - For Vulkan applications, your device must be running Android 9 or later. - - A debuggable build of your application. - Arm Performance Studio installed. Follow the [Arm Performance Studio install guide](/install-guides/ams/) for instructions. - - Android SDK Platform tools installed. Required for the Android Debug bridge (adb). + - Android SDK Platform tools installed for the Android Debug bridge (adb). author: Ronan Synnott diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md index bcd9b063eb..25939ddbe4 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md @@ -9,11 +9,13 @@ layout: "learningpathall" --- ## What is Arm Performance Studio? -[Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a performance analysis tool suite for developers to performance test their applications on devices with Mali-based GPUs. It consists of four easy-to-use tools that show you how well your application performs either on off-the-shelf Android devices, or Linux targets. The tools help you to identify problems that might slow down performance, overheat the device, or drain the battery. +[Arm Performance Studio](https://developer.arm.com/Tools%20and%20Software/Arm%20Performance%20Studio) is a performance analysis tool suite that you can use to performance test applications on devices with Mali-based GPUs. + +Performance Studio consists of four tools that show you how well your application performs either on off-the-shelf Android devices, or Linux targets. You can use the tools to identify problems that might slow down performance, overheat the device, or drain the battery. | Component | Functionality | |----------|-------------| -| [Streamline](https://developer.arm.com/Tools%20and%20Software/Streamline%20Performance%20Analyzer) with [Performance Advisor](https://developer.arm.com/Tools%20and%20Software/Performance%20Advisor) | Capture a performance profile that shows all the performance counter activity from the device. Generate an easy-to-read performance summary from an annotated Streamline capture, and get actionable advice about where you should optimize. | +| [Streamline](https://developer.arm.com/Tools%20and%20Software/Streamline%20Performance%20Analyzer) with [Performance Advisor](https://developer.arm.com/Tools%20and%20Software/Performance%20Advisor) | Capture a performance profile that shows all the performance counter activity from the device. Generate a performance summary from an annotated Streamline capture, and get actionable advice about where you should optimize. | | [Frame Advisor](https://developer.arm.com/Tools%20and%20Software/Frame%20Advisor) | Capture the API calls and rendering from a problem frame and get comprehensive geometry metrics to discover what might be slowing down your application. | | [Mali Offline Compiler](https://developer.arm.com/Tools%20and%20Software/Mali%20Offline%20Compiler) | Analyze how efficiently your shader programs perform on a range of Mali GPUs. | | [RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) | The industry-standard tool for debugging Vulkan graphics applications, including early support for Arm GPU extensions and Android features. | @@ -26,7 +28,7 @@ For installation instructions, see the [Arm Performance Studio install guide](/i ## Update your PATH environment variable (Linux and macOS) -Edit your `PATH` environment variable to add the paths to the Streamline and Mali Offline Compiler executables. This is so that you can run Streamline's `Streamline-cli -pa` command and Mali Offline Compiler's `malioc` command from any directory. This step is not necessary on Windows, as this is done automatically when Arm Performance Studio is installed. +Edit your `PATH` environment variable to add the paths to the Streamline and Mali Offline Compiler executables. By adding the paths, you can run Streamline's `Streamline-cli -pa` command and Mali Offline Compiler's `malioc` command from any directory. This step is not necessary on Windows, as this is done automatically when Arm Performance Studio is installed. On macOS, edit your `/etc/paths` file to add the following paths: @@ -53,6 +55,6 @@ To open the tools, launch the Performance Studio Hub: ## What you've accomplished and what's next -You've now set up Arm Performance Studio and updated your PATH environment variable so you can use suite of available tools to profile applications. +You've set up Arm Performance Studio and updated your `PATH` so you can use the profiling tools from a terminal. Next, you'll set up the application that you'll profile in this Learning Path. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md index 6049c3d15e..c5891b4fd9 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md @@ -10,7 +10,9 @@ layout: "learningpathall" ## Connect to your Android device -[Frame Advisor](https://developer.arm.com/Tools%20and%20Software/Frame%20Advisor) offers in-depth frame-based analysis for mobile graphics in Android applications. By capturing the API calls and rendering processes of a specific frame, you can identify potential performance bottlenecks that may be causing slowdowns in your application. +[Frame Advisor](https://developer.arm.com/Tools%20and%20Software/Frame%20Advisor) offers in-depth frame-based analysis for mobile graphics in Android applications. + +By capturing the API calls and rendering processes of a specific frame, you can identify performance bottlenecks that might slow down your application. Start by connecting to your device. @@ -20,7 +22,7 @@ Start by connecting to your device. ![Screenshot of the Arm Performance Studio Hub showing the Frame Advisor launch card used to open Frame Advisor#center](images/ps_hub.png) -2. Select `New trace` to start a new trace. +2. Select **New trace** to start a new trace. ![Screenshot of the Frame Advisor welcome screen showing the New trace button used to start a frame capture session#center](images/fa_launch_screen.png) @@ -28,31 +30,31 @@ Start by connecting to your device. ![Screenshot of Frame Advisor showing a connected Android device, a selected debuggable application, OpenGL ES selected, and the Next button for starting the session#center](images/fa_connect.png) -4. If your application uses the Vulkan API, change the selection in the API settings to `Vulkan`. +4. If your application uses the Vulkan API, change the selection in the API settings to **Vulkan**. -5. Click `Next` to continue. +5. Select **Next** to continue. - Unless you chose the `Pause on connect` option in the `Device connection` screen, the application starts automatically on the device. + Unless you chose the **Pause on connect** option in the **Device connection** screen, the application starts automatically on the device. ## Capture a frame burst After connecting to your device, you can capture a frame burst. -1. The `Capture` screen provides options for your capture session. +1. The **Capture** screen provides options for your capture session. ![Screenshot of the Frame Advisor Capture frames for analysis screen showing the live application preview, frame count control, and Capture button#center](images/fa_capture.png) - When you approach the part of your game where the problem occurs, click `Pause` and use the `Step` button to focus in just before it. + When you approach the part of your game where the problem occurs, select **Pause** and use the **Step** button to focus in just before it. -2. You can capture one frame burst of up to 3 consecutive frames. Adjust the `Frame count` as required. +2. You can capture one frame burst of up to three consecutive frames. Adjust the **Frame count** as required. -3. Click the `Capture` button to start capturing the frame burst. Wait for the capture to complete. This may take several seconds. +3. Select the **Capture** button to start capturing the frame burst. Wait for the capture to complete. This may take several seconds. -4. Click `Analyze` to see the results. It may take a few minutes to analyze the data. +4. Select **Analyze** to see the results. It may take a few minutes to analyze the data. ## Analyze the capture -Frame Advisor presents the captured data in the `Analysis` screen. See your captured frames in the `Frame Hierarchy` view. +Frame Advisor presents the captured data in the **Analysis** screen. See your captured frames in the **Frame Hierarchy** view. ![Screenshot of the Frame Advisor Analysis screen showing Frame Hierarchy, Render Graph, API Calls, Framebuffers, Content Metrics, and Detailed Metrics panels for a captured frame#center](images/fa_example_analysis_screen_1-1.png) @@ -62,17 +64,17 @@ Explore each frame to evaluate how efficiently they were rendered on the device. ![Render Graph view in Frame Advisor showing render passes connected by texture and render-buffer dependencies so unused attachments can be identified#center](images/fa_render_graph_1.1.gif) - Evaluate the render graph to look for render passes or input or output attachments that aren’t used in the final output, and could be removed, saving processing power and bandwidth. + Evaluate the render graph to look for render passes or input or output attachments that aren’t used in the final output and can be removed to save processing power and bandwidth. -2. Expand a frame in the `Frame Hierarchy` view, to see the render passes and draw calls within it. Step through the draw calls and watch the scene being built up in the `Framebuffers` view with each draw. Look for draw calls that could be eliminated, such as those that do not contribute anything to the final output. Look for identical draw calls that could be batched together into one draw. +2. Expand a frame in the **Frame Hierarchy** view, to see the render passes and draw calls within it. Step through the draw calls and watch the scene being built up in the **Framebuffers** view with each draw. Look for draw calls that can be eliminated, or identical draw calls that can be batched together. ![Framebuffers view in Frame Advisor showing the selected draw call output so you can step through how the frame is built#center](images/fa_frame_buffer_view.png) -3. In the `Content Metrics` view, sort draw calls by the number of primitives to find the most expensive objects. See whether these objects could be simplified. +3. In the **Content Metrics** view, sort draw calls by the number of primitives to find the most expensive objects. See whether these objects could be simplified. ![Content Metrics view in Frame Advisor sorted by primitive count with the Prims column highlighted to identify expensive draw calls#center](images/fa_content_metrics.png) -4. For an expensive object, check the `Detailed Metrics` view to see how efficiently the object's mesh is being rendered to the screen. Look for objects with duplicated vertices, or those that do not efficiently reuse indices. +4. For an expensive object, check the **Detailed Metrics** view to see how efficiently the object's mesh is being rendered to the screen. Look for objects with duplicated vertices, or those that do not efficiently reuse indices. ![Detailed Metrics view in Frame Advisor showing mesh complexity, locality, redundancy, and memory layout for the selected draw call#center](images/fa_detailed_metrics_view.png) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 130b1266bc..ba627e0e65 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -1,6 +1,6 @@ --- # User change -title: Generate a performance report with Mali Offline Compiler +title: Analyze shader program performance with Mali Offline Compiler weight: 10 # 1 is first, 2 is second, etc. @@ -10,9 +10,9 @@ layout: "learningpathall" ## Before you begin -Mali Offline Compiler is a command-line tool that you can use to compile all shaders and kernels from OpenGL ES and Vulkan, and generate a performance report for the GPU of interest. +Mali Offline Compiler is a command-line tool that you can use to compile shaders and kernels from OpenGL ES and Vulkan. The tool generates a performance report for the GPU of interest. -In a terminal, test that Mali Offline Compiler is installed correctly, by typing: +To test that Mali Offline Compiler is installed correctly, run: ``` malioc --help @@ -20,7 +20,6 @@ malioc --help The `--help` option returns usage instructions and the full list of available options for the malioc command. - {{% notice Note %}} On macOS, Mali Offline Compiler might not be recognized as an application from an identified developer. To enable Mali Offline Compiler, open **System Preferences > Security & Privacy**, and select **Allow Anyway** for the `malioc` item. {{% /notice %}} @@ -41,11 +40,11 @@ malioc --info --core ## Compile your shader -You can compile OpenGL ES (`--opengles`) and Vulkan (`--vulkan`) shader programs, as well as Open GL (`--opengl `) C kernels (Linux host only). +You can compile OpenGL ES (`--opengles`) and Vulkan (`--vulkan`) shader programs. On Linux hosts, you can also compile OpenGL (`--opengl `) C kernels. A performance report will be generated. -If your frame analysis points to shader cost, compile one of your shaders. You can also use this sample to understand the report. +If your frame analysis points to shader cost, compile one of your shaders. You can also use this sample shader to learn how to read the report. An example (`OpenGL ES`) shader is provided in [Compile your shader](https://developer.arm.com/documentation/102468/latest/Compile-your-shader) in the Arm documentation: ```C @@ -80,13 +79,15 @@ Compile the shader for [Mali-G76](https://developer.arm.com/Processors/Mali-G76) malioc --core Mali-G76 shader.frag ``` -The full list of available options can be seen with: +To view the full list of available options, run: + ```console malioc --help ``` -For more information, refer to [Compiling OpenGL ES shaders](https://developer.arm.com/documentation/101863/latest/Using-Mali-Offline-Compiler/Compiling-OpenGL-ES-shaders) and [Compiling Vulkan shaders](https://developer.arm.com/documentation/101863/latest/Using-Mali-Offline-Compiler/Compiling-Vulkan-shaders) in the Mali Offline Compiler User Guide. -## Analyze the report +For more information, see [Compiling OpenGL ES shaders](https://developer.arm.com/documentation/101863/latest/Using-Mali-Offline-Compiler/Compiling-OpenGL-ES-shaders) and [Compiling Vulkan shaders](https://developer.arm.com/documentation/101863/latest/Using-Mali-Offline-Compiler/Compiling-Vulkan-shaders) in the Mali Offline Compiler User Guide. + +## Interpret the report The report will provide an approximate cycle cost breakdown for the major functional units in the design. Use this information to optimize your shader. @@ -130,6 +131,7 @@ void main() { } ``` Compiling the optimized implementation reports: + ```output A LS V T Bound Total instruction cycles: 0.96 0.00 0.25 2.50 T @@ -137,9 +139,9 @@ Shortest path cycles: 0.54 0.00 0.25 2.50 T Longest path cycles: 0.96 0.00 0.25 2.50 T A = Arithmetic, LS = Load/Store, V = Varying, T = Texture ``` -Observe that the number of `Arithmetic` cycles has been significantly reduced. +Observe that the number of total `Arithmetic` cycles has been significantly reduced from 4.53 to 0.96. -Understanding the output of the report is key to the usefulness of the Mali Offline Compiler. For more information, see the [Arm GPU Training - Episode 3.5: Mali Offline Compiler](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Arm%20Mali%20GPU%20Training%20-%20EP3-5) video tutorial. +To learn more about interpreting Mali Offline Compiler reports, see the [Arm GPU Training - Episode 3.5: Mali Offline Compiler](https://developer.arm.com/Additional%20Resources/Video%20Tutorials/Arm%20Mali%20GPU%20Training%20-%20EP3-5) video tutorial. ## What you've accomplished diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md index e8cd84a9a0..ae3dcd7fe8 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md @@ -18,11 +18,11 @@ This script does the following: * Temporarily installs a daemon application on your device, called `gatord`, which Streamline uses to collect counter data. * Temporarily installs the OpenGL ES or Vulkan layer library file on your device, which is needed to collect frame data. -* Enables you to specify options for the capture, such as whether to collect screenshots when the FPS drops below a certain threshold. +* Allows you to specify options for the capture, such as whether to collect screenshots when the FPS drops below a certain threshold. -To connect to the Android device and capture frame data, follow these steps: +To connect to the Android device and capture frame data: -1. Open a terminal or command prompt, navigate to the `Arm Performance Studio` install directory and locate the `streamline_me.py` script: +1. Open a terminal or command prompt, navigate to the Arm Performance Studio install directory and locate the `streamline_me.py` script: ```console cd /streamline/bin/android @@ -35,7 +35,7 @@ To connect to the Android device and capture frame data, follow these steps: ``` {{% notice Tip %}} -To see all available options, use `python3 streamline_me.py --help` +To see all available options, use `python3 streamline_me.py --help`. {{% /notice %}} 3. The script returns a numbered list of the Android package names for the debuggable applications that are installed on your device. Enter the number of the application you want to profile. @@ -62,28 +62,30 @@ To see all available options, use `python3 streamline_me.py --help` The script identifies the GPU in the device, installs the daemon application and layer library, then waits for you to complete the capture in Streamline. {{% notice Note %}} -Leave the terminal window open, as you need to come back to it after the capture is complete, to stop the script. When the script ends, any captured screenshots are saved to the directory you specified, and the daemon application and layer library are uninstalled from the device. Do not unplug the device until the script has ended. +Leave the terminal window open, as you need to come back to it after the capture is complete, to stop the script. + +When the script ends, any captured screenshots are saved to the directory you specified, and the daemon application and layer library are uninstalled from the device. Don't unplug the device until the script has ended. {{% /notice %}} -See the [Get started with Performance Advisor Tutorial](https://developer.arm.com/documentation/102478/latest/Run-the-streamline-me-py-script) for full instructions. +For full instructions, see the [Get started with Performance Advisor Tutorial](https://developer.arm.com/documentation/102478/latest/Run-the-streamline-me-py-script). ## Capture data with Streamline -1. Open Streamline and select the device and application on the `Start` tab. +1. Open Streamline and select the device and application on the **Start** tab. -1. Click `Start capture` to start capturing profile data from the target. Enter a name and location for the capture file that Streamline creates. +2. Select **Start capture** to start capturing profile data from the target. Enter a name and location for the capture file that Streamline creates. -1. The application starts automatically on the device. Interact with the application as required. +3. The application starts automatically on the device. Interact with the application as required. -1. When you have collected enough data, click the `Stop capture` button. +4. When you have collected enough data, select **Stop capture**. -1. Return to your terminal, and press `ENTER` to terminate the `streamline_me.py` script. +5. Return to your terminal, and press `ENTER` to terminate the `streamline_me.py` script. ## Generate an HTML performance report 1. In the terminal window, navigate to the location where you stored the Streamline capture file (`.apc`). -1. Run Streamline's `streamline-cli` command with the `-pa` option on the Streamline capture file to generate the report. The default name is `report.html`. +2. Run Streamline's `streamline-cli` command with the `-pa` option on the Streamline capture file to generate the report. The default name is `report.html`. ```console streamline-cli -pa my_capture.apc @@ -95,10 +97,10 @@ See the [Get started with Performance Advisor Tutorial](https://developer.arm.co streamline-cli -pa -h ``` - To pass a list of options in a separate file to `Streamline-cli -pa`, use: + To pass a list of options in a separate file to `streamline-cli -pa`, use: ``` - Streamline-cli -pa "@" + streamline-cli -pa "@" ``` ## Generate a JSON performance report @@ -107,7 +109,7 @@ This feature is particularly useful when used within a [CI workflow](https://dev 1. In the terminal window, navigate to the location where you stored the Streamline capture file (`.apc`). -1. Run Streamline's `streamline-cli` command with the `-pa` and `--type=json` options on the Streamline capture file to generate the report (named `report.json` in below): +2. Run Streamline's `streamline-cli` command with the `-pa` and `--type=json` options on the Streamline capture file to generate the report named `report.json`: ```console streamline-cli -pa --type=json:report.json my_capture.apc ``` @@ -118,6 +120,6 @@ You can specify a performance budget which will be reflected in the Performance ## What you've accomplished and what's next -You've now generated JSON and HTML performance Performance Advisor reports for your application. +You've now generated JSON and HTML Performance Advisor reports for your application. Next, you'll perform frame-based analysis on your application using Frame Advisor. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md index a7bb43da54..d832fa705b 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md @@ -12,15 +12,15 @@ layout: "learningpathall" Performance Advisor creates an easy-to-read report from a Streamline capture that you can use to understand how your Android application performs on a mobile device. -You can use the [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/) that comes with Arm Performance Studio to generate an example `Performance Advisor` report. +You can use the [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/) that comes with Arm Performance Studio to generate an example Performance Advisor report. 1. Open a terminal, and navigate to the location of the imported capture. -1. Run the `streamline-cli` command with the `-pa` option on the Streamline capture file (.apc): +1. Run the `streamline-cli` command with the `-pa` option on the Streamline capture file (`.apc`): ```command streamline-cli -pa "Android - GPU Bound Example.apc" ``` - The capture is processed, and a `html` report generated. Warnings shown can be ignored for now: + The capture is processed, and an HTML report is generated. For now, you can ignore the warnings shown: ```output Importing capture... Fetching data... @@ -29,7 +29,7 @@ You can use the [Arm Streamline example capture](/learning-paths/mobile-graphics Generating report type html... Report performance_advisor-.html" successfully generated ``` - Open the report in a browser and explore the report. + Open the report in a browser and review the summary. ![Screenshot of a Performance Advisor report showing device information, capture summary, average frame rate, boundedness distribution, and resource utilization#center](images/pa.png "Performance Advisor report") ## Evaluate the report @@ -38,6 +38,6 @@ For a detailed explanation on how to interpret the report, see the [Example Perf ## What you've accomplished and what's next -You've now created a performance report from the example Streamline capture that's packaged with Arm Performance Studio to understand the workflow for report creation. +You've created a Performance Advisor report from the example Streamline capture and seen how the report summarizes application performance. Next, you'll create a report for your application. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md index 127c862c02..0d430e6646 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md @@ -10,9 +10,11 @@ layout: "learningpathall" ## Run RenderDoc for Arm GPUs -[RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) is an Arm fork of the [RenderDoc](https://renderdoc.org/) open-source debugger. The Arm release includes support for API features and extensions that are available on the latest Arm GPUs, but not yet supported in upstream RenderDoc. Arm intends to contribute changes to the upstream project, but some Arm-specific or Android-specific features might be available only in the Arm fork. +[RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) is an Arm fork of the [RenderDoc](https://renderdoc.org/) open-source debugger. -To run RenderDoc for Arm GPUs, follow these steps: +The Arm release includes support for API features and extensions that are available on the latest Arm GPUs, but not yet supported in upstream RenderDoc. Arm intends to contribute changes to the upstream project, but some Arm-specific or Android-specific features might be available only in the Arm fork. + +To run RenderDoc for Arm GPUs: 1. Open RenderDoc for Arm GPUs and select your connected device from the **Replay Context** dropdown list at the bottom left of the RenderDoc UI. @@ -22,23 +24,23 @@ To run RenderDoc for Arm GPUs, follow these steps: If you don't see your device, check that your device is setup correctly as described in [Setup tasks](/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks/). -1. Navigate to the **Launch Application** tab, and set the Executable Path to the application that you want to debug. Click the **Browse** button to view all of the installed application packages on the target and find the `.exe` file. +2. Navigate to the **Launch Application** tab, and set the **Executable Path** to the application that you want to debug. Select the **Browse** button to view all of the installed application packages on the target and find the `.exe` file. -1. Click **Launch**, to start the application running on your target. After a successful launch, a new target-specific tab opens in the UI where you can select the frames that you want to capture. +3. Select **Launch**, to start the application running on your target. After a successful launch, a new target-specific tab opens in the UI where you can select the frames that you want to capture. ![Screenshot of RenderDoc for Arm GPUs showing an established Android target connection, capture frame controls, and collected frame thumbnails#center](images/rd_capture_controls.png) As your application runs, you can choose to: - * Capture one or more frames immediately - * Capture one or more frames after a delay - * Capture one or more frames after a specific frame + - Capture one or more frames immediately + - Capture one or more frames after a delay + - Capture one or more frames after a specific frame Use these controls to take captures of your application as it runs on the target device. Captured frames are stored temporarily on the device. -1. When you have finished capturing the frames of interest, stop the application that you are debugging. Keep RenderDoc running though, as this is needed so that you can analyze and debug your captures. +4. When you have finished capturing the frames of interest, stop the application that you are debugging. Keep RenderDoc running so that you can analyze and debug your captures. -1. Select a capture from the **Captures collected** window and click **Open**. When the frame has loaded, it is displayed on the target and in the **Texture Viewer** tab, and the **Event Browser** is populated. +5. Select a capture from the **Captures collected** window and select **Open**. When the frame has loaded, it is displayed on the target and in the **Texture Viewer** tab, and the **Event Browser** is populated. ![Screenshot of a captured frame opened in RenderDoc showing the Event Browser, Texture Viewer, API Inspector, and output preview for the selected event#center](images/rd_full_ui.png) @@ -46,7 +48,7 @@ To run RenderDoc for Arm GPUs, follow these steps: ![Screenshot of the RenderDoc Event Browser filtered for draw events with a selected draw call highlighted for debugging frame state#center](images/rd_event_browser.png) - Selected events are highlighted with a green flag. All the other windows in the UI update to display information that is specific to the selected event. You can use this to view the render state and data resources that are used by the current event, and view the GPU output that resulted from it. + Selected events are highlighted with a green flag. The other windows in the UI update to display information for the selected event, including the render state, data resources, and GPU output. See the [RenderDoc documentation](https://renderdoc.org/docs/index.html#) to explore the full list of features. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md index 2c184c5bc2..cd98df1c93 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md @@ -1,6 +1,6 @@ --- # User change -title: Set up the Android application +title: Set up an Android application weight: 3 # 1 is first, 2 is second, etc. @@ -11,17 +11,17 @@ layout: "learningpathall" Complete the following prerequisites: -1. Ensure you have installed [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb). `adb` is available with the Android SDK platform tools, which are installed as part of Android Studio. Alternatively, you can download them separately as part of the Android SDK platform tools. +1. Install [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb). `adb` is available with the Android SDK platform tools, which are installed as part of Android Studio. Alternatively, you can download them separately as part of the Android SDK platform tools. 2. Performance Advisor uses a Python script to connect to your device. To run this script, you'll need [Python](https://www.python.org/downloads/) 3.8 or later installed. ## Build your application -You need to compile the application with debug enabled, as well as additional options to facilitate call stack unwinding by Streamline. +Compile the application with debug enabled, as well as additional options to facilitate call stack unwinding by Streamline. -- To set [Unity](https://unity.com/) applications to be debuggable, enable [Development Build](https://docs.unity3d.com/6000.0/Documentation/Manual/android-BuildProcess.html) in `Build settings`. +- To set [Unity](https://unity.com/) applications to be debuggable, enable **[Development Build](https://docs.unity3d.com/6000.0/Documentation/Manual/android-BuildProcess.html)** in **Build settings**. - In Android Studio, use a build variant that includes `debuggable true` (`isDebuggable = true` in Kotlin scripts) in the build configuration. -- In Unreal Engine, open `Project Settings > Project > Packaging > Project`, and ensure that the `For Distribution` checkbox is not set. -- For instructions on how to complie your C++ or Java applications with the right options, see the [Target setup guide for Android](https://developer.arm.com/documentation/101813/latest/Target-Setup/Compile-your-application). +- In Unreal Engine, open **Project Settings > Project > Packaging > Project**, and ensure that the **For Distribution** checkbox is not set. +- For instructions to compile your C++ or Java applications with the right options, see the [Target setup guide for Android](https://developer.arm.com/documentation/101813/latest/Target-Setup/Compile-your-application). {{% notice Tip %}} To assist with readability and add context, you can optionally include [annotations](https://developer.arm.com/documentation/101816/latest/Annotate-your-code/Add-annotations-to-your-code) in your code, which are then displayed in Streamline. @@ -31,10 +31,10 @@ To assist with readability and add context, you can optionally include [annotati To set up your Android device, follow these steps: -1. On the device, ensure that [Developer Mode](https://developer.android.com/studio/debug/dev-options) is enabled. -2. Enable `USB Debugging` under `Settings > Developer options`. If your device asks you to authorize connection to your computer, confirm the connection. +1. On the device, ensure that **[Developer Mode](https://developer.android.com/studio/debug/dev-options)** is enabled. +2. Enable **USB Debugging** under **Settings > Developer options**. If your device asks you to authorize connection to your computer, confirm the connection. 3. Connect the device to the host through USB and approve the debug connection on the device when prompted. -4. To test the connection, run the `adb devices` command in a command terminal. If successful, this returns the ID of your device: +4. To test the connection, run the `adb devices` command in a terminal. If successful, this returns the ID of your device: ```command adb devices @@ -50,4 +50,4 @@ To set up your Android device, follow these steps: You've now set up your Android device and built the application you'll use for profiling. -Next, you'll look at an example Arm Streamline report to understand the Streamline component of Arm Performance Studio. \ No newline at end of file +Next, you'll look at an example Arm Streamline report to understand the Streamline component of Arm Performance Studio. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md index 9b59e04264..985b66101a 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md @@ -19,33 +19,35 @@ Now that you have seen an [Arm Streamline example capture](/learning-paths/mobil ![Screenshot of the Arm Performance Studio Hub showing the Streamline launch card used to open Streamline#center](images/ps_hub.png) -1. In the Streamline `Start` view, select `Android (adb)` as your device type, then select your device from the list of detected devices. This installs the `gatord` daemon and connects to the device. +2. In the Streamline **Start** view, select **Android (adb)** as your device type, then select your device from the list of detected devices. This installs the `gatord` daemon and connects to the device. -1. Wait for the list of available packages to populate, then select the one you wish to profile. -1. With `Capture Arm GPU profile` selected, Streamline will detect the Arm GPU in the device, and select an appropriate counter template for it. Alternatively, to choose a different template or to build your own configuration, select `Use advanced mode` and click `Configure counters`. +3. Wait for the list of available packages to populate, then select the application you want to profile. +4. With **Capture Arm GPU profile** selected, Streamline detects the Arm GPU in the device, and selects an appropriate counter template for it. Alternatively, to choose a different template or to build your own configuration, select **Use advanced mode** and select **Configure counters**. ![Screenshot of the Streamline Start view with Android adb selected, a connected Samsung device selected, a debuggable application selected, and Capture Arm GPU profile enabled#center](images/start.png "Connect to the device") {{% notice Tip %}} -Optionally, you can set a preferred location to store your captures using `Window` > `Preferences` > `Data Locations`. New reports will be created in the topmost folder specified. +Optionally, you can set a preferred location to store your captures using **Window** > **Preferences** > **Data Locations**. New reports will be created in the topmost folder specified. {{% /notice %}} ## Capture data -1. Click `Start capture` to start capturing profile data from the device. Enter a name and location for the capture file. +1. Select **Start capture** to start capturing profile data from the device. Enter a name and location for the capture file. -1. The application starts automatically on the device. Interact with the application as desired for the profiling run you wish to do. +2. The application starts automatically on the device. Interact with the application as desired for the profiling run you wish to do. -1. When you have collected enough data, click `Stop capture`. +3. When you have collected enough data, select **Stop capture**. ![Screenshot of Streamline during a capture with the Stop capture button highlighted and performance charts updating in the Timeline view#center](images/stop_capture.webp "Stop Capture") Streamline will stop capturing data, remove the daemon, and process the captured data. ## Analyze the results -The charts in the `Timeline` view show the performance counter activity captured from the device. Hover over the charts to see the values at that point in time. Use the Calipers to focus on particular windows of activity. Refer to the [Streamline User Guide](https://developer.arm.com/documentation/101816/latest/Analyze-your-capture) for full instructions on how to use the features in the `Timeline` view. +The charts in the **Timeline** view show the performance counter activity captured from the device. Hover over the charts to see the values at that point in time. Use the Calipers to focus on particular windows of activity. -Understanding the output of Streamline is key to the usefulness of Streamline. The documentation for [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/) on Arm Developer describes how to understand the capture from a number of points of view, depending on what information you are trying to extract from it. +For instructions to use the features in the **Timeline** view, see the [Streamline User Guide](https://developer.arm.com/documentation/101816/latest/Analyze-your-capture). + +Understanding the output of Streamline is key to the usefulness of the tool. To understand how to interpret the capture from different points of view, see [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/). ## What you've accomplished and what's next diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md index d48a0b2814..2f8b42860f 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md @@ -10,27 +10,28 @@ layout: "learningpathall" ## View the example Arm Streamline report -To help you understand the capabilities of Streamline, an example Streamline profile is provided with Arm Performance Studio. +To understand the capabilities of Streamline, use the example Streamline profile that comes with Arm Performance Studio. -1. To open the example profile, in Streamline, select `File` > `Import`. -2. Select `Import Streamline Sample Captures` and click `Next`. +1. To open the example profile, in Streamline, select **File** > **Import**. +2. Select **Import Streamline Sample Captures** and click **Next**. ![Screenshot of the Streamline Import dialog with Import Streamline Sample Captures selected before clicking Next#center](images/import.png "Import Streamline Sample Captures") -3. Select the Android example and click `Finish`. +3. Select the Android example and click **Finish**. ![Screenshot of the Import Sample Captures dialog with the Android GPU Bound Example selected before clicking Finish#center](images/samples.png "Select sample captures") -4. Double-click on the report in `Streamline Data`, then click `Analyze` when prompted. After the report is processed, you'll see an interactive timeline. +4. Select the report in **Streamline Data**, then select **Analyze** when prompted. After the report is processed, you'll see an interactive timeline. ![Screenshot of the Streamline Timeline tab for the Android GPU Bound Example showing CPU cycles, draw calls, frame rate, Mali core cycles, and process activity#center](images/timeline.png "Streamline Timeline") ## Analyze the results -The charts in the `Timeline` view show the performance counter activity captured from the device. Hover over the charts to see the values at that point in time. Use the Calipers to focus on particular windows of activity. Refer to the [Streamline User Guide](https://developer.arm.com/documentation/101816/latest/Analyze-your-capture) for full instructions on how to use the features in the `Timeline` view. +The charts in the **Timeline** view show the performance counter activity captured from the device. Hover over the charts to see the values at that point in time. Use the Calipers to focus on particular windows of activity. -Understanding the output of Streamline is key to the usefulness of Streamline. [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/) describes how to understand the capture from a number of points of view, depending on what information you are trying to extract from it. +For instructions to use the features in the **Timeline** view, see the [Streamline User Guide](https://developer.arm.com/documentation/101816/latest/Analyze-your-capture). + +Understanding the output of Streamline is key to the tool's usefulness. To understand how to interpret the capture from different points of view, see [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/). ## What you've accomplished and what's next You've now viewed an example Arm Streamline report and interpreted the results using Arm documentation. Next, you'll use Arm Streamline to capture data for your application. - From 00d0ad3e853ffd89e9ec55001252523ced921066 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Thu, 25 Jun 2026 17:39:12 -0500 Subject: [PATCH 116/137] adding descriptions --- .../learning-paths/mobile-graphics-and-gaming/ams/_index.md | 3 +-- content/learning-paths/mobile-graphics-and-gaming/ams/ams.md | 2 ++ content/learning-paths/mobile-graphics-and-gaming/ams/fa.md | 2 ++ .../learning-paths/mobile-graphics-and-gaming/ams/malioc.md | 2 ++ content/learning-paths/mobile-graphics-and-gaming/ams/pa.md | 2 ++ .../mobile-graphics-and-gaming/ams/pa_example.md | 2 ++ .../learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md | 2 ++ .../mobile-graphics-and-gaming/ams/setup_tasks.md | 2 ++ .../mobile-graphics-and-gaming/ams/streamline.md | 2 ++ .../mobile-graphics-and-gaming/ams/streamline_example.md | 2 ++ 10 files changed, 19 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md index a0ef9c4dc9..a2460d8101 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md @@ -1,7 +1,7 @@ --- title: Profile an Android application with Arm Performance Studio -description: Learn how to profile an Android application using Arm Performance Studio (formerly known as Arm Mobile Studio). +description: Profile a debuggable Android graphics application with Arm Performance Studio and analyze performance with Streamline, Performance Advisor, Frame Advisor, RenderDoc for Arm GPUs, and Mali Offline Compiler. minutes_to_complete: 60 @@ -88,4 +88,3 @@ weight: 1 # _index.md always has weight of 1 to order corr layout: "learningpathall" # All files under learning paths have this same wrapper learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. --- - diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md index 25939ddbe4..74cbdac4cd 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md @@ -2,6 +2,8 @@ # User change title: Set up Arm Performance Studio +description: Install and launch Arm Performance Studio, update your PATH, and confirm the profiling tools are available for the Android application workflow. + weight: 2 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md index c5891b4fd9..94e9d099a4 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md @@ -2,6 +2,8 @@ # User change title: Analyze your application with Frame Advisor +description: Capture a frame burst with Frame Advisor and inspect render graph, framebuffer, content metrics, and detailed metrics views for bottlenecks. + weight: 8 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index ba627e0e65..61648c3d17 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -2,6 +2,8 @@ # User change title: Analyze shader program performance with Mali Offline Compiler +description: Use Mali Offline Compiler to compile shader code, compare cycle estimates, and understand when shader cost affects the profiled application. + weight: 10 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md index ae3dcd7fe8..227a3e7de3 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md @@ -2,6 +2,8 @@ # User change title: Create a Performance Advisor report for your application +description: Run streamline_me.py, capture extra frame data with Streamline, and generate HTML and JSON Performance Advisor reports for your application. + weight: 7 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md index d832fa705b..99a6b696da 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa_example.md @@ -2,6 +2,8 @@ # User change title: View an example Performance Advisor report +description: Generate an example Performance Advisor report from the sample Streamline capture and review the capture summary. + weight: 6 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md index 0d430e6646..0fbd498f00 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md @@ -2,6 +2,8 @@ # User change title: Debug your application with RenderDoc for Arm GPUs +description: Connect RenderDoc for Arm GPUs to an Android target, capture frames, and inspect events and GPU output for debugging. + weight: 9 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md index cd98df1c93..265eb9d2b5 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md @@ -2,6 +2,8 @@ # User change title: Set up an Android application +description: Prepare a debuggable Android application and device connection so Arm Performance Studio can capture profiling data. + weight: 3 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md index 985b66101a..2225ff88af 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md @@ -2,6 +2,8 @@ # User change title: Use Arm Streamline to capture data for your application +description: Capture a Streamline profile from your Android application and inspect timeline counters to start performance analysis. + weight: 5 # 1 is first, 2 is second, etc. # Do not modify these elements diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md index 2f8b42860f..f4c3283e07 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline_example.md @@ -2,6 +2,8 @@ # User change title: Interpret an example Arm Streamline report +description: Import and inspect the sample Streamline capture included with Arm Performance Studio so you can recognize key timeline views before profiling your app. + weight: 4 # 1 is first, 2 is second, etc. # Do not modify these elements From 0062caed005cdf27cca719275c9e72f5639a20f0 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 10:00:48 -0500 Subject: [PATCH 117/137] nit --- .../openadkit2_safetyisolation/_index.md | 57 ++++++++++++++++++- .../mobile-graphics-and-gaming/ams/malioc.md | 2 - .../rafay-eks/nginx.md | 29 +++++----- 3 files changed, 69 insertions(+), 19 deletions(-) diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 0bbae6a5c4..20f4c62c06 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -16,11 +16,66 @@ prerequisites: - Completion of the [Deploy Open AD Kit containerized autonomous driving simulation on Arm Neoverse](/learning-paths/automotive/openadkit1_container/) Learning Path - Basic familiarity with Docker +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-24T15:35:59Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf + summary_generated_at: '2026-06-24T15:35:59Z' + summary_source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf + faq_generated_at: '2026-06-24T15:35:59Z' + faq_source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf + summary: >- + In this Learning Path, you'll prototype safety‑critical isolation for autonomous + driving workloads on Arm Neoverse by applying functional safety concepts, ISO 26262 and ASIL + guidance, and a safety-island architecture. You'll separate safety-critical control + logic from non-safety functions, then connect components using a publish‑subscribe model (DDS/ROS + 2) within containerized deployments or across Arm‑based instances. You'll learn about lifecycle + practices aligned with the V‑model, including clear requirements, version control, impact + analysis, and regression testing. By the end, you'll organize simulation components into + isolated units with defined interfaces and documentation suitable for advancing ISO 26262-oriented + development on Arm Neoverse. + faqs: + - question: How do I decide which components belong on the safety island versus the general + ECU? + answer: >- + Place time‑critical, safety‑relevant control logic (for example, braking or steering) on + the safety island, and keep non‑critical features (such as infotainment) on the general + ECU. The goal is strong isolation, determinism, and minimized coupling for safety‑critical + paths. + - question: What should I verify to confirm the isolation boundaries are defined correctly? + answer: >- + Check that safety‑critical components run independently from non‑critical services and communicate + only through defined publish‑subscribe interfaces. Ensure data exchanged is minimal and + purpose‑specific so that safety logic is not impacted by unrelated functions. + - question: How do ISO 26262 ASIL levels influence my development workflow in this prototype? + answer: >- + Higher ASIL targets require more rigorous processes and evidence across the V‑model. For + example, ASIL‑D changes go through full impact analysis and regression testing to prevent + introducing new risks. + - question: Should I separate components using containers on one host or across multiple Arm + Neoverse instances? + answer: >- + Both approaches support prototyping: containers model software isolation on one system, + while multiple instances model stronger physical separation. Choose the option that best + matches the isolation assumptions you want to evaluate. + - question: What artifacts should I capture to support ISO 26262 traceability in this prototype? + answer: >- + Maintain clear safety requirements, rationale for the safety‑island split, defined DDS/ROS + 2 interfaces, and mapped tests to requirements. Record versioned changes, impact analyses, + and verification results aligned to the V‑model stages. +# END generated_summary_faq + author: - Odin Shen - Julien Jayat -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 61648c3d17..d098056e7a 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -26,8 +26,6 @@ The `--help` option returns usage instructions and the full list of available op On macOS, Mali Offline Compiler might not be recognized as an application from an identified developer. To enable Mali Offline Compiler, open **System Preferences > Security & Privacy**, and select **Allow Anyway** for the `malioc` item. {{% /notice %}} -## Supported GPUs - To see the full list of [supported GPUs](https://developer.arm.com/documentation/101863/latest/Platform-support/GPU-support) use: ```console diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md index 6f1c2cbba1..99576ed52c 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/nginx.md @@ -1,16 +1,15 @@ --- -title: "Deploy NGINX and clean up" +title: Deploy NGINX to the Amazon EKS cluster and clean up +description: Deploy NGINX to an Amazon EKS cluster on AWS Graviton-based nodes, test in-cluster connectivity, and clean up the Kubernetes and cloud resources. weight: 4 ### FIXED, DO NOT MODIFY layout: learningpathall --- -With the cluster running, you can now validate it by deploying a workload. In this section, you deploy NGINX using a manifest that pins pods to `arm64` nodes, verify the pod reaches a `Running` state, and test connectivity from inside the cluster. You then clean up all provisioned resources. +## Deploy NGINX -## Deploy NGINX - -With the EKS cluster running on Graviton nodes, deploy NGINX to confirm that arm64 workloads schedule and run correctly. +With the Amazon EKS cluster running on Graviton-based nodes, deploy NGINX to confirm that `arm64` workloads schedule and run correctly. Create a file named `nginx-graviton.yaml` with the following content: @@ -104,7 +103,9 @@ nginx-arm-svc ClusterIP 10.100.42.137 80/TCP 30s ## Test NGINX connectivity -The NGINX service is type `ClusterIP`, which means it has no external IP and is only reachable from within the cluster network. The cluster also has `publicAccess: false`, so there is no public Kubernetes API endpoint. Both constraints mean you cannot test connectivity from your laptop directly. Instead, run a one-off pod inside the cluster that sends a request to the service and then deletes itself: +The NGINX service is type `ClusterIP`, which means it has no external IP and is reachable only from within the cluster network. The cluster also has `publicAccess: false`, so there's no public Kubernetes API endpoint. Both constraints mean you can't test connectivity from your local machine directly. + +Instead, run a one-off pod inside the cluster that sends a request to the service and then deletes itself: ```console kubectl run curl-test --rm -it --image=curlimages/curl --restart=Never -- curl http://nginx-arm-svc.nginx.svc @@ -127,9 +128,9 @@ working. Further configuration is required.

pod "curl-test" deleted ``` -The NGINX welcome page confirms that the workload is running and reachable on your Graviton-backed EKS cluster. +The NGINX welcome page confirms that the workload is running and reachable on your Graviton-based EKS cluster. -## Clean up +## Clean up resources Remove the NGINX workload and then delete the cluster to avoid ongoing AWS charges. @@ -148,7 +149,7 @@ service "nginx-arm-svc" deleted ``` {{< notice warning >}} -Deleting the cluster through RCTL triggers the removal of the EKS control plane, managed node group, and associated CloudFormation stacks in your AWS account. If you do not run this command, AWS will continue to charge you for the running EC2 instances and EKS control plane. +Deleting the cluster through RCTL triggers the removal of the EKS control plane, managed node group, and associated CloudFormation stacks in your AWS account. If you don't run this command, AWS will continue to charge you for the running EC2 instances and EKS control plane. {{< /notice >}} Delete the EKS cluster through Rafay: @@ -157,13 +158,9 @@ Delete the EKS cluster through Rafay: rctl delete cluster demo-eks-graviton ``` -## Summary +## What you've accomplished -In this Learning Path you: +You've now deployed NGINX using a manifest that pins pods to `arm64` nodes, verified the pod reaches a `Running` state, and tested connectivity from inside the cluster. You then cleaned up all provisioned resources. -- Connected your AWS account to the Rafay platform using a cross-account IAM role and cloud credential. -- Provisioned a private Amazon EKS cluster with a Graviton (`m7g.large`) node group using a declarative Rafay manifest and `rctl`. -- Deployed NGINX with a `nodeSelector` that pins workloads to `arm64` nodes, confirming that Arm-native containers schedule and run correctly. -- Tested in-cluster connectivity using a one-off curl pod, and cleaned up all AWS and Rafay resources. +Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, so you can use Rafay to run private, Graviton-based EKS clusters at scale. -Rafay's control plane handles cluster access without requiring a public Kubernetes API endpoint, making it straightforward to run private, Graviton-backed EKS clusters at scale. From 883f3a7bad2e80695be397409e8080efea9fd688 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 10:26:02 -0500 Subject: [PATCH 118/137] nits --- .../learning-paths/mobile-graphics-and-gaming/ams/ams.md | 9 --------- .../mobile-graphics-and-gaming/ams/malioc.md | 4 ++-- .../mobile-graphics-and-gaming/ams/setup_tasks.md | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md index 74cbdac4cd..1098339f8a 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md @@ -46,15 +46,6 @@ On Linux, edit your `PATH` environment variable to add the paths to the Performa PATH=$PATH://mali_offline_compiler ``` -## Launch the tools - -To open the tools, launch the Performance Studio Hub: - -- On Windows, search for Performance Studio. -- On macOS and Linux, open the Performance Studio application file from the install directory. - -![Screenshot of the Arm Performance Studio Hub showing launch cards for Frame Advisor, RenderDoc for Arm GPUs, Streamline, Mali Offline Compiler, and Streamline CLI#center](images/ps_hub.png) - ## What you've accomplished and what's next You've set up Arm Performance Studio and updated your `PATH` so you can use the profiling tools from a terminal. diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index d098056e7a..a8aa7e34ff 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -26,13 +26,13 @@ The `--help` option returns usage instructions and the full list of available op On macOS, Mali Offline Compiler might not be recognized as an application from an identified developer. To enable Mali Offline Compiler, open **System Preferences > Security & Privacy**, and select **Allow Anyway** for the `malioc` item. {{% /notice %}} -To see the full list of [supported GPUs](https://developer.arm.com/documentation/101863/latest/Platform-support/GPU-support) use: +To see the full list of [supported GPUs](https://developer.arm.com/documentation/101863/latest/Platform-support/GPU-support), use: ```console malioc --list ``` -To get information on [API support](https://developer.arm.com/documentation/101863/latest/Platform-support/API-support) for a given GPU, use: +For more information about [API support](https://developer.arm.com/documentation/101863/latest/Platform-support/API-support) for a given GPU, use: ```console malioc --info --core diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md index 265eb9d2b5..785b83e513 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md @@ -13,7 +13,7 @@ layout: "learningpathall" Complete the following prerequisites: -1. Install [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb). `adb` is available with the Android SDK platform tools, which are installed as part of Android Studio. Alternatively, you can download them separately as part of the Android SDK platform tools. +1. Install [Android Debug Bridge (adb)](https://developer.android.com/studio/command-line/adb). `adb` is available with the Android SDK platform tools, which are installed as part of Android Studio. 2. Performance Advisor uses a Python script to connect to your device. To run this script, you'll need [Python](https://www.python.org/downloads/) 3.8 or later installed. ## Build your application From 275da44256f326a41bbb52112626d9d66fcdb07c Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 10:31:10 -0500 Subject: [PATCH 119/137] removing redundant lead-in --- .../learning-paths/automotive/openadkit1_container/_index.md | 2 +- .../automotive/openadkit2_safetyisolation/_index.md | 2 +- content/learning-paths/automotive/system76-auto/_index.md | 2 +- content/learning-paths/automotive/zenacssdebug/_index.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/learning-paths/automotive/openadkit1_container/_index.md b/content/learning-paths/automotive/openadkit1_container/_index.md index 8e2edac98d..b6204bdf32 100644 --- a/content/learning-paths/automotive/openadkit1_container/_index.md +++ b/content/learning-paths/automotive/openadkit1_container/_index.md @@ -30,7 +30,7 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:35:34Z' faq_source_hash: 37913b2c4aed914d32dbdad054ebdd2b1d4587da3ede1a33ba81e3e68bf504a3 summary: >- - In this Learning Path, you'll deploy a containerized Autoware + You'll deploy a containerized Autoware Open AD Kit simulation on Arm Neoverse using Docker and Docker Compose, within a SOAFEE-aligned Shift-Left workflow. You'll first learn about software-defined vehicles (SDVs), SOAFEE, ROS 2, and the Open AD Kit components used in the demo. You'll then prepare an Arm Neoverse Linux system and use Docker Compose to start the Open AD Kit visualizer, planning, and simulation services. By the end, you'll review a running simulation. The workflow has been tested on both cloud (Amazon EC2) and on-premise Arm Neoverse platforms. faqs: - question: What result should I expect after launching the Docker Compose stack? diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index f9ad28bb7b..8b62eddcee 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -31,7 +31,7 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:35:59Z' faq_source_hash: 92a6dac2b1674a44cd623a0c8c3189b38438124a6067ed7ca776999ff1d8b5bf summary: >- - In this Learning Path, you'll learn about prototyping safety‑critical isolation for autonomous + You'll learn about prototyping safety‑critical isolation for autonomous driving workloads on Arm Neoverse by applying functional safety concepts, ISO 26262 and ASIL guidance, and a safety‑island architecture. You'll understand how to separate safety‑critical control logic from non‑safety functions, then connect components using a publish‑subscribe model (DDS/ROS diff --git a/content/learning-paths/automotive/system76-auto/_index.md b/content/learning-paths/automotive/system76-auto/_index.md index 3c0e1138fc..2349e37c06 100644 --- a/content/learning-paths/automotive/system76-auto/_index.md +++ b/content/learning-paths/automotive/system76-auto/_index.md @@ -29,7 +29,7 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:36:29Z' faq_source_hash: 2b758d2dcf28a683ab164e28578a736d6d730b81dfbc01a6765619052fcdebd0 summary: >- - In this Learning Path, you'll use a System76 Thelio Astra Arm desktop to build and run the + You'll use a System76 Thelio Astra Arm desktop to build and run the Arm Automotive Solutions Software Reference Stack in a local Multipass virtual machine. You'll create an Ubuntu 20.04 guest, isolate builds, and compile Yocto-based components targeting a Fixed Virtual Platform that models the Arm Reference Design-1 AE. You'll review the Thelio Astra platform and the software stack context, then run a Parsec-enabled TLS demo that establishes an HTTPS session to transfer a web page. diff --git a/content/learning-paths/automotive/zenacssdebug/_index.md b/content/learning-paths/automotive/zenacssdebug/_index.md index 9339cf9b13..4ecda36d35 100644 --- a/content/learning-paths/automotive/zenacssdebug/_index.md +++ b/content/learning-paths/automotive/zenacssdebug/_index.md @@ -33,7 +33,7 @@ generated_summary_faq: faq_generated_at: '2026-06-24T15:37:11Z' faq_source_hash: 74740788edbfe7ea09bf955455b4aeaed00e667fa8c9d68467353c1f64528b08 summary: >- - In this Learning Path, you'll debug the Arm Zena Compute Subsystem (CSS) reference + You'll debug the Arm Zena Compute Subsystem (CSS) reference software stack on a Fixed Virtual Platform using Arm Development Studio. You'll launch the FVP with the Iris debug server enabled, then create and save a custom Arm DS configuration. You'll establish connections to each heterogeneous component within Zena CSS to debug the Linux kernel and user processes. By the end, you'll create reusable `.launch` From f45a5ab3d0fda9f15ee8465a6afef165159a266c Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 10:32:36 -0500 Subject: [PATCH 120/137] removing redundant lead-in from Rafay --- .../servers-and-cloud-computing/rafay-eks/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md index 19fa6f5f24..98c99dd585 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md @@ -34,7 +34,7 @@ generated_summary_faq: faq_generated_at: '2026-06-24T20:45:31Z' faq_source_hash: 76cbd5e4b3a61e9604e0df9b3ba2a5e5af4aa9a0c295ece3c4ee5a98ec365630 summary: >- - In this Learning Path, you'll provision an Amazon EKS cluster on Arm using + You'll provision an Amazon EKS cluster on Arm using the Rafay Kubernetes Operations Platform and validate workloads on AWS Graviton-based nodes. You'll define a declarative cluster manifest in Rafay referencing an existing project, blueprint, and cloud credential. Then, you'll create the EKS cluster and deploy NGINX pinned to arm64 From 2ff8930419e421b58ea0a866dddb95a075485d63 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 10:34:21 -0500 Subject: [PATCH 121/137] adding rule about lead-ins --- .github/skills/writing-style-review/SKILL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/skills/writing-style-review/SKILL.md b/.github/skills/writing-style-review/SKILL.md index cf631a0227..9666f1e3fe 100644 --- a/.github/skills/writing-style-review/SKILL.md +++ b/.github/skills/writing-style-review/SKILL.md @@ -40,6 +40,7 @@ Use this skill for granular prose, voice, readability, terminology, and style re - Use plain English and avoid jargon overload. - Define acronyms on first use. - Use parallel structure in lists. +- Avoid starting sentences with "In this Learning Path"/ "In this section"/"On this page" / "In this step". - Flag sections over 700 words and suggest natural split points. - Identify paragraphs with sentences averaging over 20 words. - Note sections that introduce more than two new concepts. From 0168fc2e55f6455362f84f5b4ed701e1c3dd244c Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 10:38:43 -0500 Subject: [PATCH 122/137] avoiding several sentences starting with you'll consecutively --- .../learning-paths/automotive/openadkit1_container/_index.md | 2 +- .../automotive/openadkit2_safetyisolation/_index.md | 4 ++-- content/learning-paths/automotive/system76-auto/_index.md | 4 ++-- content/learning-paths/automotive/zenacssdebug/_index.md | 2 +- .../servers-and-cloud-computing/rafay-eks/_index.md | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/content/learning-paths/automotive/openadkit1_container/_index.md b/content/learning-paths/automotive/openadkit1_container/_index.md index b6204bdf32..da3d000697 100644 --- a/content/learning-paths/automotive/openadkit1_container/_index.md +++ b/content/learning-paths/automotive/openadkit1_container/_index.md @@ -31,7 +31,7 @@ generated_summary_faq: faq_source_hash: 37913b2c4aed914d32dbdad054ebdd2b1d4587da3ede1a33ba81e3e68bf504a3 summary: >- You'll deploy a containerized Autoware - Open AD Kit simulation on Arm Neoverse using Docker and Docker Compose, within a SOAFEE-aligned Shift-Left workflow. You'll first learn about software-defined vehicles (SDVs), SOAFEE, ROS 2, and the Open AD Kit components used in the demo. You'll then prepare an Arm Neoverse Linux system and use Docker Compose to start the Open AD Kit visualizer, planning, and simulation services. By the end, you'll review a running simulation. The workflow has been tested on both cloud (Amazon EC2) and on-premise Arm Neoverse platforms. + Open AD Kit simulation on Arm Neoverse using Docker and Docker Compose, within a SOAFEE-aligned Shift-Left workflow. First, you'll learn about software-defined vehicles (SDVs), SOAFEE, ROS 2, and the Open AD Kit components used in the demo. Then, you'll prepare an Arm Neoverse Linux system and use Docker Compose to start the Open AD Kit visualizer, planning, and simulation services. By the end, you'll review a running simulation. The workflow has been tested on both cloud (Amazon EC2) and on-premise Arm Neoverse platforms. faqs: - question: What result should I expect after launching the Docker Compose stack? answer: >- diff --git a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md index 8b62eddcee..3bfb072554 100644 --- a/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md +++ b/content/learning-paths/automotive/openadkit2_safetyisolation/_index.md @@ -33,8 +33,8 @@ generated_summary_faq: summary: >- You'll learn about prototyping safety‑critical isolation for autonomous driving workloads on Arm Neoverse by applying functional safety concepts, ISO 26262 and ASIL - guidance, and a safety‑island architecture. You'll understand how to separate safety‑critical control - logic from non‑safety functions, then connect components using a publish‑subscribe model (DDS/ROS + guidance, and a safety‑island architecture. First, you'll understand how to separate safety‑critical control + logic from non‑safety functions. Then, you'll connect components using a publish‑subscribe model (DDS/ROS 2) within containerized deployments or across Arm‑based instances. You'll explore lifecycle practices aligned with the V‑model, including clear requirements, version control, impact analysis, and regression testing. By the end, you'll organize simulation components into diff --git a/content/learning-paths/automotive/system76-auto/_index.md b/content/learning-paths/automotive/system76-auto/_index.md index 2349e37c06..e6cffd4b3d 100644 --- a/content/learning-paths/automotive/system76-auto/_index.md +++ b/content/learning-paths/automotive/system76-auto/_index.md @@ -30,8 +30,8 @@ generated_summary_faq: faq_source_hash: 2b758d2dcf28a683ab164e28578a736d6d730b81dfbc01a6765619052fcdebd0 summary: >- You'll use a System76 Thelio Astra Arm desktop to build and run the - Arm Automotive Solutions Software Reference Stack in a local Multipass virtual machine. You'll - create an Ubuntu 20.04 guest, isolate builds, and compile Yocto-based + Arm Automotive Solutions Software Reference Stack in a local Multipass virtual machine. You'll start by + creating an Ubuntu 20.04 guest, isolating builds, and compiling Yocto-based components targeting a Fixed Virtual Platform that models the Arm Reference Design-1 AE. You'll review the Thelio Astra platform and the software stack context, then run a Parsec-enabled TLS demo that establishes an HTTPS session to transfer a web page. faqs: - question: Which Multipass install guide should I follow before creating the virtual machine? diff --git a/content/learning-paths/automotive/zenacssdebug/_index.md b/content/learning-paths/automotive/zenacssdebug/_index.md index 4ecda36d35..745a3f8ca0 100644 --- a/content/learning-paths/automotive/zenacssdebug/_index.md +++ b/content/learning-paths/automotive/zenacssdebug/_index.md @@ -34,7 +34,7 @@ generated_summary_faq: faq_source_hash: 74740788edbfe7ea09bf955455b4aeaed00e667fa8c9d68467353c1f64528b08 summary: >- You'll debug the Arm Zena Compute Subsystem (CSS) reference - software stack on a Fixed Virtual Platform using Arm Development Studio. You'll launch the + software stack on a Fixed Virtual Platform using Arm Development Studio. First, you'll launch the FVP with the Iris debug server enabled, then create and save a custom Arm DS configuration. You'll establish connections to each heterogeneous component within Zena CSS to debug the Linux kernel and user processes. By the end, you'll create reusable `.launch` files, step through early RSE boot, and attach to Safety Island and Linux targets to inspect diff --git a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md index 98c99dd585..fd55d9730b 100644 --- a/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/rafay-eks/_index.md @@ -36,7 +36,7 @@ generated_summary_faq: summary: >- You'll provision an Amazon EKS cluster on Arm using the Rafay Kubernetes Operations Platform and validate workloads on AWS Graviton-based nodes. - You'll define a declarative cluster manifest in Rafay referencing an existing project, + First, you'll define a declarative cluster manifest in Rafay referencing an existing project, blueprint, and cloud credential. Then, you'll create the EKS cluster and deploy NGINX pinned to arm64 to confirm scheduling on Graviton-based instances. Finally, you'll remove the NGINX workload and deprovision the EKS resources to avoid ongoing cloud costs. faqs: From a85438740506ef36b7dfe5bf0c2ed6a24ddcda50 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 10:59:57 -0500 Subject: [PATCH 123/137] contractions and style updates --- .../mobile-graphics-and-gaming/ams/ams.md | 2 +- .../mobile-graphics-and-gaming/ams/fa.md | 2 +- .../mobile-graphics-and-gaming/ams/malioc.md | 4 ++-- .../mobile-graphics-and-gaming/ams/pa.md | 6 +++--- .../mobile-graphics-and-gaming/ams/renderdoc.md | 6 +++--- .../mobile-graphics-and-gaming/ams/setup_tasks.md | 4 ++-- .../mobile-graphics-and-gaming/ams/streamline.md | 10 +++++----- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md index 1098339f8a..b437777634 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/ams.md @@ -30,7 +30,7 @@ For installation instructions, see the [Arm Performance Studio install guide](/i ## Update your PATH environment variable (Linux and macOS) -Edit your `PATH` environment variable to add the paths to the Streamline and Mali Offline Compiler executables. By adding the paths, you can run Streamline's `Streamline-cli -pa` command and Mali Offline Compiler's `malioc` command from any directory. This step is not necessary on Windows, as this is done automatically when Arm Performance Studio is installed. +Edit your `PATH` environment variable to add the paths to the Streamline and Mali Offline Compiler executables. By adding the paths, you can run Streamline's `Streamline-cli -pa` command and Mali Offline Compiler's `malioc` command from any directory. This step isn't necessary on Windows, as this is done automatically when Arm Performance Studio is installed. On macOS, edit your `/etc/paths` file to add the following paths: diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md index 94e9d099a4..640a34a2df 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md @@ -76,7 +76,7 @@ Explore each frame to evaluate how efficiently they were rendered on the device. ![Content Metrics view in Frame Advisor sorted by primitive count with the Prims column highlighted to identify expensive draw calls#center](images/fa_content_metrics.png) -4. For an expensive object, check the **Detailed Metrics** view to see how efficiently the object's mesh is being rendered to the screen. Look for objects with duplicated vertices, or those that do not efficiently reuse indices. +4. For an expensive object, check the **Detailed Metrics** view to see how efficiently the object's mesh is being rendered to the screen. Look for objects with duplicated vertices, or those that don't efficiently reuse indices. ![Detailed Metrics view in Frame Advisor showing mesh complexity, locality, redundancy, and memory layout for the selected draw call#center](images/fa_detailed_metrics_view.png) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index a8aa7e34ff..2f827cf70a 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -42,7 +42,7 @@ malioc --info --core You can compile OpenGL ES (`--opengles`) and Vulkan (`--vulkan`) shader programs. On Linux hosts, you can also compile OpenGL (`--opengl `) C kernels. -A performance report will be generated. +Mali Offline Compiler generates a performance report. If your frame analysis points to shader cost, compile one of your shaders. You can also use this sample shader to learn how to read the report. @@ -89,7 +89,7 @@ For more information, see [Compiling OpenGL ES shaders](https://developer.arm.co ## Interpret the report -The report will provide an approximate cycle cost breakdown for the major functional units in the design. Use this information to optimize your shader. +The report provides an approximate cycle cost breakdown for the major functional units in the design. Use this information to optimize your shader. For example, compiling the unoptimized implementation for `Mali-G76` reports the following cycle information: ```output diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md index 227a3e7de3..b231a8c712 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md @@ -12,7 +12,7 @@ layout: "learningpathall" ## Connect to Android device and collect frame data -Now that you have seen a [Performance Advisor example report](/learning-paths/mobile-graphics-and-gaming/ams/pa_example/), you can use it to capture data from your own application. +Now that you've seen a [Performance Advisor example report](/learning-paths/mobile-graphics-and-gaming/ams/pa_example/), you can use it to capture data from your own application. Performance Advisor runs on a Streamline capture file, so the first step is to take a capture with Streamline. Streamline must capture extra frame data from the device, which Performance Advisor needs to generate a report. To capture the extra frame data, you must first run the provided Python script, `streamline_me.py`. @@ -79,7 +79,7 @@ For full instructions, see the [Get started with Performance Advisor Tutorial](h 3. The application starts automatically on the device. Interact with the application as required. -4. When you have collected enough data, select **Stop capture**. +4. When you've collected enough data, select **Stop capture**. 5. Return to your terminal, and press `ENTER` to terminate the `streamline_me.py` script. @@ -118,7 +118,7 @@ This feature is particularly useful when used within a [CI workflow](https://dev ## Specify performance budgets -You can specify a performance budget which will be reflected in the Performance Advisor report. For more information, see [Setting performance budgets](https://developer.arm.com/documentation/102009/latest/Quick-start-guide/Setting-performance-budgets) in the Arm documentation. +You can specify a performance budget that is reflected in the Performance Advisor report. For more information, see [Setting performance budgets](https://developer.arm.com/documentation/102009/latest/Quick-start-guide/Setting-performance-budgets) in the Arm documentation. ## What you've accomplished and what's next diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md index 0fbd498f00..8848d3cfae 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md @@ -24,7 +24,7 @@ To run RenderDoc for Arm GPUs: The RenderDoc APK starts running on your target. - If you don't see your device, check that your device is setup correctly as described in [Setup tasks](/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks/). + If you don't see your device, check that your device is set up correctly as described in [Setup tasks](/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks/). 2. Navigate to the **Launch Application** tab, and set the **Executable Path** to the application that you want to debug. Select the **Browse** button to view all of the installed application packages on the target and find the `.exe` file. @@ -40,9 +40,9 @@ To run RenderDoc for Arm GPUs: Use these controls to take captures of your application as it runs on the target device. Captured frames are stored temporarily on the device. -4. When you have finished capturing the frames of interest, stop the application that you are debugging. Keep RenderDoc running so that you can analyze and debug your captures. +4. When you've finished capturing the frames of interest, stop the application that you are debugging. Keep RenderDoc running so that you can analyze and debug your captures. -5. Select a capture from the **Captures collected** window and select **Open**. When the frame has loaded, it is displayed on the target and in the **Texture Viewer** tab, and the **Event Browser** is populated. +5. Select a capture from the **Captures collected** window and select **Open**. When the frame has loaded, it's displayed on the target and in the **Texture Viewer** tab, and the **Event Browser** is populated. ![Screenshot of a captured frame opened in RenderDoc showing the Event Browser, Texture Viewer, API Inspector, and output preview for the selected event#center](images/rd_full_ui.png) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md index 785b83e513..09b579b4cb 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/setup_tasks.md @@ -1,6 +1,6 @@ --- # User change -title: Set up an Android application +title: Set up an Android application for profiling description: Prepare a debuggable Android application and device connection so Arm Performance Studio can capture profiling data. @@ -22,7 +22,7 @@ Compile the application with debug enabled, as well as additional options to fac - To set [Unity](https://unity.com/) applications to be debuggable, enable **[Development Build](https://docs.unity3d.com/6000.0/Documentation/Manual/android-BuildProcess.html)** in **Build settings**. - In Android Studio, use a build variant that includes `debuggable true` (`isDebuggable = true` in Kotlin scripts) in the build configuration. -- In Unreal Engine, open **Project Settings > Project > Packaging > Project**, and ensure that the **For Distribution** checkbox is not set. +- In Unreal Engine, open **Project Settings > Project > Packaging > Project**, and ensure that the **For Distribution** checkbox isn't set. - For instructions to compile your C++ or Java applications with the right options, see the [Target setup guide for Android](https://developer.arm.com/documentation/101813/latest/Target-Setup/Compile-your-application). {{% notice Tip %}} diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md index 2225ff88af..888128304d 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md @@ -12,7 +12,7 @@ layout: "learningpathall" ## Select the device and application in Streamline -Now that you have seen an [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/), you can use it to capture data from your own application. +Now that you've seen an [Arm Streamline example capture](/learning-paths/mobile-graphics-and-gaming/ams/streamline_example/), you can use it to capture data from your own application. 1. Launch the Performance Studio Hub and open Streamline. @@ -29,19 +29,19 @@ Now that you have seen an [Arm Streamline example capture](/learning-paths/mobil ![Screenshot of the Streamline Start view with Android adb selected, a connected Samsung device selected, a debuggable application selected, and Capture Arm GPU profile enabled#center](images/start.png "Connect to the device") {{% notice Tip %}} -Optionally, you can set a preferred location to store your captures using **Window** > **Preferences** > **Data Locations**. New reports will be created in the topmost folder specified. +Optionally, you can set a preferred location to store your captures using **Window** > **Preferences** > **Data Locations**. New reports are created in the topmost folder specified. {{% /notice %}} ## Capture data 1. Select **Start capture** to start capturing profile data from the device. Enter a name and location for the capture file. -2. The application starts automatically on the device. Interact with the application as desired for the profiling run you wish to do. +2. The application starts automatically on the device. Interact with the application as desired for the profiling run you want to do. -3. When you have collected enough data, select **Stop capture**. +3. When you've collected enough data, select **Stop capture**. ![Screenshot of Streamline during a capture with the Stop capture button highlighted and performance charts updating in the Timeline view#center](images/stop_capture.webp "Stop Capture") -Streamline will stop capturing data, remove the daemon, and process the captured data. +Streamline stops capturing data, removes the daemon, and processes the captured data. ## Analyze the results From 958e384dd05e433f12aa1f229fc2f053a657da76 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 11:35:02 -0500 Subject: [PATCH 124/137] edits --- content/learning-paths/mobile-graphics-and-gaming/ams/fa.md | 6 +++--- .../learning-paths/mobile-graphics-and-gaming/ams/malioc.md | 4 ++-- content/learning-paths/mobile-graphics-and-gaming/ams/pa.md | 6 +++--- .../mobile-graphics-and-gaming/ams/renderdoc.md | 4 ++-- .../mobile-graphics-and-gaming/ams/streamline.md | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md index 640a34a2df..ce1c6ca5d6 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/fa.md @@ -50,9 +50,9 @@ After connecting to your device, you can capture a frame burst. 2. You can capture one frame burst of up to three consecutive frames. Adjust the **Frame count** as required. -3. Select the **Capture** button to start capturing the frame burst. Wait for the capture to complete. This may take several seconds. +3. Select the **Capture** button to start capturing the frame burst. Wait for the capture to complete. This might take several seconds. -4. Select **Analyze** to see the results. It may take a few minutes to analyze the data. +4. Select **Analyze** to see the results. It might take a few minutes to analyze the data. ## Analyze the capture @@ -72,7 +72,7 @@ Explore each frame to evaluate how efficiently they were rendered on the device. ![Framebuffers view in Frame Advisor showing the selected draw call output so you can step through how the frame is built#center](images/fa_frame_buffer_view.png) -3. In the **Content Metrics** view, sort draw calls by the number of primitives to find the most expensive objects. See whether these objects could be simplified. +3. In the **Content Metrics** view, sort draw calls by the number of primitives to find the most expensive objects. See whether these objects can be simplified. ![Content Metrics view in Frame Advisor sorted by primitive count with the Prims column highlighted to identify expensive draw calls#center](images/fa_content_metrics.png) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md index 2f827cf70a..1aa8648390 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/malioc.md @@ -46,7 +46,7 @@ Mali Offline Compiler generates a performance report. If your frame analysis points to shader cost, compile one of your shaders. You can also use this sample shader to learn how to read the report. -An example (`OpenGL ES`) shader is provided in [Compile your shader](https://developer.arm.com/documentation/102468/latest/Compile-your-shader) in the Arm documentation: +The following example (`OpenGL ES`) shader is provided in [Compile your shader](https://developer.arm.com/documentation/102468/latest/Compile-your-shader) in Arm documentation: ```C #version 310 es #define WINDOW_SIZE 5 @@ -100,7 +100,7 @@ Longest path cycles: 4.53 0.00 0.25 2.50 A A = Arithmetic, LS = Load/Store, V = Varying, T = Texture ``` -An example optimization is described in [Optimize your shader](https://developer.arm.com/documentation/102468/latest/Optimize-your-shader) in the Arm documentation: +An example optimization is described in [Optimize your shader](https://developer.arm.com/documentation/102468/latest/Optimize-your-shader) in Arm documentation: ```C #version 310 es diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md index b231a8c712..d90c7ba538 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/pa.md @@ -93,7 +93,7 @@ For full instructions, see the [Get started with Performance Advisor Tutorial](h streamline-cli -pa my_capture.apc ``` - For a list of available options, see [The Streamline-cli -pa command](https://developer.arm.com/documentation/102009/9-7/Command-line-options/The-Streamline-cli--pa-command) in the Arm documentation, or run the following command: + For a list of available options, see [The Streamline-cli -pa command](https://developer.arm.com/documentation/102009/9-7/Command-line-options/The-Streamline-cli--pa-command) in Arm documentation, or run the following command: ```console streamline-cli -pa -h @@ -118,10 +118,10 @@ This feature is particularly useful when used within a [CI workflow](https://dev ## Specify performance budgets -You can specify a performance budget that is reflected in the Performance Advisor report. For more information, see [Setting performance budgets](https://developer.arm.com/documentation/102009/latest/Quick-start-guide/Setting-performance-budgets) in the Arm documentation. +You can specify a performance budget that is reflected in the Performance Advisor report. For more information, see [Setting performance budgets](https://developer.arm.com/documentation/102009/latest/Quick-start-guide/Setting-performance-budgets) in Arm documentation. ## What you've accomplished and what's next You've now generated JSON and HTML Performance Advisor reports for your application. -Next, you'll perform frame-based analysis on your application using Frame Advisor. +Next, you'll perform frame-based analysis on your application using Frame Advisor. \ No newline at end of file diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md index 8848d3cfae..fd429c3f20 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/renderdoc.md @@ -12,7 +12,7 @@ layout: "learningpathall" ## Run RenderDoc for Arm GPUs -[RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) is an Arm fork of the [RenderDoc](https://renderdoc.org/) open-source debugger. +[RenderDoc for Arm GPUs](https://developer.arm.com/Tools%20and%20Software/RenderDoc%20for%20Arm%20GPUs) is an Arm fork of the [RenderDoc](https://renderdoc.org/) open-source debugger. The Arm release includes support for API features and extensions that are available on the latest Arm GPUs, but not yet supported in upstream RenderDoc. Arm intends to contribute changes to the upstream project, but some Arm-specific or Android-specific features might be available only in the Arm fork. @@ -52,7 +52,7 @@ To run RenderDoc for Arm GPUs: Selected events are highlighted with a green flag. The other windows in the UI update to display information for the selected event, including the render state, data resources, and GPU output. -See the [RenderDoc documentation](https://renderdoc.org/docs/index.html#) to explore the full list of features. +For a full list of features, see the [RenderDoc documentation](https://renderdoc.org/docs/index.html#). ## What you've accomplished and what's next diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md index 888128304d..8e39003cc7 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/streamline.md @@ -49,7 +49,7 @@ The charts in the **Timeline** view show the performance counter activity captur For instructions to use the features in the **Timeline** view, see the [Streamline User Guide](https://developer.arm.com/documentation/101816/latest/Analyze-your-capture). -Understanding the output of Streamline is key to the usefulness of the tool. To understand how to interpret the capture from different points of view, see [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/). +To understand how to interpret the capture from different points of view, see [Android performance triage with Streamline](https://developer.arm.com/documentation/102540/latest/). ## What you've accomplished and what's next From ce5d976a73e4b20af2c9286e58d24a836c522673 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 11:42:39 -0500 Subject: [PATCH 125/137] adding summary and faqs --- .../mobile-graphics-and-gaming/ams/_index.md | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md index a2460d8101..f5431262cd 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md @@ -21,9 +21,57 @@ prerequisites: - Arm Performance Studio installed. Follow the [Arm Performance Studio install guide](/install-guides/ams/) for instructions. - Android SDK Platform tools installed for the Android Debug bridge (adb). +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-26T16:37:19Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 80078c6f05717cbf24c3b695a82fa15bbe477bd14a290195569dda4efe6599ee + summary_generated_at: '2026-06-26T16:37:19Z' + summary_source_hash: 80078c6f05717cbf24c3b695a82fa15bbe477bd14a290195569dda4efe6599ee + faq_generated_at: '2026-06-26T16:37:19Z' + faq_source_hash: 80078c6f05717cbf24c3b695a82fa15bbe477bd14a290195569dda4efe6599ee + summary: >- + You'll profile an Android graphics application on Arm + Mali-based GPUs using Arm Performance Studio. After preparing a debuggable build, you'll + connect an Android device over adb, explore a provided Streamline sample to understand the + available views, then capture a profile from their own application and generate a Performance + Advisor report with the CLI. You'll also perform frame-level inspection with Frame Advisor + and RenderDoc for Arm GPUs, and use Mali Offline Compiler to estimate shader + cost. By the end, you'll understand how to progress from example data to capturing on-device + profiles and interpreting reports that inform deeper frame and shader analysis. + faqs: + - question: How do I launch Streamline and select my Android device? + answer: >- + Open the Performance Studio Hub and launch Streamline. In the Start view, choose Android + (adb) as the device type and select your device from the list. + - question: What should I check in my app build before profiling with Streamline? + answer: >- + Build a debuggable version and include options that facilitate call stack unwinding by Streamline. + For Unity, enable Development Build in Build settings. + - question: What steps import the example Streamline capture? + answer: >- + In Streamline, select File > Import, choose Import Streamline Sample Captures, then select + the Android example and finish. The sample capture is added so you can open it and explore + the views. + - question: How do I generate a Performance Advisor report from a capture? + answer: >- + Open a terminal, navigate to the capture location, and run streamline-cli with the -pa option + on the .apc file (for example, "Android - GPU Bound Example.apc"). The capture is processed + and a Performance Advisor report is produced. + - question: Do I need Python for Performance Advisor? + answer: >- + Yes. Performance Advisor uses a Python script to connect to your device and requires Python + 3.8 or later. +# END generated_summary_faq + author: Ronan Synnott -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false @@ -88,3 +136,4 @@ weight: 1 # _index.md always has weight of 1 to order corr layout: "learningpathall" # All files under learning paths have this same wrapper learning_path_main_page: "yes" # This should be surfaced when looking for related content. Only set for _index.md of learning path content. --- + From c3a78c231d5e3fc84774200df00338976624d318 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 11:43:22 -0500 Subject: [PATCH 126/137] nit --- content/learning-paths/mobile-graphics-and-gaming/ams/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md index f5431262cd..100d7a661a 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/ams/_index.md @@ -39,7 +39,7 @@ generated_summary_faq: You'll profile an Android graphics application on Arm Mali-based GPUs using Arm Performance Studio. After preparing a debuggable build, you'll connect an Android device over adb, explore a provided Streamline sample to understand the - available views, then capture a profile from their own application and generate a Performance + available views, then capture a profile from your own application and generate a Performance Advisor report with the CLI. You'll also perform frame-level inspection with Frame Advisor and RenderDoc for Arm GPUs, and use Mali Offline Compiler to estimate shader cost. By the end, you'll understand how to progress from example data to capturing on-device From 2152233bdf7d83f5829091b2022896e7fdb92d5e Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Fri, 26 Jun 2026 11:46:11 -0500 Subject: [PATCH 127/137] CLS improvements --- assets/css/content.css | 2 +- assets/css/list-pages.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/css/content.css b/assets/css/content.css index 78d1e34861..d7083b6e09 100644 --- a/assets/css/content.css +++ b/assets/css/content.css @@ -153,7 +153,7 @@ img.content-uploaded-image.centered { /* have to style the span like a paragraph, required for nesting caption in default markdown configruation */ display: block; /* or block, depending on the desired layout */ font-style: italic; - font-weight: 500; + font-weight: 400; margin-top: 0px; font-size: 1rem; } diff --git a/assets/css/list-pages.css b/assets/css/list-pages.css index 62bb8f6ccd..b0c4e337da 100644 --- a/assets/css/list-pages.css +++ b/assets/css/list-pages.css @@ -332,7 +332,7 @@ html[theme="light"] .learning-path-title, html[theme="light"] .basics-title { /*font-weight: bold; font-size:1.25rem; */ - font-weight: 500; + font-weight: 400; margin-top: 0px; margin-bottom: 4px; From 4b427983cd702f853cdd1febc6daf30b34f75a4a Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Fri, 26 Jun 2026 12:19:31 -0500 Subject: [PATCH 128/137] spelling and tag updates --- .wordlist.txt | 27 ++- content/learning-paths/automotive/_index.md | 8 +- .../automotive/openadkit1_container/_index.md | 2 +- .../embedded-and-microcontrollers/_index.md | 56 ++++--- .../laptops-and-desktops/_index.md | 34 ++-- .../mobile-graphics-and-gaming/_index.md | 63 +++---- .../servers-and-cloud-computing/_index.md | 155 ++++++++++++------ 7 files changed, 217 insertions(+), 128 deletions(-) diff --git a/.wordlist.txt b/.wordlist.txt index e88832fe22..d5d40b6ba1 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -6324,4 +6324,29 @@ perfrunbook pprof prj reflashing -unwinder \ No newline at end of file +unwinder +AmazonECS +Anupras +Mohapatra +RCTL +Rafay +Rafay's +RafayEKSProvisioner +aeaed +aed +balancer's +cbd +cdk +dac +dbdad +dcf +defaultproject +deprovision +dfbc +ebdd +ece +edbfe +ede +fcdebd +rafay +rctl \ No newline at end of file diff --git a/content/learning-paths/automotive/_index.md b/content/learning-paths/automotive/_index.md index 4acb578a94..3fa9776e04 100644 --- a/content/learning-paths/automotive/_index.md +++ b/content/learning-paths/automotive/_index.md @@ -30,9 +30,11 @@ tools_software_languages_filter: - Clang: 3 - CPP: 1 - DDS: 1 -- Docker: 2 +- Docker: 3 - FVP: 1 - GCC: 3 +- Git: 1 +- Multipass: 1 - Perf: 1 - Python: 2 - Raspberry Pi: 1 @@ -41,6 +43,7 @@ tools_software_languages_filter: - SME2: 1 - Tinkerblox: 1 - topdown-tool: 1 +- Yocto: 1 - Zenoh: 1 # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit @@ -65,7 +68,4 @@ tools_software_languages_filter: # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit --- diff --git a/content/learning-paths/automotive/openadkit1_container/_index.md b/content/learning-paths/automotive/openadkit1_container/_index.md index da3d000697..65e4e6ccc5 100644 --- a/content/learning-paths/automotive/openadkit1_container/_index.md +++ b/content/learning-paths/automotive/openadkit1_container/_index.md @@ -44,7 +44,7 @@ generated_summary_faq: order, container settings, and ROS 2 commands used by the demo. - question: Can I run the same workflow on cloud and on-prem Arm Neoverse systems? answer: >- - Yes. The worklow has been tested on Amazon EC2 and an Ampere Altra workstation, so you can + Yes. The workflow has been tested on Amazon EC2 and an Ampere Altra workstation, so you can choose either a cloud instance or an on-premise Arm Neoverse system. - question: What should I check before starting the demo to avoid resource-related failures? answer: >- diff --git a/content/learning-paths/embedded-and-microcontrollers/_index.md b/content/learning-paths/embedded-and-microcontrollers/_index.md index 6783d9efba..c75d57e46e 100644 --- a/content/learning-paths/embedded-and-microcontrollers/_index.md +++ b/content/learning-paths/embedded-and-microcontrollers/_index.md @@ -15,19 +15,19 @@ pinned_learning_paths: operatingsystems_filter: - Android: 1 - Baremetal: 30 -- Linux: 39 -- macOS: 11 -- RTOS: 11 -- Windows: 5 +- Linux: 48 +- macOS: 18 +- RTOS: 12 +- Windows: 10 subjects_filter: - CI-CD: 7 -- Containers and Virtualization: 6 +- Containers and Virtualization: 9 - Embedded Linux: 6 -- Libraries: 3 -- ML: 22 -- Performance and Architecture: 20 -- RTOS Fundamentals: 5 -- Security: 2 +- Libraries: 5 +- ML: 23 +- Performance and Architecture: 21 +- RTOS Fundamentals: 7 +- Security: 3 - Virtual Hardware: 2 subtitle: Learn best practices for IoT, embedded, and microcontroller development. title: Embedded and Microcontrollers @@ -43,13 +43,13 @@ tools_software_languages_filter: - Arm Streamline: 1 - Arm Virtual Hardware: 16 - Assembly: 1 -- AWS IoT Greengrass: 2 +- AWS IoT Greengrass: 3 - Azure: 1 - balenaCloud: 1 - BalenaOS: 1 - Baremetal: 1 - Bash: 1 -- C: 7 +- C: 10 - ChatGPT: 1 - Clang: 1 - CMSIS: 4 @@ -61,15 +61,15 @@ tools_software_languages_filter: - Containerd: 1 - CPP: 1 - DetectNet: 1 -- Docker: 12 +- Docker: 16 - DSTREAM: 2 - Edge AI: 2 - Edge Impulse: 2 -- ExecuTorch: 6 -- FastAPI: 1 +- ExecuTorch: 7 +- FastAPI: 2 - Fusion 360: 1 - FVP: 10 -- GCC: 10 +- GCC: 12 - Generative AI: 2 - GitHub: 4 - GitLab: 2 @@ -77,6 +77,7 @@ tools_software_languages_filter: - Himax SDK: 1 - Hugging Face: 3 - IP Explorer: 2 +- Java: 1 - Jupyter Notebook: 1 - K3s: 1 - Keil MDK: 7 @@ -86,7 +87,10 @@ tools_software_languages_filter: - LLM: 2 - Matter: 1 - MCP: 1 +- MediaPipe: 1 - MPS3: 1 +- MQTT: 1 +- MuJoCo: 1 - MXNet: 1 - Neon: 1 - NumPy: 1 @@ -96,28 +100,30 @@ tools_software_languages_filter: - Performance analysis: 1 - picocom: 1 - Porcupine: 1 -- Python: 12 +- Python: 17 - PyTorch: 5 -- QEMU: 1 -- Raspberry Pi: 9 +- QEMU: 2 +- Raspberry Pi: 10 +- Reachy Mini: 1 - Remote.It: 1 +- remoteproc-runtime: 1 - Runbook: 4 +- SSH: 3 +- stlink: 1 - STM32: 2 - strands-agents: 1 - systemd: 1 - TensorFlow: 3 - TensorRT: 1 - tinyML: 2 +- Topo: 3 - Trusted Firmware: 2 - TrustZone: 2 - TVMC: 1 - vcpkg: 1 -- Visual Studio Code: 1 +- Visual Studio Code: 2 +- YAML: 1 - Yocto Project: 1 -- Zephyr: 2 +- Zephyr: 4 weight: 5 -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit --- diff --git a/content/learning-paths/laptops-and-desktops/_index.md b/content/learning-paths/laptops-and-desktops/_index.md index a0444a649f..016b1d54c0 100644 --- a/content/learning-paths/laptops-and-desktops/_index.md +++ b/content/learning-paths/laptops-and-desktops/_index.md @@ -13,14 +13,14 @@ pinned_learning_paths: operatingsystems_filter: - Android: 3 - ChromeOS: 2 -- Linux: 41 -- macOS: 11 -- Windows: 47 +- Linux: 46 +- macOS: 14 +- Windows: 50 subjects_filter: - CI-CD: 7 -- Containers and Virtualization: 6 +- Containers and Virtualization: 8 - Migration to Arm: 30 -- ML: 8 +- ML: 11 - Performance and Architecture: 30 subtitle: Build native Windows on Arm applications that are fast and efficient. title: Laptops and Desktops @@ -32,16 +32,17 @@ tools_software_languages_filter: - Arm Performance Libraries: 2 - Arm64EC: 1 - Assembly: 1 -- Bash: 4 +- Bash: 5 - C: 12 - C#: 6 - CCA: 1 - Clang: 13 -- CMake: 4 -- CPP: 12 +- CMake: 5 +- CPP: 13 - CSS: 1 -- Docker: 9 +- Docker: 12 - ExecuTorch: 1 +- FastAPI: 1 - FFmpeg: 1 - GCC: 12 - Git: 1 @@ -67,35 +68,42 @@ tools_software_languages_filter: - LLVM: 2 - llvm-mca: 1 - MCP: 1 +- MediaPipe: 1 - MSBuild: 1 - MSVC: 1 - MTE: 1 +- MuJoCo: 1 - Neon: 1 - Neovim: 1 - Node.js: 3 +- Ollama: 1 - ONNX Runtime: 1 - OpenCV: 1 - perf: 4 - PGO: 1 - PowerShell: 1 - Pytest: 1 -- Python: 14 +- Python: 16 - PyTorch: 1 - QEMU: 1 - Qt: 2 +- Raspberry Pi: 1 - RDP: 1 +- Reachy Mini: 1 - Remote.It: 1 - RME: 1 - Runbook: 17 - Rust: 2 - SME2: 3 +- SSH: 2 - SVE: 1 - SVE2: 1 - Testcontainers: 1 +- Topo: 2 - Trusted Firmware: 1 - Ubuntu: 1 - Visual Studio: 14 -- Visual Studio Code: 13 +- Visual Studio Code: 14 - Windows Forms: 1 - Windows Performance Analyzer: 1 - Windows Presentation Foundation: 1 @@ -110,8 +118,4 @@ weight: 2 # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit --- diff --git a/content/learning-paths/mobile-graphics-and-gaming/_index.md b/content/learning-paths/mobile-graphics-and-gaming/_index.md index a2ad9b593d..aaaccdb20d 100644 --- a/content/learning-paths/mobile-graphics-and-gaming/_index.md +++ b/content/learning-paths/mobile-graphics-and-gaming/_index.md @@ -13,14 +13,14 @@ pinned_learning_paths: - nss-unreal - vulkan-ml-sample operatingsystems_filter: -- Android: 40 -- Linux: 40 -- macOS: 19 -- Windows: 16 +- Android: 41 +- Linux: 43 +- macOS: 22 +- Windows: 19 subjects_filter: - Gaming: 6 -- Graphics: 6 -- ML: 23 +- Graphics: 8 +- ML: 28 - Performance and Architecture: 36 subtitle: Optimize Android apps and build faster games using cutting-edge Arm tech. title: Mobile, Graphics, and Gaming @@ -35,62 +35,66 @@ tools_software_languages_filter: - Arm Mobile Studio: 1 - Arm Performance Studio: 3 - Assembly: 1 -- Bash: 1 -- Bazel: 1 +- Bash: 2 +- Bazel: 2 - C: 5 - C#: 3 - C++: 3 - CCA: 1 - Clang: 12 -- CMake: 3 -- CPP: 15 +- CMake: 4 +- CPP: 16 - Docker: 1 -- ExecuTorch: 7 +- ExecuTorch: 8 - Frame Advisor: 1 - GCC: 12 - Generative AI: 2 - Godot: 1 - Google Pixel 8: 1 - Google Test: 1 +- Gradio: 1 - Halide: 1 - Hugging Face: 6 - Java: 7 -- Jupyter Notebook: 1 -- KleidiAI: 3 -- Kotlin: 9 +- Jupyter Notebook: 2 +- KleidiAI: 4 +- Kotlin: 10 - LiteRT: 1 -- llama.cpp: 3 -- LLM: 1 +- LiteRT-LM: 1 +- llama.cpp: 4 +- LLM: 2 - LLVM: 1 - llvm-mca: 1 - MediaPipe: 2 +- Model Explorer: 1 - MTE: 2 -- Neon: 1 -- NX: 4 +- Neon: 2 +- NX: 7 - ONNX: 1 -- ONNX Runtime: 2 +- ONNX Runtime: 3 - OpenGL ES: 1 -- Python: 11 -- PyTorch: 3 +- Python: 12 +- PyTorch: 4 - QEMU: 1 - RenderDoc: 1 - RME: 1 - Runbook: 14 - Rust: 2 - SDDiskTool: 1 -- SME2: 9 -- SVE2: 1 +- SME2: 11 +- SVE2: 2 - TensorFlow: 1 - TorchAO: 1 -- TOSA: 1 +- TOSA: 2 +- Transformers: 1 - Trusted Firmware: 1 - Unity: 6 -- Unreal Engine: 4 -- Visual Studio: 1 +- Unreal Engine: 6 +- Visual Studio: 2 - Visual Studio Code: 1 -- Vulkan: 6 +- Vulkan: 8 - Vulkan SDK: 1 -- XNNPACK: 2 +- XNNPACK: 3 weight: 3 # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit @@ -102,7 +106,4 @@ weight: 3 # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit # auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit -# auto-generated padding to avoid Hugo YAML alias limit --- diff --git a/content/learning-paths/servers-and-cloud-computing/_index.md b/content/learning-paths/servers-and-cloud-computing/_index.md index 5a33c82da3..3ac5354a08 100644 --- a/content/learning-paths/servers-and-cloud-computing/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/_index.md @@ -12,10 +12,10 @@ pinned_learning_paths: - performix-microarchitecture operatingsystems_filter: - Android: 3 -- Linux: 223 -- macOS: 15 +- Linux: 260 +- macOS: 17 - other: 1 -- Windows: 14 +- Windows: 16 pinned_modules: - module: name: Recommended getting started learning paths @@ -23,14 +23,14 @@ pinned_modules: - providers - migration subjects_filter: -- CI-CD: 13 -- Containers and Virtualization: 41 -- Databases: 24 +- CI-CD: 14 +- Containers and Virtualization: 49 +- Databases: 29 - Libraries: 9 -- ML: 32 -- Performance and Architecture: 89 +- ML: 41 +- Performance and Architecture: 102 - Storage: 2 -- Web: 17 +- Web: 18 subtitle: Migrate and optimize cloud native apps on Arm-based servers. title: Servers and Cloud Computing tools_software_languages_filter: @@ -40,54 +40,64 @@ tools_software_languages_filter: - ACL: 1 - ActiveGate: 1 - AI: 1 +- Alluxio: 1 +- Amazon Elastic Container Service (Amazon ECS): 1 - Android Studio: 1 - Ansible: 2 - Apache: 1 - Apache Arrow: 1 - Apache Beam: 1 - Apache Cassandra: 1 -- Apache Spark: 2 +- Apache Spark: 4 - Apache Tomcat: 2 - ApacheBench: 1 - Argo CD: 1 - Arm Compiler for Linux: 1 - Arm Development Studio: 3 - Arm ISA: 1 -- Arm Performance Libraries: 2 -- Arm Performix: 2 +- Arm Performance Libraries: 3 +- Arm Performix: 7 - Arm Streamline: 1 +- Arm System Characterization Tool: 1 - armclang: 1 - armie: 1 - ArmRAL: 1 - Arrow Flight: 1 +- ASCT: 1 - ASP.NET Core: 2 - Assembly: 5 - async-profiler: 1 - Autocannon: 1 - AWS: 2 +- AWS CDK CLI: 1 +- AWS CLI: 1 - AWS Cloud Formation: 1 - AWS CodeBuild: 1 - AWS EC2: 3 - AWS Elastic Container Service (ECS): 1 -- AWS Elastic Kubernetes Service (EKS): 3 +- AWS Elastic Kubernetes Service (EKS): 4 - AWS Graviton: 1 +- AWS IoT Greengrass: 1 - AWS Lambda: 1 -- Azure: 1 -- Azure CLI: 3 +- Azure: 2 +- Azure CLI: 4 - Azure Portal: 1 -- Bash: 3 +- Bash: 8 - bash: 2 - Bastion: 3 +- Benchstat: 1 - BOLT: 3 +- boto3: 1 - bpftool: 1 - Buildkite: 1 -- C: 14 +- C: 15 - C#: 2 -- C++: 3 +- C++: 5 - Capstone: 1 - Cargo: 1 - cassandra-stress: 1 - CCA: 9 +- ChromaDB: 1 - CircleCI: 2 - Clair: 1 - Clang: 13 @@ -95,42 +105,51 @@ tools_software_languages_filter: - ClickHouse: 2 - Cloud Build: 1 - Cloud SQL (PostgreSQL): 1 -- CMake: 2 +- CMake: 6 - Confidential Containers: 1 - Couchbase: 1 -- CPP: 15 +- CPP: 16 - cqlsh: 1 - Criterion: 1 +- DeepSpeed: 1 - Demo: 3 +- DevStack: 1 - Django: 2 -- Docker: 35 +- Docker: 38 - Docker Buildx: 1 - Dynatrace: 1 +- Elasticsearch: 1 - Envoy: 3 - Erlang: 1 +- ESRally: 1 - ExecuTorch: 1 - Facter: 1 +- FastAPI: 1 - Fastpath: 1 +- fio: 1 - FlameGraph: 1 -- Flask: 1 +- Flask: 4 - Flink: 2 +- Flyte: 1 - Fortran: 1 - FunASR: 1 - FVP: 8 - Gardener: 1 -- GCC: 28 +- GCC: 30 - gdb: 1 - Geekbench: 1 - Generative AI: 13 +- Gerrit: 1 - Git: 2 - GitHub: 3 - GitHub Actions: 3 - GitHub CLI: 1 -- GitHub Copilot: 2 +- GitHub Copilot: 3 - GitLab: 2 - GKE: 3 - glibc: 1 -- Go: 4 +- Gluten: 1 +- Go: 5 - Golang: 1 - Google Artifact Registry: 1 - Google Axion: 3 @@ -141,121 +160,152 @@ tools_software_languages_filter: - Google Test: 1 - Grafana: 1 - Groovy (Jenkins Pipeline): 1 +- gRPC: 1 +- Hadoop: 1 - HammerDB: 1 -- Helm: 3 +- Helm: 4 - Herd7: 1 - Hiera: 1 -- Hugging Face: 12 +- Hive: 1 +- Hugging Face: 13 - InnoDB: 1 - Intrinsics: 1 - iPerf3: 1 - ipmitool: 1 - Jaeger: 1 -- Java: 6 +- Java: 10 +- JavaScript: 1 - JAX: 1 - Jenkins: 1 - JMH: 1 - JSON: 1 +- K3s: 2 - Kafka: 2 - Kata Containers: 1 - KEDA: 1 - Kedify: 1 - Keras: 2 +- Keycloak: 1 - KinD: 1 - Kiro: 1 +- Kolla-Ansible: 1 - kube-bench: 1 - kubectl: 2 -- Kubernetes: 17 +- Kubernetes: 20 - Libamath: 2 - libbpf: 1 - Linaro Forge: 1 - Linux: 1 +- Linux kernel: 1 - Litmus7: 1 - llama.cpp: 2 - Llama.cpp: 2 +- LlamaIndex: 1 - LLM: 11 - LLVM: 1 - llvm-mca: 1 - LM Evaluation Harness: 1 +- Longhorn: 1 - LSE: 1 - MariaDB: 1 - Maven: 1 -- MCP: 3 +- MCP: 6 - Memcached: 2 - Memorystore (Redis): 1 -- MinIO: 1 +- MinIO: 2 +- MLflow: 1 - MLPerf: 1 - ModelScope: 1 - MongoDB: 4 - mongostat: 1 - mongotop: 1 - mpi: 1 -- MySQL: 10 +- MQTT: 1 +- MySQL: 11 - Neon: 7 - Networking: 1 - Nexmark: 1 -- NGINX: 7 +- NGINX: 8 - nginx: 1 -- Node.js: 5 +- Node.js: 6 - node.js: 1 - npm: 3 -- Ollama: 1 +- NumPy: 1 +- Ollama: 2 - ONNX Runtime: 2 - OpenBLAS: 1 - OpenBMC: 1 +- OpenCV: 1 +- OpenEBS: 1 +- OpenJDK: 1 - OpenJDK 17: 1 - OpenJDK 21: 2 +- OpenRNG: 1 - OpenShift: 1 +- OpenStack: 1 +- OpenStack CLI: 1 - Orchard Core: 1 - PAPI: 1 -- perf: 8 -- Perf: 1 +- perf: 10 +- Perf: 2 +- pgbench: 1 - PHP: 1 - PHPBench: 1 - pika: 1 -- PostgreSQL: 7 +- PostgreSQL: 9 - Profiling: 1 - Prometheus: 1 - psycopg2: 1 - Puppet: 1 - Pytest: 1 -- Python: 37 +- Python: 52 - Python 3.11: 1 -- PyTorch: 10 +- PyTorch: 13 +- Qdrant: 1 - QEMU: 1 +- QuantLib: 1 - RabbitMQ: 1 +- Rafay: 1 - RAG: 1 - Rails: 1 -- Redis: 5 +- Ray: 1 +- rctl: 1 +- Redis: 6 - redis-benchmark: 1 - Remote.It: 2 - RME: 9 - Ruby: 2 -- Runbook: 73 +- Runbook: 74 - Rust: 3 +- scikit-learn: 2 +- Sentence Transformers: 1 - Service Mesh: 1 - Siege: 1 - Skaffold: 1 - SME2: 1 - snappy: 1 - Snort3: 1 -- SQL: 8 +- SQL: 9 +- SSH: 2 - Streamline CLI: 1 - Streamlit: 2 - Supervisor: 1 -- SVE: 5 +- SVE: 6 - SVE2: 2 +- sysbench: 1 - Sysbench: 1 +- Sysreport: 1 - taskset: 1 - Tekton: 1 - Telemetry: 1 - TensorFlow: 3 -- Terraform: 11 +- Terraform: 12 - Testcontainers: 1 - ThirdAI: 1 - TimescaleDB: 1 - Tinkerblox: 1 - topdown-tool: 1 +- Topo: 2 - Trivy: 1 - Trusted Firmware: 1 - Trustee: 2 @@ -263,10 +313,12 @@ tools_software_languages_filter: - TuxMake: 1 - tuxmake: 1 - TypeScript: 2 +- Ubuntu: 1 - Vectorscan: 1 +- Velox: 1 - Veraison: 3 -- Visual Studio Code: 5 -- vLLM: 3 +- Visual Studio Code: 6 +- vLLM: 4 - VS Code: 1 - vvenc: 1 - Web Server: 1 @@ -275,15 +327,16 @@ tools_software_languages_filter: - WordPress: 3 - wrk2: 2 - x265: 1 -- YAML: 1 +- XGBoost: 1 +- YAML: 2 - YCSB: 1 - Yocto/BitBake: 1 - zlib: 1 - ZooKeeper: 1 weight: 1 cloud_service_providers_filter: -- AWS: 89 -- Google Cloud: 104 -- Microsoft Azure: 87 +- AWS: 95 +- Google Cloud: 116 +- Microsoft Azure: 101 - Oracle: 61 --- From 6e8eeb5eec1883c5193b4d21ece99b23ae24a403 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Fri, 26 Jun 2026 13:18:13 -0500 Subject: [PATCH 129/137] Spelling --- .wordlist.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.wordlist.txt b/.wordlist.txt index d5d40b6ba1..d9fb4f9631 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -6349,4 +6349,10 @@ edbfe ede fcdebd rafay -rctl \ No newline at end of file +rctl +Prims +bbe +boundedness +cbf +dda +efe \ No newline at end of file From 85d97393c90c2861cc53211827b0eecaf0d5f3c4 Mon Sep 17 00:00:00 2001 From: Julio Suarez Date: Fri, 26 Jun 2026 15:07:26 -0500 Subject: [PATCH 130/137] MySQL Tuning LP Refresh - Refresh MySQL tuning Learning Path title, description, objectives, prerequisites, and further reading. - Rework tuning guidance to emphasize measurement-based performance tuning instead of fixed one-size-fits-all settings. - Add updated HammerDB TPROC-C before/after image. - Expand system-level tuning coverage for storage, huge pages, and 64 KB Arm kernel pages. - Split MySQL configuration guidance into focused sections for buffer pool, redo log capacity, huge pages, durability, I/O capacity, and spin locks. - Add MySQL documentation links for tuning variables. - Remove redundant verification and Innodb_log_waits guidance. - Clean up wording, spelling, and Learning Path conventions across the updated pages. --- .../mysql_tune/OOBvsTuned.png | Bin 0 -> 233011 bytes .../mysql_tune/_index.md | 33 +++- .../mysql_tune/before_and_after.md | 29 +++- .../mysql_tune/kernel_comp_lib.md | 87 +++++++--- .../mysql_tune/tuning.md | 157 +++++++++++++----- 5 files changed, 220 insertions(+), 86 deletions(-) create mode 100644 content/learning-paths/servers-and-cloud-computing/mysql_tune/OOBvsTuned.png diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/OOBvsTuned.png b/content/learning-paths/servers-and-cloud-computing/mysql_tune/OOBvsTuned.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb533528fd89dcdc022c2adb4f38f1f1dca850d GIT binary patch literal 233011 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%0A`k3Z~#-aFMgr4~F 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
G7yDT(3w$b-!Sc|{r$oQp! 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 Wr=pU%Yu!Qw{_ZMi-N{pY82BHxzv~eI literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md index 48039b70c6..9dfcfc421b 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md @@ -1,15 +1,19 @@ --- -title: Learn how to Tune MySQL +title: Tune MySQL performance on Arm-based platforms +description: Learn how to tune MySQL configuration, Linux memory settings, and storage options to improve database performance on Arm-based platforms. minutes_to_complete: 30 -who_is_this_for: This is an advanced topic for software developers and DevOps professionals interested in optimizing MySQL performance on Arm-based VMs in the cloud. +who_is_this_for: This Learning Path is for database administrators (DBAs) and software developers who want to optimize MySQL performance on Arm-based platforms. learning_objectives: - - Tune MySQL to increase performance + - Configure MySQL settings that affect connection handling, memory usage, disk flush behavior, and concurrency. + - Enable huge pages for MySQL and size them based on the InnoDB buffer pool. + - Evaluate storage, kernel, compiler, and library choices that can affect MySQL performance. prerequisites: - - Bare-metal or cloud [installation of MySQL](/learning-paths/servers-and-cloud-computing/mysql/) + - On-prem or cloud [installation of MySQL](https://dev.mysql.com/doc/refman/en/) + - A repeatable MySQL workload or benchmark that you can run before and after tuning author: Julio Suarez @@ -41,13 +45,25 @@ test_maintenance: true further_reading: - resource: - title: MySQL documentation - link: https://www.mysql.com/ + title: MySQL Reference Manual + link: https://dev.mysql.com/doc/refman/en/ type: documentation - resource: - title: Running MySQL on ARM - link: https://mysqlonarm.github.io/Running-MySQL-on-ARM/ + title: InnoDB configuration parameters + link: https://dev.mysql.com/doc/refman/en/innodb-parameters.html type: documentation + - resource: + title: Optimizing InnoDB disk I/O + link: https://dev.mysql.com/doc/refman/en/optimizing-innodb-diskio.html + type: documentation + - resource: + title: Linux HugeTLBpage documentation + link: https://docs.kernel.org/admin-guide/mm/hugetlbpage.html + type: documentation + - resource: + title: Migrating applications to Arm servers + link: /learning-paths/servers-and-cloud-computing/migration/ + type: learning-path ### FIXED, DO NOT MODIFY # ================================================================================ @@ -55,4 +71,3 @@ weight: 1 layout: learningpathall learning_path_main_page: 'yes' --- - diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md index b5fd336d99..b60a476b86 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md @@ -1,17 +1,32 @@ --- -title: "About MySQL performance tuning" +title: "Measure MySQL tuning impact" +description: Learn how to approach MySQL performance tuning as a measurement-driven process and compare baseline results with tuned results. weight: 2 layout: "learningpathall" --- -## About database performance tuning +## About performance tuning -The configuration of a database and the types of requests made by clients to it will differ from use case to use case. This means there is no one size fits all set of tuning parameters for `MySQL`. Use the information in this learning path as general guidance to help with tuning `MySQL`. +Performance tuning is most useful when you treat it as a measurement process, not a fixed checklist. You can tune by changing one parameter at a time, running a designed experiment, comparing profiles, or using automation and AI-assisted tools to explore a larger configuration space. -## Importance of tuning +There isn't a universal set of tuning parameters that works best for every application. The right settings depend on the workload, data size, memory capacity, storage performance, network behavior, software version, system architecture, operating system, and other application-specific factors. -Application tuning allows you to gain performance without scaling a deployment up (bigger machines) or out (more machines). This gives the option to use the gained performance, or to trade it for cost savings by reducing the total compute resources provisioned. +Whatever method you use, keep the measurements repeatable. Record the system configuration, workload, software versions, and tuning parameters so you can identify which changes improved performance and which changes had little effect. -## Note on MySQL Documentation +## Why tune MySQL -All links to [MySQL documentation](https://dev.mysql.com/doc/refman/en/) in this learning path point to the latest version of the documentation. If you are using an older version of MySQL, be sure to change the documentation version after clicking the links. \ No newline at end of file +MySQL performance can be limited by memory usage, disk I/O, connection handling, concurrency, or synchronization overhead. Tuning helps you use the available compute, memory, and storage resources more efficiently. + +Improved performance can give you higher throughput, lower latency, or better cost efficiency. A tuned configuration can increase capacity on the same system, or help you meet the same performance target with fewer compute resources. + +## Example benchmark result + +The following example shows MySQL throughput with HammerDB TPROC-C before and after tuning on an Arm Neoverse V3 system. + +![Bar chart comparing MySQL HammerDB TPROC-C normalized NOPM throughput before and after tuning on an Arm Neoverse V3 system. At 128 clients, the out-of-box configuration is 1.00 and the tuned configuration is 15.37.#center](OOBvsTuned.png "MySQL HammerDB TPROC-C throughput before and after tuning") + +This benchmark result is an example, not a guaranteed improvement for every workload. Your results depend on the MySQL version, database size, storage device, memory capacity, client thread count, and the queries used in the test. + +{{% notice Note %}} +Links to MySQL documentation in this Learning Path point to the latest version of the documentation. If you use an older version of MySQL, select the matching documentation version after opening the links. +{{% /notice %}} diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md index 287cf756a3..2cacd23636 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md @@ -1,6 +1,7 @@ --- # User change -title: "System, Kernel, Compiler, and Libraries" +title: "Tune system, kernel, compiler, and library settings" +description: Learn how storage, kernel page size, Linux huge pages, compiler settings, and OpenSSL choices can affect MySQL performance on Arm-based systems. weight: 3 # 1 is first, 2 is second, etc. @@ -8,29 +9,33 @@ weight: 3 # 1 is first, 2 is second, etc. layout: "learningpathall" --- -## Storage technology, file system format, and disk scheduling +## Tune the system around MySQL -The underlying storage technology and the file system format can impact performance. In general, locally attached SSD storage will perform best. However, network based storage systems can perform well. You should spend some time studying and experimenting with different storage technologies and configuration options. +MySQL configuration is only one part of performance tuning. Operating system settings, storage behavior, kernel memory management, compiler choices, and library versions can also affect throughput and latency. This section highlights system-level areas to check before or alongside MySQL-specific tuning. -Aside from the storage technology, the file system format used with `MySQL` can impact performance. The `xfs` file system is a good starting point. The `ext4` file system is another good alternative. Last, it is recommended to use storage drives that are dedicated to the database (i.e. not shared with the OS or other applications). +## Storage technology, file systems, and disk scheduling -When running in the cloud, the disk scheduling algorithm is typically set to `noop` or a similar "dumb" algorithm. This is typically optimal for `MySQL` in the cloud, so no adjustment is needed. However, if running `MySQL` on an on-prem server, it's a good idea to double check what the disk scheduling algorithm is, and possibly change it. According to the [Optimizing InnoDB Disk I/O documentation](https://dev.mysql.com/doc/refman/en/optimizing-innodb-diskio.html), `noop` or `deadline` might be better options. It's worth testing this with on-prem systems. +Storage technology and file system choices can affect performance. In general, locally attached SSD storage performs best, but network-based storage systems can also perform well. Test the storage technologies and configuration options available in your environment. -## MySQL storage engines +The file system used with MySQL can also affect performance. The `xfs` file system is a good starting point, and `ext4` is another good option. For production systems, use storage volumes dedicated to the database instead of sharing them with the operating system or other applications. -There are different storage engines available for `MySQL`. The default storage engine is `InnoDB`. `InnoDB` is the default storage engine because it performs the best in the broadest set of use cases. +When running in the cloud, the disk scheduling algorithm is typically set to `noop` or a similar minimal scheduler. This is usually a good setting for MySQL in cloud environments, so no adjustment is needed. If you run MySQL on an on-premises server, double-check the disk scheduling algorithm and test alternatives. According to the [Optimizing InnoDB Disk I/O documentation](https://dev.mysql.com/doc/refman/en/optimizing-innodb-diskio.html), `noop` or `deadline` might be better options for some systems. + +## MySQL storage engines + +MySQL supports different storage engines. The default storage engine is `InnoDB`, which performs best across the broadest set of use cases. Information on alternative storage engines can be found in the [MySQL documentation](https://dev.mysql.com/doc/refman/en/storage-engines.html). -## Kernel configuration +## Kernel configuration -`MySQL` can benefit from adjustments to kernel parameters. Below is a list of kernel related settings that can have a positive impact on performance. +MySQL can benefit from adjustments to kernel parameters. The following kernel-related settings can have a positive impact on performance. ### Linux virtual memory subsystem -Making changes to the Linux Virtual Memory subsystem can improve performance. +Making changes to the Linux virtual memory subsystem can improve performance. -These settings can be changed in the `/etc/sysctl.conf` file, or by using the `sysctl` command. +You can change these settings by using the `sysctl` command or by adding configuration files under `/etc/sysctl.d/`. Documentation on the virtual memory subsystem parameters can be found in the [admin-guide for sysctl in the Linux source code](https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/sysctl/vm.rst). @@ -42,14 +47,35 @@ sudo sysctl -a See the `sysctl` command documentation for more. +### Consider 64 KB kernel pages on Arm + +Some Arm Linux distributions provide kernels built with `64 KB` base pages instead of `4 KB` base pages. This is a kernel selection or build-time choice, not a `sysctl` setting you can change on a running system. + +A `64 KB` base page can improve some memory-intensive workloads because each base page maps more memory. This can reduce Memory Management Unit (MMU) translation overhead, reduce page-table walk depth, and relieve Translation Lookaside Buffer (TLB) pressure, including instruction-side TLB pressure in the CPU front end. + +The tradeoff is memory efficiency. Larger base pages can increase internal fragmentation for workloads with many small or sparsely touched mappings, which can reduce the effective amount of memory available to the application and operating system. + +The benefit is workload dependent, so compare a `4 KB` kernel and a `64 KB` kernel with the same MySQL & storage configuration. + +Base page size also affects the huge page sizes available on Arm. The common PMD-level huge page sizes are: + +| Kernel base page size | PMD-level huge page size | +|-----------------------|--------------------------| +| `4 KB` | `2 MiB` | +| `64 KB` | `512 MiB` | + +For more information, see the Linux kernel documentation for [Memory Layout on AArch64 Linux](https://docs.kernel.org/next/arm64/memory.html) and [HugeTLBpage on ARM64](https://docs.kernel.org/next/arm64/hugetlbpage.html). + ### Huge memory pages - `MySQL` benefits from using huge memory pages. Huge pages reduce how often virtual memory pages are mapped to physical memory. - +MySQL can benefit from using huge memory pages, especially when the InnoDB buffer pool is large. Huge memory pages have a similar performance goal to `64 KB` base pages: they map more memory per translation entry, which can reduce page-table walks and TLB pressure. + +The tradeoff is also similar. Huge pages reserve memory in larger chunks, so over-allocating them can reduce the memory available for other uses. Under-allocating them can prevent MySQL from using huge pages at all. The performance impact depends on your workload and system configuration. + To see the current huge memory page configuration, run the following command on the host: ```bash -cat /proc/meminfo | grep ^Huge +grep '^Huge' /proc/meminfo ``` The output should be similar to: @@ -63,9 +89,9 @@ Hugepagesize: 2048 kB Hugetlb: 0 kB ``` -Huge pages are not being used if `HugePages_Total` is 0 (this is typically the default). +Huge pages are not being used if `HugePages_Total` is `0` (this is typically the default). -Also note that `Hugepagesize` is 2MiB which is the typical default for huge pages on Linux. +The `Hugepagesize` value depends on the kernel base page size and platform configuration. Use the value reported by `/proc/meminfo` when calculating `vm.nr_hugepages`. The sysctl parameter that enables huge pages is shown below: @@ -73,34 +99,41 @@ The sysctl parameter that enables huge pages is shown below: vm.nr_hugepages ``` -This parameter sets the number of huge pages you want the kernel to make available to applications. +This parameter sets the number of huge pages you want the kernel to make available to applications. -The total amount of memory that will be used for huge pages will be this number (defaulted to 0) times the `Hugepagesize`. +The total amount of memory used for huge pages is this number, which defaults to 0, multiplied by the `Hugepagesize` value. -As an example, if you want a total of 1GB of huge page space, then you should set `vm.nr_hugepages` to 500 (500x2MB=1GB). +For example, if you want `1 GiB` of huge page space and `Hugepagesize` is `2 MiB`, set `vm.nr_hugepages` to `512`. ```bash -sudo sysctl -w vm.nr_hugepages=500 +sudo sysctl -w vm.nr_hugepages=512 ``` To make the change permanent: ```bash -sudo sh -c 'echo "vm.nr_hugepages=500" >> /etc/sysctl.conf' +echo "vm.nr_hugepages=512" | sudo tee /etc/sysctl.d/99-mysql-hugepages.conf +sudo sysctl --system ``` ### Selecting the number of huge pages to use -You should set `vm.nr_hugepages` to a value that gives a total huge page space equal to or slightly larger than the `MySQL` buffer pool size. Selecting the buffer pool size is discussed in the [Tuning MySQL](/learning-paths/servers-and-cloud-computing/mysql_tune/tuning/) section. +If huge pages improve your workload, set `vm.nr_hugepages` to a value that gives a total huge page space equal to or slightly larger than the InnoDB buffer pool size, which is controlled by `innodb_buffer_pool_size`. + +{{% notice Important %}} +After restarting MySQL with `large-pages=ON`, check both `/proc/meminfo` and the MySQL error log. If the huge page pool is too small, or MySQL cannot allocate huge pages for another reason, InnoDB can fall back to traditional memory and write `Warning: Using conventional memory pool.` to the MySQL error log. You might also see an allocation warning similar to `large_page_aligned_alloc mmap(... bytes) failed; errno 12`. +{{% /notice %}} + +Selecting the buffer pool size is discussed in the [Tuning MySQL](/learning-paths/servers-and-cloud-computing/mysql_tune/tuning/) section. Typically, only the number of huge pages needs to be configured. However, for more information on the different parameters that affect the configuration of huge pages, review the [admin-guide for hugetlbpage in the Linux source code](https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/mm/hugetlbpage.rst). -## Compiler Considerations +## Compiler considerations -The easiest way to gain performance is to use the latest version of GCC. Aside from that, the flags `-mcpu` and `-flto` can be used to potentially gain additional performance. Usage of these flags is explained in the [Migrating C/C++ applications](/learning-paths/servers-and-cloud-computing/migration/c/) section of the [Migrating applications to Arm servers](/learning-paths/servers-and-cloud-computing/migration/) learning path. +If you build MySQL from source, the compiler version and optimization flags can affect performance. Use a recent version of GCC, and consider flags such as `-mcpu` and `-flto` for additional optimization. These flags are explained in the [Migrating C/C++ applications](/learning-paths/servers-and-cloud-computing/migration/c/) section of the [Migrating applications to Arm servers](/learning-paths/servers-and-cloud-computing/migration/) Learning Path. -## OpenSSL Considerations +## OpenSSL considerations -MySQL relies on [OpenSSL](https://www.openssl.org/) for cryptographic operations. Thus, the version of OpenSSL used with MySQL (and the GCC version and switches used to compile it) can impact performance. Typically using the Linux distribution default version of OpenSSL is sufficient. +MySQL relies on [OpenSSL](https://www.openssl.org/) for cryptographic operations. The OpenSSL version used with MySQL, and the compiler version and switches used to build it, can affect performance. The default OpenSSL version provided by your Linux distribution is typically sufficient. -However, it is possible to use newer versions of OpenSSL which could yield performance improvements. This is achieved by building and installing OpenSSL before building MySQL. \ No newline at end of file +If you build MySQL from source, you can also build and install a newer version of OpenSSL before building MySQL. This might improve performance for workloads that spend significant time in cryptographic operations. diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md index 93293bf523..c43265f903 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md @@ -1,6 +1,7 @@ --- # User change -title: "Tuning MySQL" +title: "Tune MySQL configuration" +description: Learn how to tune MySQL server parameters for connections, memory, disk flushing, transaction durability, I/O capacity, and lock polling. weight: 4 # 1 is first, 2 is second, etc. @@ -8,92 +9,162 @@ weight: 4 # 1 is first, 2 is second, etc. layout: "learningpathall" --- -## MySQL configuration +## MySQL configuration -There are different ways to set configuration parameters for `MySQL`. +You can set MySQL server configuration parameters in an option file or on the `mysqld` command line. -This is discussed in the [Specifying Program Options](https://dev.mysql.com/doc/refman/en/program-options.html) section of the MySQL documentation. +For persistent tuning, use an option file so the configuration can be reviewed, version controlled, and applied consistently when MySQL restarts. For more information, see the MySQL [Specifying Program Options documentation](https://dev.mysql.com/doc/refman/en/program-options.html). -The configurations below can be directly pasted into a `MySQL` configuration file under the group `mysqld`. +The examples in this section are intended for the `[mysqld]` group in a MySQL option file. -It's also possible to specify these configurations on the `mysqld` command line. However, it's better to use configuration files since these can be version controlled more easily. +In general, leave most MySQL settings at their defaults and change them only when you have a workload requirement, test result, profile, or observed bottleneck that supports the change. -Last, keep in mind, that in general, it's usually best to leave most configs at default, and only change them if there is a suspected/known issue. +### Connections and prepared statements -### Connections and prepared transactions +The following example shows intentionally high limits that can be useful in benchmark environments where you want to prevent connection or prepared statement limits from affecting the test result: +```ini +# Intentionally high benchmark limits. +max_connections=100000 +max_prepared_stmt_count=4194304 ``` -max_connections=100000 # Default 151 -max_prepared_stmt_count=4194304 # Default 16382 + +The [`max_connections`](https://dev.mysql.com/doc/refman/en/server-system-variables.html#sysvar_max_connections) parameter doesn't directly improve performance. It raises the number of client connections MySQL can accept. Higher values consume more memory and can also depend on operating system limits such as file descriptors, so size this value for your expected peak connection count. + +The [`max_prepared_stmt_count`](https://dev.mysql.com/doc/refman/en/server-system-variables.html#sysvar_max_prepared_stmt_count) parameter limits the total number of prepared statements across the server. The default protects the server from excessive memory use. Increase this value only when a benchmark or application needs more prepared statements, and avoid carrying an oversized value into production without measuring memory impact. + +### Dedicated server configuration + +If the system only runs MySQL, enable the dedicated server setting: + +```ini +innodb_dedicated_server=ON ``` -`max_connections` doesn't impact performance, but if a high connection count is expected or required, this should be raised in order to not reject requests from clients. +The [`innodb_dedicated_server`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_dedicated_server) parameter automatically sizes selected InnoDB settings for a server dedicated to MySQL. Check the [MySQL dedicated server documentation](https://dev.mysql.com/doc/refman/en/innodb-dedicated-server.html) for the MySQL version you deploy because the behavior can change between releases. + +In MySQL 8.4+, `innodb_dedicated_server` automatically configures `innodb_buffer_pool_size` and `innodb_redo_log_capacity`. On systems with more than `4 GiB` of RAM, `innodb_buffer_pool_size` is set to `75%` of detected system memory. + +The auto-sized values are a useful starting point, but you can still override individual settings when workload requirements or performance data justify the change. + +### Buffer pool size -Keep in mind that more connections means more resources will be consumed, especially memory. Setting this to something higher is completely dependent on use case and requirements. +The [`innodb_buffer_pool_size`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_buffer_pool_size) parameter is one of the most important MySQL performance settings. It controls how much memory InnoDB can use to cache indexes and table data. -`max_prepared_stmt_count` is 16382 by default. It's a good idea to set this as small as possible in order to help prevent denial of service attacks. You can make it very large in a test environment that uses many prepared statements. +If MySQL runs on a dedicated server, `innodb_dedicated_server=ON` can be enough to size the buffer pool. If you don't use `innodb_dedicated_server`, or you want to test a specific value, set `innodb_buffer_pool_size` based on your workload and available memory: -### Dedicated Server Configuration +```ini +# Example value for a dedicated 128 GiB test system. +innodb_buffer_pool_size=96G ``` -innodb_dedicated_server=ON + +The [MySQL InnoDB buffer pool documentation](https://dev.mysql.com/doc/refman/en/innodb-buffer-pool.html) suggests setting the buffer pool size to as much as `80%` of system memory on a dedicated database server. Leave memory for the operating system, connections, background MySQL memory use, and any other processes on the system. + +Confirm the current buffer pool size: + +```sql +SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; ``` -If the node will only run `MySQL` and no other application. One of the easiest ways to gain performance is by setting `innodb_dedicated_server=ON`. This setting does different things depending on the version of `MySQL`, so it's important to check the [documentation](https://dev.mysql.com/doc/refman/en/innodb-dedicated-server.html) for the specific version of `MySQL` being deployed. As of version 8.4, this setting will automatically set both `innodb_buffer_pool_size` and `innodb_redo_log_capacity`. Two configurations that impact performance. -On systems with a large amount of RAM (greater than 4GB), the `innodb_buffer_pool_size` will be set to 75% total system memory. `innodb_buffer_pool_size` is one of the most important configuration parameters that can be set. It determines how much memory can be used to store indexes and table data. It's a cache that improves read/write latency by relieving pressure on storage. If `innodb_dedicated_server` is not used, then this parameter should be set. The [MySQL documentation](https://dev.mysql.com/doc/refman/en/innodb-buffer-pool.html) suggests this be set to up to 80% of total system memory. The default of 128MiB is probably going to be far less than 80% of total system memory. +{{% notice Note %}} +The `innodb_buffer_pool_size` value is shown in bytes. Use the value reported by MySQL when calculating huge page allocation. +{{% /notice %}} -`innodb_redo_log_capacity` was introduced in MySQL 8.0.30. It controls the amount of disk space used for redo log files. In earlier versions of `MySQL`, the parameters `innodb_log_file_size` and `innodb_log_files_in_group` influence redo log size and behavior. `innodb_redo_log_capacity` simplifies things. When `innodb_dedicated_server` is enabled, `innodb_redo_log_capacity` is set to (number of available logical processors / 2)GB with a max of 16GB. If `innodb_dedicated_server` is not used, then `innodb_redo_log_capacity` should be set. If the redo log is too small, the status variable [`Innodb_log_waits`](https://dev.mysql.com/doc/refman/en/server-status-variables.html#statvar_Innodb_log_waits) will be large. This indicates that the redo log buffer is waiting for the log to be flushed to storage before continuing. Ideally, this status variable is 0 at all times. +### Buffer pool instances -### Huge Pages +For large buffer pools, multiple buffer pool instances can improve concurrency by reducing contention as different threads read and write cached pages. +```ini +# Example value for a large buffer pool. +innodb_buffer_pool_instances=8 ``` -large_pages=ON # default is OFF + +The [`innodb_buffer_pool_instances`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_buffer_pool_instances) setting takes effect only when `innodb_buffer_pool_size` is at least `1 GiB`. The total buffer pool is divided across the instances, so keep each instance at least `1 GiB`. Test values such as `4`, `8`, or `16` with your workload, and avoid creating so many instances that each one becomes too small. + +### Redo log capacity + +For write-heavy workloads, you can keep `innodb_dedicated_server=ON` and explicitly set a larger redo log capacity than the value MySQL calculates automatically: + +```ini +innodb_dedicated_server=ON +# Example override for write-heavy workloads. +innodb_redo_log_capacity=32G ``` -Turning on `large_pages` can result in significant performance gains. +The [`innodb_redo_log_capacity`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_redo_log_capacity) parameter controls the amount of disk space used for redo log files. It was introduced in MySQL 8.0.30. In earlier MySQL versions, [`innodb_log_file_size`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_file_size) and [`innodb_log_files_in_group`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_files_in_group) control redo log size and behavior. -Using larger pages helps to reduce how often physical memory has to get mapped to virtual memory. Note that huge pages needs to be [turned on at the kernel level](/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib/) for this to work. +The auto-sized `innodb_redo_log_capacity` value is a starting point. Increasing it can improve write-heavy workloads by giving InnoDB more redo log space before checkpoints limit write throughput. An explicit `innodb_redo_log_capacity` value overrides the value calculated by `innodb_dedicated_server` for that variable, while still allowing `innodb_dedicated_server` to size other settings such as `innodb_buffer_pool_size`. When you override one of the automatically configured variables, MySQL prints a startup warning such as `Option innodb_dedicated_server is ignored for innodb_redo_log_capacity`. That warning is expected for the overridden variable. -If `innodb_dedicated_server` is set to `ON`, then `innodb_buffer_pool_size` will automatically be set. The value of `innodb_buffer_pool_size` is needed to calculate how many huge pages will need to be allocated. The value of `innodb_buffer_pool_size` can be confirmed by checking the variable in the `mysql` cli. +Larger redo logs use more disk space and can increase crash recovery time, so test values against both performance and operational requirements. -```sql -SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; +### Huge pages + +Enable large page support in the MySQL configuration: + +```ini +large-pages=ON ``` -> NOTE: The innodb_buffer_pool_size unit is bytes. -> There is no need to confirm the value of `innodb_buffer_pool_size` if it is set manually (i.e. you are not using `innodb_dedicated_server=ON`). -> Alternatively, you can estimate the value of `innodb_buffer_pool_size` since the calculation when `innodb_dedicated_server=ON` is in the documentation. Use the command "`free --bytes`" to get the total system memory in bytes. +Turning on [`large-pages`](https://dev.mysql.com/doc/refman/en/server-system-variables.html#sysvar_large_pages) can improve performance when MySQL uses a large InnoDB buffer pool. Larger pages map more memory per translation entry, which can reduce page-table walks and TLB pressure. + +Huge pages must also be configured at the Linux kernel level. See the [system, kernel, compiler, and library settings](/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib/) section for huge page setup instructions. -Divide this number by the huge page size (convert to bytes first) to get the number of huge pages that should be allocated. Instructions on how to get the huge page size and to set the number of pages is in the [System, Kernel, Compiler, and Libraries](/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib/) section. +Divide the buffer pool size by the huge page size to estimate the number of huge pages needed. Use the `Hugepagesize` value from `/proc/meminfo`, and allocate enough huge pages for a total huge page space equal to or slightly larger than the buffer pool. -In general, there's no need to adjust other memory parameters unless an issue is suspected/found. That said, other memory related configurations that could be worth exploring are the [Buffer Pool Prefetching](https://dev.mysql.com/doc/refman/en/innodb-performance-read_ahead.html) configurations (take this as an FYI). You may see modest performance gains by decreasing the `innodb_read_ahead_threshold` from the default. The default is very conservative and will result in very little to no prefetching. Some workloads may benefit from being less conservative with prefetching. Turning on random prefetch (`innodb_random_read_ahead`) seems to hurt performance but could benefit some user cases. The affects of these settings will be use case dependent. +{{% notice Important %}} +After restarting MySQL with `large-pages=ON`, check `/proc/meminfo` and the MySQL error log. If the huge page pool is too small, or MySQL cannot allocate huge pages for another reason, InnoDB can fall back to traditional memory and print `Warning: Using conventional memory pool.` to the MySQL error log. You might also see an allocation warning similar to `large_page_aligned_alloc mmap(... bytes) failed; errno 12`. +{{% /notice %}} + +You don't usually need to change other memory parameters unless you observe a specific issue. One optional area to test is [InnoDB buffer pool prefetching](https://dev.mysql.com/doc/refman/en/innodb-performance-read_ahead.html). Lowering [`innodb_read_ahead_threshold`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_read_ahead_threshold) from the default can help workloads with predictable sequential access patterns, while [`innodb_random_read_ahead`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_random_read_ahead) can help some workloads and hurt others. Treat these settings as workload-specific experiments. ### Disk flush behavior -``` -innodb_use_fdatasync=ON # Default is OFF prior to MySQL 8.4 +For MySQL versions earlier than 8.4, test `innodb_use_fdatasync`: + +```ini +innodb_use_fdatasync=ON ``` -Setting `innodb_use_fdatasync` to ON helps reduce the number of system calls that occur when flushing data to disk. Using `fdatasync` reduces flushing by not updating the meta data associated with files when those files are written to. For most use cases, this is acceptable. As of MySQL 8.4, this is now set to `ON` by default. If running an older version of `MySQL`, it is generally recommended to set this to `ON`. In fact, this is why it has been defaulted to `ON` in newer version of `MySQL`. +The [`innodb_use_fdatasync`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_use_fdatasync) parameter allows InnoDB to use `fdatasync()` instead of `fsync()` for operating systems and flush methods that support it. This can improve write performance because `fdatasync()` flushes file data without forcing unrelated metadata updates, such as timestamps to disk. Metadata required to retrieve the data is still flushed. In MySQL 8.4, this setting defaults to `ON`. -### Concurrency configuration +### Transaction durability settings -Increasing parallelism uses available resources more efficiently. It's always a good idea to look at parameters related to parallel execution. +Use the following settings when transaction durability and consistency are required (these are the default in MySQL 8.4+): +```ini +sync_binlog=1 +innodb_flush_log_at_trx_commit=1 ``` -innodb_io_capacity=10000 # Default is 200 prior to MySQL 8.4 and 10000 from 8.4 -innodb_io_capacity_max=20000 # Default is 2x innodb_io_capacity + +The [`sync_binlog`](https://dev.mysql.com/doc/refman/en/replication-options-binary-log.html#sysvar_sync_binlog) parameter controls how often MySQL synchronizes the binary log to disk. The [`innodb_flush_log_at_trx_commit`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit) parameter controls how InnoDB writes and flushes redo log records at transaction commit. + +When both settings are `1`, MySQL prioritizes transaction durability over peak write throughput. Relaxing either setting can reduce how often transactions wait for binary log and redo log data to be flushed to durable storage. This can improve parallel transaction execution and write throughput, especially on write-heavy workloads, but it increases the time window where committed transactions exist only in memory or operating system cache. + +{{% notice Warning %}} +Changing `sync_binlog` or `innodb_flush_log_at_trx_commit` away from `1` trades away transaction durability, which is part of ACID compliance. Values such as `sync_binlog=0`, `sync_binlog=N` where `N` is greater than `1`, or `innodb_flush_log_at_trx_commit=0` or `2` can lose committed transactions during a power failure, operating system crash, or unexpected MySQL exit. Change these settings only when your application and recovery process can tolerate potential transaction loss. +{{% /notice %}} + +### I/O capacity configuration + +Increasing parallelism can help InnoDB use available storage resources more efficiently. For older MySQL versions on SSD-backed or cloud storage, test values similar to the MySQL 8.4 defaults: + +```ini +innodb_io_capacity=10000 +innodb_io_capacity_max=20000 ``` -`innodb_io_capacity` tells the `InnoDB` storage engine how many IOPS it can issue to storage. Prior to `MySQL` 8.4, the default was 200 which is very low and more appropriate for rotational storage. Modern SSD storage and even cloud based storage can benefit greatly from increasing this value. As of `MySQL` 8.4, the default value has been increased to 10000. If you are using an older version of `MySQL` where this is defaulted to 200, it might benefit you to set this to 10000. See the [MySQL InnoDB I/O Capacity documentation](https://dev.mysql.com/doc/refman/en/innodb-configuring-io-capacity.html) for more. +The [`innodb_io_capacity`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_io_capacity) parameter tells InnoDB how many I/O operations per second it can issue to storage for background work. Before MySQL 8.4, the default was `200`, which is often too low for modern SSD and cloud storage. In MySQL 8.4, the default is `10000`. -`innodb_io_capacity_max` defaults to 2x of `innodb_io_capacity`. This should be ok for most use cases. +The [`innodb_io_capacity_max`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_io_capacity_max) parameter provides a higher limit for bursts of background work. It defaults to `2x` `innodb_io_capacity`. Use that relationship as a starting point, then adjust the values based on storage capability and measured performance. ### Spin lock configuration -``` -innodb_sync_spin_loops=120 # Default is 30 +Use the following setting as a starting point for testing lock polling behavior: + +```ini +innodb_sync_spin_loops=30 ``` -You should experiment with the `innodb_sync_spin_loops` parameter. This sets the number of times a thread checks for an `InnoDB` lock to be free before yielding execution to another thread. +The [`innodb_sync_spin_loops`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_sync_spin_loops) parameter controls how many times a thread checks whether an InnoDB mutex is free before yielding execution to another thread. -Profiling `MySQL` under heavy load on Arm with Linux `perf` shows that `MySQL` spends a lot of time waiting for locks to be freed. Experimenting with tuning parameters around locks might help. Increasing the number of times a lock is checked before the thread yields can reduce context switching. This reduction in context switching tends to increase performance. Start with a value of 120 for `innodb_sync_spin_loops`, but you can also try values such as 30, 60, 180, and 240. See the [Configuring Spin Lock Polling](https://dev.mysql.com/doc/refman/en/innodb-performance-spin_lock_polling.html) for more. \ No newline at end of file +Profiling MySQL under heavy load on Arm with Linux `perf` can show time spent waiting for locks. Increasing `innodb_sync_spin_loops` can reduce context switching when locks are released quickly, but setting it too high can waste power and delay other useful work. Keep the default value, `30`, unless profiling and measured performance show that a different value helps. For more information, see the MySQL [Configuring Spin Lock Polling documentation](https://dev.mysql.com/doc/refman/en/innodb-performance-spin_lock_polling.html). From e7313e6b4007b096cdcf54aec1b371243636e6a3 Mon Sep 17 00:00:00 2001 From: Julio Suarez Date: Fri, 26 Jun 2026 15:20:38 -0500 Subject: [PATCH 131/137] Rename MySQL tuning image --- .../mysql_tune/before_and_after.md | 2 +- .../mysql_tune/{OOBvsTuned.png => oobvstuned.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename content/learning-paths/servers-and-cloud-computing/mysql_tune/{OOBvsTuned.png => oobvstuned.png} (100%) diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md index b60a476b86..d8e0e829a4 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md @@ -23,7 +23,7 @@ Improved performance can give you higher throughput, lower latency, or better co The following example shows MySQL throughput with HammerDB TPROC-C before and after tuning on an Arm Neoverse V3 system. -![Bar chart comparing MySQL HammerDB TPROC-C normalized NOPM throughput before and after tuning on an Arm Neoverse V3 system. At 128 clients, the out-of-box configuration is 1.00 and the tuned configuration is 15.37.#center](OOBvsTuned.png "MySQL HammerDB TPROC-C throughput before and after tuning") +![Bar chart comparing MySQL HammerDB TPROC-C normalized NOPM throughput before and after tuning on an Arm Neoverse V3 system. At 128 clients, the out-of-box configuration is 1.00 and the tuned configuration is 15.37.#center](oobvstuned.png "MySQL HammerDB TPROC-C throughput before and after tuning") This benchmark result is an example, not a guaranteed improvement for every workload. Your results depend on the MySQL version, database size, storage device, memory capacity, client thread count, and the queries used in the test. diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/OOBvsTuned.png b/content/learning-paths/servers-and-cloud-computing/mysql_tune/oobvstuned.png similarity index 100% rename from content/learning-paths/servers-and-cloud-computing/mysql_tune/OOBvsTuned.png rename to content/learning-paths/servers-and-cloud-computing/mysql_tune/oobvstuned.png From a1393cbcdbb58291527a731796a2fb4a0f182ba4 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 16:13:18 -0500 Subject: [PATCH 132/137] first pass edits --- .../mysql_tune/before_and_after.md | 10 +++++-- .../mysql_tune/kernel_comp_lib.md | 28 +++++++++++-------- .../mysql_tune/tuning.md | 22 ++++++++++----- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md index d8e0e829a4..4d1863c904 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/before_and_after.md @@ -1,5 +1,5 @@ --- -title: "Measure MySQL tuning impact" +title: Measure the impact of tuning MySQL description: Learn how to approach MySQL performance tuning as a measurement-driven process and compare baseline results with tuned results. weight: 2 layout: "learningpathall" @@ -15,7 +15,7 @@ Whatever method you use, keep the measurements repeatable. Record the system con ## Why tune MySQL -MySQL performance can be limited by memory usage, disk I/O, connection handling, concurrency, or synchronization overhead. Tuning helps you use the available compute, memory, and storage resources more efficiently. +MySQL performance can be limited by memory usage, disk I/O, connection handling, concurrency, or synchronization overhead. By tuning MySQL, you can use the available compute, memory, and storage resources more efficiently. Improved performance can give you higher throughput, lower latency, or better cost efficiency. A tuned configuration can increase capacity on the same system, or help you meet the same performance target with fewer compute resources. @@ -30,3 +30,9 @@ This benchmark result is an example, not a guaranteed improvement for every work {{% notice Note %}} Links to MySQL documentation in this Learning Path point to the latest version of the documentation. If you use an older version of MySQL, select the matching documentation version after opening the links. {{% /notice %}} + +## What you've learned and what's next + +You've now learned why tuning MySQL is beneficial, and reviewed an example benchmark result demonstrating improvement in throughput after tuning. + +Next, you'll learn about different system parameters that you can tune for performance. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md index 2cacd23636..212d02950c 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md @@ -1,6 +1,6 @@ --- # User change -title: "Tune system, kernel, compiler, and library settings" +title: Tune storage, kernel, compiler, and library settings for performance description: Learn how storage, kernel page size, Linux huge pages, compiler settings, and OpenSSL choices can affect MySQL performance on Arm-based systems. weight: 3 # 1 is first, 2 is second, etc. @@ -11,9 +11,9 @@ layout: "learningpathall" ## Tune the system around MySQL -MySQL configuration is only one part of performance tuning. Operating system settings, storage behavior, kernel memory management, compiler choices, and library versions can also affect throughput and latency. This section highlights system-level areas to check before or alongside MySQL-specific tuning. +MySQL configuration is only one part of performance tuning. Operating system settings, storage behavior, kernel memory management, compiler choices, and library versions can also affect throughput and latency. The following are system-level areas to check before or alongside MySQL-specific tuning. -## Storage technology, file systems, and disk scheduling +### Storage technology, file systems, and disk scheduling Storage technology and file system choices can affect performance. In general, locally attached SSD storage performs best, but network-based storage systems can also perform well. Test the storage technologies and configuration options available in your environment. @@ -21,17 +21,17 @@ The file system used with MySQL can also affect performance. The `xfs` file syst When running in the cloud, the disk scheduling algorithm is typically set to `noop` or a similar minimal scheduler. This is usually a good setting for MySQL in cloud environments, so no adjustment is needed. If you run MySQL on an on-premises server, double-check the disk scheduling algorithm and test alternatives. According to the [Optimizing InnoDB Disk I/O documentation](https://dev.mysql.com/doc/refman/en/optimizing-innodb-diskio.html), `noop` or `deadline` might be better options for some systems. -## MySQL storage engines +### MySQL storage engines MySQL supports different storage engines. The default storage engine is `InnoDB`, which performs best across the broadest set of use cases. Information on alternative storage engines can be found in the [MySQL documentation](https://dev.mysql.com/doc/refman/en/storage-engines.html). -## Kernel configuration +### Kernel configuration MySQL can benefit from adjustments to kernel parameters. The following kernel-related settings can have a positive impact on performance. -### Linux virtual memory subsystem +#### Linux virtual memory subsystem Making changes to the Linux virtual memory subsystem can improve performance. @@ -45,9 +45,9 @@ To list all sysctl parameters available: sudo sysctl -a ``` -See the `sysctl` command documentation for more. +For more information, see the `sysctl` command documentation. -### Consider 64 KB kernel pages on Arm +#### Consider 64 KB kernel pages on Arm Some Arm Linux distributions provide kernels built with `64 KB` base pages instead of `4 KB` base pages. This is a kernel selection or build-time choice, not a `sysctl` setting you can change on a running system. @@ -116,7 +116,7 @@ echo "vm.nr_hugepages=512" | sudo tee /etc/sysctl.d/99-mysql-hugepages.conf sudo sysctl --system ``` -### Selecting the number of huge pages to use +#### Selecting the number of huge pages to use If huge pages improve your workload, set `vm.nr_hugepages` to a value that gives a total huge page space equal to or slightly larger than the InnoDB buffer pool size, which is controlled by `innodb_buffer_pool_size`. @@ -128,12 +128,18 @@ Selecting the buffer pool size is discussed in the [Tuning MySQL](/learning-path Typically, only the number of huge pages needs to be configured. However, for more information on the different parameters that affect the configuration of huge pages, review the [admin-guide for hugetlbpage in the Linux source code](https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/mm/hugetlbpage.rst). -## Compiler considerations +### Compiler considerations If you build MySQL from source, the compiler version and optimization flags can affect performance. Use a recent version of GCC, and consider flags such as `-mcpu` and `-flto` for additional optimization. These flags are explained in the [Migrating C/C++ applications](/learning-paths/servers-and-cloud-computing/migration/c/) section of the [Migrating applications to Arm servers](/learning-paths/servers-and-cloud-computing/migration/) Learning Path. -## OpenSSL considerations +### OpenSSL considerations MySQL relies on [OpenSSL](https://www.openssl.org/) for cryptographic operations. The OpenSSL version used with MySQL, and the compiler version and switches used to build it, can affect performance. The default OpenSSL version provided by your Linux distribution is typically sufficient. If you build MySQL from source, you can also build and install a newer version of OpenSSL before building MySQL. This might improve performance for workloads that spend significant time in cryptographic operations. + +## What you've learned and what's next + +You've now explored enhancements you can make at the system-level related to storage, memory pages, compiler flags, and OpenSSL to improve MySQL performance on Arm. + +Next, you'll learn about specific MySQL parameters that you can tune for performance. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md index c43265f903..90c43f648c 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md @@ -1,6 +1,6 @@ --- # User change -title: "Tune MySQL configuration" +title: Tune MySQL configuration for performance description: Learn how to tune MySQL server parameters for connections, memory, disk flushing, transaction durability, I/O capacity, and lock polling. weight: 4 # 1 is first, 2 is second, etc. @@ -9,15 +9,17 @@ weight: 4 # 1 is first, 2 is second, etc. layout: "learningpathall" --- -## MySQL configuration +## Update MySQL parameters You can set MySQL server configuration parameters in an option file or on the `mysqld` command line. -For persistent tuning, use an option file so the configuration can be reviewed, version controlled, and applied consistently when MySQL restarts. For more information, see the MySQL [Specifying Program Options documentation](https://dev.mysql.com/doc/refman/en/program-options.html). +For persistent tuning, use an option file so the configuration can be reviewed, version controlled, and applied consistently when MySQL restarts. For more information, see [Specifying Program Options](https://dev.mysql.com/doc/refman/en/program-options.html) in MySQL documentation. The examples in this section are intended for the `[mysqld]` group in a MySQL option file. +{{% notice Note %}} In general, leave most MySQL settings at their defaults and change them only when you have a workload requirement, test result, profile, or observed bottleneck that supports the change. +{{% /notice %}} ### Connections and prepared statements @@ -35,7 +37,7 @@ The [`max_prepared_stmt_count`](https://dev.mysql.com/doc/refman/en/server-syste ### Dedicated server configuration -If the system only runs MySQL, enable the dedicated server setting: +If the system runs only MySQL, enable the dedicated server setting: ```ini innodb_dedicated_server=ON @@ -91,7 +93,7 @@ innodb_dedicated_server=ON innodb_redo_log_capacity=32G ``` -The [`innodb_redo_log_capacity`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_redo_log_capacity) parameter controls the amount of disk space used for redo log files. It was introduced in MySQL 8.0.30. In earlier MySQL versions, [`innodb_log_file_size`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_file_size) and [`innodb_log_files_in_group`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_files_in_group) control redo log size and behavior. +The [`innodb_redo_log_capacity`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_redo_log_capacity) parameter controls the amount of disk space used for redo log files. It was introduced in MySQL `8.0.30`. In earlier MySQL versions, [`innodb_log_file_size`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_file_size) and [`innodb_log_files_in_group`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_files_in_group) control redo log size and behavior. The auto-sized `innodb_redo_log_capacity` value is a starting point. Increasing it can improve write-heavy workloads by giving InnoDB more redo log space before checkpoints limit write throughput. An explicit `innodb_redo_log_capacity` value overrides the value calculated by `innodb_dedicated_server` for that variable, while still allowing `innodb_dedicated_server` to size other settings such as `innodb_buffer_pool_size`. When you override one of the automatically configured variables, MySQL prints a startup warning such as `Option innodb_dedicated_server is ignored for innodb_redo_log_capacity`. That warning is expected for the overridden variable. @@ -107,12 +109,12 @@ large-pages=ON Turning on [`large-pages`](https://dev.mysql.com/doc/refman/en/server-system-variables.html#sysvar_large_pages) can improve performance when MySQL uses a large InnoDB buffer pool. Larger pages map more memory per translation entry, which can reduce page-table walks and TLB pressure. -Huge pages must also be configured at the Linux kernel level. See the [system, kernel, compiler, and library settings](/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib/) section for huge page setup instructions. +Huge pages must also be configured at the Linux kernel level. For huge page setup instructions, see the [system, kernel, compiler, and library settings](/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib/) section of this Learning Path. Divide the buffer pool size by the huge page size to estimate the number of huge pages needed. Use the `Hugepagesize` value from `/proc/meminfo`, and allocate enough huge pages for a total huge page space equal to or slightly larger than the buffer pool. {{% notice Important %}} -After restarting MySQL with `large-pages=ON`, check `/proc/meminfo` and the MySQL error log. If the huge page pool is too small, or MySQL cannot allocate huge pages for another reason, InnoDB can fall back to traditional memory and print `Warning: Using conventional memory pool.` to the MySQL error log. You might also see an allocation warning similar to `large_page_aligned_alloc mmap(... bytes) failed; errno 12`. +After restarting MySQL with `large-pages=ON`, check `/proc/meminfo` and the MySQL error log. If the huge page pool is too small, or MySQL can't allocate huge pages for another reason, InnoDB can fall back to traditional memory and print `Warning: Using conventional memory pool.` to the MySQL error log. You might also see an allocation warning similar to `large_page_aligned_alloc mmap(... bytes) failed; errno 12`. {{% /notice %}} You don't usually need to change other memory parameters unless you observe a specific issue. One optional area to test is [InnoDB buffer pool prefetching](https://dev.mysql.com/doc/refman/en/innodb-performance-read_ahead.html). Lowering [`innodb_read_ahead_threshold`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_read_ahead_threshold) from the default can help workloads with predictable sequential access patterns, while [`innodb_random_read_ahead`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_random_read_ahead) can help some workloads and hurt others. Treat these settings as workload-specific experiments. @@ -168,3 +170,9 @@ innodb_sync_spin_loops=30 The [`innodb_sync_spin_loops`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_sync_spin_loops) parameter controls how many times a thread checks whether an InnoDB mutex is free before yielding execution to another thread. Profiling MySQL under heavy load on Arm with Linux `perf` can show time spent waiting for locks. Increasing `innodb_sync_spin_loops` can reduce context switching when locks are released quickly, but setting it too high can waste power and delay other useful work. Keep the default value, `30`, unless profiling and measured performance show that a different value helps. For more information, see the MySQL [Configuring Spin Lock Polling documentation](https://dev.mysql.com/doc/refman/en/innodb-performance-spin_lock_polling.html). + +## What you've learned + +You've now explored various MySQL parameters you can tune for improved performance on Arm. + +You can use the guidance in this Learning Path to optimize the performance of your MySQL databases. From b96db6755efd9378ca1b0309c3bea388cdf55e05 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 16:28:13 -0500 Subject: [PATCH 133/137] second pass --- .../mysql_tune/kernel_comp_lib.md | 18 ++++++------ .../mysql_tune/tuning.md | 28 +++++++++++++------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md index 212d02950c..5a140cf703 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/kernel_comp_lib.md @@ -19,17 +19,19 @@ Storage technology and file system choices can affect performance. In general, l The file system used with MySQL can also affect performance. The `xfs` file system is a good starting point, and `ext4` is another good option. For production systems, use storage volumes dedicated to the database instead of sharing them with the operating system or other applications. -When running in the cloud, the disk scheduling algorithm is typically set to `noop` or a similar minimal scheduler. This is usually a good setting for MySQL in cloud environments, so no adjustment is needed. If you run MySQL on an on-premises server, double-check the disk scheduling algorithm and test alternatives. According to the [Optimizing InnoDB Disk I/O documentation](https://dev.mysql.com/doc/refman/en/optimizing-innodb-diskio.html), `noop` or `deadline` might be better options for some systems. +When running in the cloud, the disk scheduling algorithm is typically set to `noop` or a similar minimal scheduler. This is usually a good setting for MySQL in cloud environments, so no adjustment is needed. + +If you run MySQL on an on-premises server, double-check the disk scheduling algorithm and test alternatives. According to the [Optimizing InnoDB Disk I/O documentation](https://dev.mysql.com/doc/refman/en/optimizing-innodb-diskio.html), `noop` or `deadline` might be better options for some systems. ### MySQL storage engines MySQL supports different storage engines. The default storage engine is `InnoDB`, which performs best across the broadest set of use cases. -Information on alternative storage engines can be found in the [MySQL documentation](https://dev.mysql.com/doc/refman/en/storage-engines.html). +For more information on alternative storage engines, see the [MySQL storage engine documentation](https://dev.mysql.com/doc/refman/en/storage-engines.html). ### Kernel configuration -MySQL can benefit from adjustments to kernel parameters. The following kernel-related settings can have a positive impact on performance. +MySQL can benefit from adjustments to kernel parameters. The following kernel-related settings can improve performance. #### Linux virtual memory subsystem @@ -55,7 +57,7 @@ A `64 KB` base page can improve some memory-intensive workloads because each bas The tradeoff is memory efficiency. Larger base pages can increase internal fragmentation for workloads with many small or sparsely touched mappings, which can reduce the effective amount of memory available to the application and operating system. -The benefit is workload dependent, so compare a `4 KB` kernel and a `64 KB` kernel with the same MySQL & storage configuration. +The benefit is workload dependent, so compare a `4 KB` kernel and a `64 KB` kernel with the same MySQL and storage configuration. Base page size also affects the huge page sizes available on Arm. The common PMD-level huge page sizes are: @@ -93,11 +95,7 @@ Huge pages are not being used if `HugePages_Total` is `0` (this is typically the The `Hugepagesize` value depends on the kernel base page size and platform configuration. Use the value reported by `/proc/meminfo` when calculating `vm.nr_hugepages`. -The sysctl parameter that enables huge pages is shown below: - -```output -vm.nr_hugepages -``` +The sysctl parameter that enables huge pages is `vm.nr_hugepages`. This parameter sets the number of huge pages you want the kernel to make available to applications. @@ -140,6 +138,6 @@ If you build MySQL from source, you can also build and install a newer version o ## What you've learned and what's next -You've now explored enhancements you can make at the system-level related to storage, memory pages, compiler flags, and OpenSSL to improve MySQL performance on Arm. +You've now explored changes you can make at the system-level related to storage, memory pages, compiler flags, and OpenSSL to improve MySQL performance on Arm. Next, you'll learn about specific MySQL parameters that you can tune for performance. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md index 90c43f648c..53b5517aaf 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/tuning.md @@ -9,11 +9,11 @@ weight: 4 # 1 is first, 2 is second, etc. layout: "learningpathall" --- -## Update MySQL parameters +## Choose MySQL parameters for tuning You can set MySQL server configuration parameters in an option file or on the `mysqld` command line. -For persistent tuning, use an option file so the configuration can be reviewed, version controlled, and applied consistently when MySQL restarts. For more information, see [Specifying Program Options](https://dev.mysql.com/doc/refman/en/program-options.html) in MySQL documentation. +For persistent tuning, use an option file so the configuration can be reviewed, version controlled, and applied consistently when MySQL restarts. For more information, see the MySQL[Specifying Program Options](https://dev.mysql.com/doc/refman/en/program-options.html) documentation. The examples in this section are intended for the `[mysqld]` group in a MySQL option file. @@ -95,7 +95,11 @@ innodb_redo_log_capacity=32G The [`innodb_redo_log_capacity`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_redo_log_capacity) parameter controls the amount of disk space used for redo log files. It was introduced in MySQL `8.0.30`. In earlier MySQL versions, [`innodb_log_file_size`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_file_size) and [`innodb_log_files_in_group`](https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_log_files_in_group) control redo log size and behavior. -The auto-sized `innodb_redo_log_capacity` value is a starting point. Increasing it can improve write-heavy workloads by giving InnoDB more redo log space before checkpoints limit write throughput. An explicit `innodb_redo_log_capacity` value overrides the value calculated by `innodb_dedicated_server` for that variable, while still allowing `innodb_dedicated_server` to size other settings such as `innodb_buffer_pool_size`. When you override one of the automatically configured variables, MySQL prints a startup warning such as `Option innodb_dedicated_server is ignored for innodb_redo_log_capacity`. That warning is expected for the overridden variable. +The auto-sized `innodb_redo_log_capacity` value is a starting point. Increasing it can improve write-heavy workloads by giving InnoDB more redo log space before checkpoints limit write throughput. An explicit `innodb_redo_log_capacity` value overrides the value calculated by `innodb_dedicated_server` for that variable, while still allowing `innodb_dedicated_server` to size other settings such as `innodb_buffer_pool_size`. + +{{% notice Note %}} +When you override one of the automatically configured variables, MySQL prints a startup warning such as `Option innodb_dedicated_server is ignored for innodb_redo_log_capacity`. That warning is expected for the overridden variable. +{{% /notice %}} Larger redo logs use more disk space and can increase crash recovery time, so test values against both performance and operational requirements. @@ -114,7 +118,9 @@ Huge pages must also be configured at the Linux kernel level. For huge page setu Divide the buffer pool size by the huge page size to estimate the number of huge pages needed. Use the `Hugepagesize` value from `/proc/meminfo`, and allocate enough huge pages for a total huge page space equal to or slightly larger than the buffer pool. {{% notice Important %}} -After restarting MySQL with `large-pages=ON`, check `/proc/meminfo` and the MySQL error log. If the huge page pool is too small, or MySQL can't allocate huge pages for another reason, InnoDB can fall back to traditional memory and print `Warning: Using conventional memory pool.` to the MySQL error log. You might also see an allocation warning similar to `large_page_aligned_alloc mmap(... bytes) failed; errno 12`. +After restarting MySQL with `large-pages=ON`, check `/proc/meminfo` and the MySQL error log. If the huge page pool is too small, or MySQL can't allocate huge pages for another reason, InnoDB can fall back to traditional memory and print `Warning: Using conventional memory pool.` to the MySQL error log. + +You might also see an allocation warning similar to `large_page_aligned_alloc mmap(... bytes) failed; errno 12`. {{% /notice %}} You don't usually need to change other memory parameters unless you observe a specific issue. One optional area to test is [InnoDB buffer pool prefetching](https://dev.mysql.com/doc/refman/en/innodb-performance-read_ahead.html). Lowering [`innodb_read_ahead_threshold`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_read_ahead_threshold) from the default can help workloads with predictable sequential access patterns, while [`innodb_random_read_ahead`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_random_read_ahead) can help some workloads and hurt others. Treat these settings as workload-specific experiments. @@ -138,12 +144,18 @@ sync_binlog=1 innodb_flush_log_at_trx_commit=1 ``` -The [`sync_binlog`](https://dev.mysql.com/doc/refman/en/replication-options-binary-log.html#sysvar_sync_binlog) parameter controls how often MySQL synchronizes the binary log to disk. The [`innodb_flush_log_at_trx_commit`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit) parameter controls how InnoDB writes and flushes redo log records at transaction commit. +The [`sync_binlog`](https://dev.mysql.com/doc/refman/en/replication-options-binary-log.html#sysvar_sync_binlog) parameter controls how often MySQL synchronizes the binary log to disk. + +The [`innodb_flush_log_at_trx_commit`](https://dev.mysql.com/doc/refman/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit) parameter controls how InnoDB writes and flushes redo log records at transaction commit. When both settings are `1`, MySQL prioritizes transaction durability over peak write throughput. Relaxing either setting can reduce how often transactions wait for binary log and redo log data to be flushed to durable storage. This can improve parallel transaction execution and write throughput, especially on write-heavy workloads, but it increases the time window where committed transactions exist only in memory or operating system cache. {{% notice Warning %}} -Changing `sync_binlog` or `innodb_flush_log_at_trx_commit` away from `1` trades away transaction durability, which is part of ACID compliance. Values such as `sync_binlog=0`, `sync_binlog=N` where `N` is greater than `1`, or `innodb_flush_log_at_trx_commit=0` or `2` can lose committed transactions during a power failure, operating system crash, or unexpected MySQL exit. Change these settings only when your application and recovery process can tolerate potential transaction loss. +Changing `sync_binlog` or `innodb_flush_log_at_trx_commit` away from `1` trades away transaction durability, which is part of ACID compliance. + +Values such as `sync_binlog=0`, `sync_binlog=N` where `N` is greater than `1`, or `innodb_flush_log_at_trx_commit=0` or `2` can lose committed transactions during a power failure, operating system crash, or unexpected MySQL exit. + +Change these settings only when your application and recovery process can tolerate potential transaction loss. {{% /notice %}} ### I/O capacity configuration @@ -173,6 +185,6 @@ Profiling MySQL under heavy load on Arm with Linux `perf` can show time spent wa ## What you've learned -You've now explored various MySQL parameters you can tune for improved performance on Arm. +You've now explored various MySQL parameters you can tune for improved performance. -You can use the guidance in this Learning Path to optimize the performance of your MySQL databases. +You can use the guidance in this Learning Path to optimize the performance of your MySQL databases on Arm. From 8315c95c8d6a6fe31a7667100ca7ec299a6391b2 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 16:44:38 -0500 Subject: [PATCH 134/137] adding summary and faqs --- .../mysql_tune/_index.md | 50 ++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md index 9dfcfc421b..458dd836a2 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md @@ -15,9 +15,57 @@ prerequisites: - On-prem or cloud [installation of MySQL](https://dev.mysql.com/doc/refman/en/) - A repeatable MySQL workload or benchmark that you can run before and after tuning +# START generated_summary_faq +generated_summary_faq: + template_version: summary-faq-v3 + generated_at: '2026-06-26T21:28:59Z' + generator: ai + ai_assisted: true + ai_review_required: true + model: gpt-5 + prompt_template: summary-faq-v3 + source_hash: 19acf30951401ec15201ee8e387eb59f9248f627664bc693cf05928233bf2b6f + summary_generated_at: '2026-06-26T21:28:59Z' + summary_source_hash: 19acf30951401ec15201ee8e387eb59f9248f627664bc693cf05928233bf2b6f + faq_generated_at: '2026-06-26T21:28:59Z' + faq_source_hash: 19acf30951401ec15201ee8e387eb59f9248f627664bc693cf05928233bf2b6f + summary: >- + You'll learn how to use a measurement-driven approach to tune MySQL on Arm-based platforms. + You'll explore system factors — storage technology and file systems, + disk scheduling, kernel memory management, compiler, and library versions — that you can adjust. In addition, you'll focus on MySQL parameters related to connection + handling, memory usage, disk flush behavior, and concurrency, and learn how to enable and + size huge pages based on the InnoDB buffer pool. By the end, you'll know what parameters to update for running controlled experiments, + and be able to make persistent configuration choices aligned with your workload. + faqs: + - question: How do I know a MySQL tuning change actually helped? + answer: >- + Run the same repeatable workload before and after the change and compare throughput, latency, + and profiles. Change one parameter at a time or use a designed experiment so results are + attributable to specific settings. + - question: Should I set MySQL parameters in an option file or on the mysqld command line? + answer: >- + Use an option file for persistent tuning so changes are reviewable, version controlled, + and applied on restart. The examples target the [mysqld] group; command-line flags are suitable + for temporary tests. + - question: Which storage option should I use when testing performance? + answer: >- + In general, locally attached SSD storage performs best, but network-based storage can also + perform well. Test the storage technologies and file systems you have, and review disk scheduling + behavior with your workload. + - question: When should I look at kernel, compiler, or library choices instead of MySQL settings? + answer: >- + Evaluate them before or alongside MySQL tuning because operating system settings, kernel + memory management, compiler choices, and library versions can affect throughput and latency. + Treat them as part of the same performance experiment set. + - question: How should I size huge pages for MySQL? + answer: >- + Enable huge pages for MySQL and size them based on the InnoDB buffer pool. This aligns page + allocation with the primary memory consumer in typical MySQL deployments. +# END generated_summary_faq + author: Julio Suarez -generate_summary_faq: true +generate_summary_faq: false rerun_summary: false rerun_faqs: false From b8e8e858d5bd92c2d4f7abc2e312b692ed234ff0 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 16:46:49 -0500 Subject: [PATCH 135/137] edits --- .../servers-and-cloud-computing/mysql_tune/_index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md index 458dd836a2..5435e9f182 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md @@ -30,9 +30,9 @@ generated_summary_faq: faq_generated_at: '2026-06-26T21:28:59Z' faq_source_hash: 19acf30951401ec15201ee8e387eb59f9248f627664bc693cf05928233bf2b6f summary: >- - You'll learn how to use a measurement-driven approach to tune MySQL on Arm-based platforms. + You'll learn how to use a measurement-driven approach to tune MySQL performance on Arm-based platforms. You'll explore system factors — storage technology and file systems, - disk scheduling, kernel memory management, compiler, and library versions — that you can adjust. In addition, you'll focus on MySQL parameters related to connection + disk scheduling, kernel memory management, compiler, and library versions — that you can adjust. In addition, you'll learn about optimizable MySQL parameters related to connection handling, memory usage, disk flush behavior, and concurrency, and learn how to enable and size huge pages based on the InnoDB buffer pool. By the end, you'll know what parameters to update for running controlled experiments, and be able to make persistent configuration choices aligned with your workload. @@ -45,7 +45,7 @@ generated_summary_faq: - question: Should I set MySQL parameters in an option file or on the mysqld command line? answer: >- Use an option file for persistent tuning so changes are reviewable, version controlled, - and applied on restart. The examples target the [mysqld] group; command-line flags are suitable + and applied on restart. The examples in the Learning Path target the [mysqld] group. Command-line flags are suitable for temporary tests. - question: Which storage option should I use when testing performance? answer: >- From 874785d38a6450d4016e122bac15c643624695e0 Mon Sep 17 00:00:00 2001 From: anupras-mohapatra-arm Date: Fri, 26 Jun 2026 16:55:15 -0500 Subject: [PATCH 136/137] nit --- .../servers-and-cloud-computing/mysql_tune/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md index 5435e9f182..6baf52b3ab 100644 --- a/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/mysql_tune/_index.md @@ -42,10 +42,10 @@ generated_summary_faq: Run the same repeatable workload before and after the change and compare throughput, latency, and profiles. Change one parameter at a time or use a designed experiment so results are attributable to specific settings. - - question: Should I set MySQL parameters in an option file or on the mysqld command line? + - question: Should I set MySQL parameters in an option file or on the `mysqld` command line? answer: >- Use an option file for persistent tuning so changes are reviewable, version controlled, - and applied on restart. The examples in the Learning Path target the [mysqld] group. Command-line flags are suitable + and applied on restart. The examples in the Learning Path target the `[mysqld]` group. Command-line flags are suitable for temporary tests. - question: Which storage option should I use when testing performance? answer: >- From 57f390c41d491cc18847a70abae9c6be825029f4 Mon Sep 17 00:00:00 2001 From: Jason Andrews Date: Fri, 26 Jun 2026 17:11:45 -0500 Subject: [PATCH 137/137] Tech review of Gerrit Learning Path --- .../gerrit-on-gcp/_index.md | 10 ++++++++++ .../gerrit-on-gcp/background.md | 4 ++-- .../gerrit-on-gcp/benchmarking.md | 14 ++++++++++---- .../gerrit-on-gcp/firewall_setup.md | 2 +- .../gerrit-on-gcp/installation.md | 13 +++++++------ .../gerrit-on-gcp/instance.md | 4 ++-- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md index cbbb6ca670..b8d079fc36 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/_index.md @@ -51,6 +51,16 @@ further_reading: link: https://gerrit-review.googlesource.com/Documentation/ type: documentation + - resource: + title: Getting started with Google Cloud Platform + link: /learning-paths/servers-and-cloud-computing/csp/google/ + type: website + + - resource: + title: Gerrit 3.14 release notes + link: https://www.gerritcodereview.com/3.14.html + type: documentation + weight: 1 layout: "learningpathall" learning_path_main_page: "yes" diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md index 398b02946c..987bbb428c 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/background.md @@ -1,5 +1,5 @@ --- -title: Get started with Gerrit on Google Axion C4A +title: About Gerrit and Google Axion C4A weight: 2 @@ -20,4 +20,4 @@ Gerrit is an open-source, web-based code review system for Git repositories that To learn more, start with the official Gerrit site and documentation, especially the product overview and user guide, which explain how Gerrit fits into a development workflow and how to review, upload, and manage changes. -For more information on [Gerrit](https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough-github.html) +There is also a [Basic Gerrit Walkthrough — For GitHub Users](https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough-github.html) which explains the core principles of code review in Gerrit compared to pull requests. diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md index 6906394e20..56e9619a36 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/benchmarking.md @@ -6,9 +6,9 @@ weight: 6 layout: learningpathall --- +## Overview -## Overview -This section guides you through benchmarking basic Gerrit performance on our Axiom VM. The benchmark consists of a custom script that will exercise and time key Gerrit features/functions. +This section guides you through benchmarking basic Gerrit performance on your Axion VM. The benchmark consists of a custom script that will exercise and time key Gerrit features/functions. ## Download and Install the benchmarking script @@ -126,7 +126,7 @@ are all present: ![Charts and graphs showing the Gerrit benchmark performance summary including operation counts, success rates, and latency metrics across the four 120-second test steps.#center](images/analysis.png "Gerrit Benchmark Summary") Client-visible correctness is excellent: all 47,863 measured operations succeeded. REST query latency remains low -with p99 69 ms. Clone is the dominant pressure point at p99 521 ms, and push remains sub-second at p99 288 ms: +with a p99 of 69 ms. Clone is the dominant pressure point at a p99 of 521 ms, and push remains sub-second at a p99 of 288 ms: ![Performance metrics showing client-side operation summary with statistics for git_clone, git_push_refs_for, and rest_change_query operations, including latency percentiles and success rates.#center](images/client-summary.png "Client-side Operation Summary") @@ -146,4 +146,10 @@ Gerrit server-side correlation observations: Basic Server Metrics: -![Server metrics dashboard showing host resource utilization metrics including memory, disk I/O, and other system-level performance indicators during the benchmark run.#center](images/server-metrics.png "Basic Additional Server Metrics") \ No newline at end of file +![Server metrics dashboard showing host resource utilization metrics including memory, disk I/O, and other system-level performance indicators during the benchmark run.#center](images/server-metrics.png "Basic Additional Server Metrics") + +## What you've accomplished + +You have successfully deployed Gerrit on a Google Cloud C4A Axion Arm64 VM running Ubuntu 24.04 LTS, verified the web console, and measured its performance using a production-like benchmark profile. All operations completed with zero failures, and the results establish a practical capacity baseline for a single-node Gerrit deployment on Arm-based infrastructure. + +To build on this foundation, you can explore multi-node Gerrit deployments, tune JVM flags for the Neoverse-V2 core, or compare performance across different C4A instance sizes to find the right balance of cost and throughput for your team's workload. \ No newline at end of file diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md index 082866aef1..18038bbc32 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/firewall_setup.md @@ -8,7 +8,7 @@ layout: learningpathall ## Overview -In this section you'll learn how to create a firewall rule in Google Cloud Console to allow traffic on TCP port 8080. This step is required for the Learning Path to ensure your Gerrit deployment is accessible. +This step creates a firewall rule in Google Cloud Console to allow incoming TCP traffic on port 8080, which is required for your Gerrit deployment to be accessible. {{% notice Note %}} If you need help setting up Google Cloud Platform (GCP), see the Learning Path [Getting started with Google Cloud Platform](/learning-paths/servers-and-cloud-computing/csp/google/). diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md index 664e4ac33e..44bd30850d 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/installation.md @@ -7,23 +7,22 @@ layout: learningpathall --- ## Install Gerrit on GCP VM + This section walks you through how to install and configure Gerrit Server on a GCP Linux VM (Ubuntu 24.04 LTS based VM). To ensure a successful setup, follow each step in order and check the output after each command. This helps you catch issues early and confirms that Gerrit is installed and running correctly. ## Set up your environment + Before installing Gerrit, update the system and install the required tools: ```console -sudo apt update -sudo apt -y dist-upgrade -sudo apt install -y wget curl default-jdk git net-tools -sudo apt install -y python3-pip python3-venv python3-dev pipenv sudo apt update && sudo apt upgrade -y -sudo apt install ca-certificates curl gnupg wget -y +sudo apt install -y wget default-jdk git net-tools ``` ## Download and Setup/Install Gerrit server + Download the Gerrit server package for ARM64 architecture. ```console @@ -33,11 +32,13 @@ java -jar gerrit.war init -d ${HOME}/gerrit --dev --batch --install-all-plugins ``` ## Verify service status: + ```console ps -ef | grep Gerrit ``` You should see similar output: + ```output doug_an+ 11807 1 18 21:01 ? 00:00:14 GerritCodeReview -Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance -Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance -jar /home/doug_anson_arm_com/gerrit/bin/gerrit.war daemon -d /home/doug_anson_arm_com/gerrit --run-id=1781730091.11737 ``` @@ -74,4 +75,4 @@ You should see output similar to this: ![Gerrit web console dashboard showing the main interface with navigation menu and project/change options available.#center](images/gerrit-dashboard.png "Gerrit Dashboard") -In the next section, basic performance testing of Gerrit will be performed. +In the next section, you will benchmark Gerrit performance on your Arm VM. diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md index 9ad0850e26..79d61edef8 100644 --- a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md +++ b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/instance.md @@ -8,7 +8,7 @@ layout: learningpathall ## Overview -In this section, you will learn how to provision a Google Axion C4A Arm virtual machine on Google Cloud Platform (GCP) using the `c4a-standard-4` (4 vCPUs, 16 GB memory) machine type in the Google Cloud Console. +Provision a Google Axion C4A Arm virtual machine on Google Cloud Platform (GCP) using the `c4a-standard-4` machine type (4 vCPUs, 16 GB memory) in the Google Cloud Console. {{% notice Note %}} For support on GCP setup, see the Learning Path [Getting started with Google Cloud Platform](/learning-paths/servers-and-cloud-computing/csp/google/). @@ -46,4 +46,4 @@ A window from your browser should come up and you should now see a shell into yo ![Browser-based terminal window showing an active shell session on the Ubuntu VM instance. The command prompt is ready for input. This demonstrates successful connection to your C4A Arm virtual machine on Google Cloud.#center](images/gcp-shell.png "Terminal shell in your VM instance") -Next, let's install Gerrit! +You are now ready to install Gerrit.

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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-port.png b/content/learning-paths/servers-and-cloud-computing/gerrit-on-gcp/images/network-port.png new file mode 100644 index 0000000000000000000000000000000000000000..03e276b13a382b2672107c774412a2831738209d GIT binary patch literal 219019 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 z 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

Xq!Xn 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