elswa-dev commited on
Commit
f4d6f51
·
verified ·
1 Parent(s): 1959180

Upload simple_grpo_fine_tune_course.ipynb

Browse files
Files changed (1) hide show
  1. simple_grpo_fine_tune_course.ipynb +534 -0
simple_grpo_fine_tune_course.ipynb ADDED
@@ -0,0 +1,534 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "source": [
6
+ "###Simple GRPO Fine-Tuning Course\n",
7
+ "In this simple example, we're going to fine-tune a large language model using GRPO (Group Relative Policy Optimization) from scratch.\n",
8
+ "\n",
9
+ "This notebook is part of the Simple GRPO Fine-Tuning Course, a free course designed for beginners, where you learn to fine-tune language models using the GRPO technique."
10
+ ],
11
+ "metadata": {
12
+ "id": "6S4koaD7fOLo"
13
+ }
14
+ },
15
+ {
16
+ "cell_type": "markdown",
17
+ "source": [
18
+ "![Easy Fine-Tune LLMs with GRPO - li_back.svg](data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiIHN0YW5kYWxvbmU9InllcyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHdpZHRoPSIxMTA2IiBoZWlnaHQ9IjU3MCIgdmlld0JveD0iMCAwIDExMDYgNTcwIiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTpub25lO2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2UtbWl0ZXJsaW1pdDoxLjU7IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxzdHlsZSBjbGFzcz0idGV4dC1mb250LXN0eWxlIGZvbnRJbXBvcnRzIiBkYXRhLWZvbnQtZmFtaWx5PSJTaGFudGVsbCBTYW5zIj5AaW1wb3J0IHVybCgnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3MyP2ZhbWlseT1TaGFudGVsbCtTYW5zOndnaHRAMzAwLi44MDAmYW1wO2Rpc3BsYXk9YmxvY2snKTs8L3N0eWxlPjxyZWN0IGlkPSIiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMTA2IiBoZWlnaHQ9IjU2OS42MTQiIHN0eWxlPSJmaWxsOiAjZmZmZmZmOyI+PC9yZWN0PjxnIGlkPSJpdGVtcyIgc3R5bGU9Imlzb2xhdGlvbjogaXNvbGF0ZSI+PGcgaWQ9ImJsZW5kIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI+PGcgaWQ9Imctcm9vdC10Zl8xNDFxcmtmMWMxb3N1Yy1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii02MjY2NDYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC05LCAtOSkiPjxnIGlkPSJ0Zl8xNDFxcmtmMWMxb3N1Yy1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiNmZmZmZmYiPjxnPjxwYXRoIGQ9Ik0gMTAgMTBMIDExMTQgMTBMIDExMTQgNTc3LjYxTCAxMCA1NzcuNjFaIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC03LmN1X3N5XzFjendteGIxYnJ3OGF4LWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzUyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTUuMjY0MzQzMjYxNzE4NzUsIDQ0Ny44MTk0NTgwMDc4MTI1KSI+PGcgaWQ9IjcuY3Vfc3lfMWN6d214YjFicnc4YXgtZmlsbCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmZlNGNiIj48Zz48cGF0aCBkPSJNIDEyNy4zMzY5NzcgMjAuMjMyMkMgMTI2LjU0Mzk3NyAyOS43MTA4IDk4LjM5NzE3NyAzNC40MTY0IDY5LjkwOTc3NyAzOS42NTA5QyA0OC43MTE4NzcgNDMuNTQ2IDI5LjM1Nzk3NyA0NS4yODggMjEuNzQ1NTc3IDQ3LjAxMzZDIDE1LjUwMjQ3NyA0OC40Mjg4IDkuNDcxMzc3IDUyLjgyODYgMTAuMDM2ODc3IDYxLjYyOUMgMTAuMzgxMDc3IDY2Ljk4NjggMTMuNzAzNDc3IDcxLjQwNDYgMjEuNzQ1NTc3IDcyLjAzNUMgMzEuNDM3Mzc3IDcyLjc5NDggNDguMTA0MDc3IDY5LjkzMDMgNzUuMjI5Mjc3IDY1LjI0MkMgMTIzLjk5ODk3NyA1Ni44MTI0IDE0MC45MDI5NzcgNDguMzc1MSAxNDAuOTAyOTc3IDMxLjUwODRDIDE0MC45MDI5NzcgMjAuMjMyMiAxMjUuNTUzOTc3IDEyLjI4MSAxMTguNjc2OTc3IDEwQyAxMjIuODQ0OTc3IDExLjY2MzMgMTI3LjgxMDk3NyAxNC41NjIgMTI3LjMzNjk3NyAyMC4yMzIyWiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtNy5jdV8xX3N5XzE4azM0c3YxYnJ3OTM2LWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzUwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTcuOTYwMDUyNDkwMjM0NCwgNDQxLjU0NjI2NDY0ODQzNzUpIj48ZyBpZD0iNy5jdV8xX3N5XzE4azM0c3YxYnJ3OTM2LWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iI2ZmZTRjYiI+PGc+PHBhdGggZD0iTSAzOC4wMDc2IDI3LjE3NzFDIDE2Ljk3NTcgMjQuMDM5MiAxMC45MDI5IDE4LjU1MzcgMTAgMTcuNTMxM0MgMTEuODc0MyAxOS41MTcxIDE0Ljc5MjIgMjAuODc3MSAxOS4wMDMzIDIxLjIwNTNDIDI4LjcwMTQgMjEuOTYxMSA0NS4zNzkgMTkuMTExMyA3Mi41MjIgMTQuNDQ2OUMgODEuMDU5MyAxMi45Nzk4IDg4LjYyMDcgMTEuNTEyNCA5NS4yODY0IDEwQyAxMDIuNTQ0NSAxMi4xODQgMTEwLjM0MSAxMy41Njk1IDExNy4zNTIgMTYuODExQyAxMjAuMzM5IDE4LjIzNzEgMTI0LjgxMyAyMC44OTMgMTI0LjY4NiAyNi4wMTQ4QyAxMjQuNTM4IDMxLjk4OTMgMTE0LjY2IDM1Ljc1MzcgMTAyLjAwMDkgMzguOTQ1MkMgMTAxLjY3NTcgMzguODMxMiAxMDAuMzA0NCAzOC4yODQ0IDk5Ljk5NzMgMzguMTcxM0MgOTIuMzA1MSAzNS4yNzgxIDY1LjE1NjQgMzEuMjI3NiAzOC4wMDc2IDI3LjE3NzFaIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC02LmN1X3N5X3pwMmxuMzFicnc2cTMtZmlsbCIgZGF0YS1pdGVtLW9yZGVyPSItNTU3NDYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NS4yNjQzNDMyNjE3MTg3NSwgMzkwLjc5NDMxMTUyMzQzNzUpIj48ZyBpZD0iNi5jdV9zeV96cDJsbjMxYnJ3NnEzLWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iI2Y1ZTBmZiI+PGc+PHBhdGggZD0iTSAxMjcuMzM2OTc3IDIwLjIzMjJDIDEyNi41NDM5NzcgMjkuNzEwOCA5OC4zOTcxNzcgMzQuNDE2NCA2OS45MDk3NzcgMzkuNjUwOUMgNDguNzExODc3IDQzLjU0NiAyOS4zNTc5NzcgNDUuMjg4IDIxLjc0NTU3NyA0Ny4wMTM2QyAxNS41MDI0NzcgNDguNDI4OCA5LjQ3MTM3NyA1Mi44Mjg2IDEwLjAzNjg3NyA2MS42MjlDIDEwLjM4MTA3NyA2Ni45ODY4IDEzLjcwMzQ3NyA3MS40MDQ2IDIxLjc0NTU3NyA3Mi4wMzVDIDMxLjQzNzM3NyA3Mi43OTQ4IDQ4LjEwNDA3NyA2OS45MzAzIDc1LjIyOTI3NyA2NS4yNDJDIDEyMy45OTg5NzcgNTYuODEyNCAxNDAuOTAyOTc3IDQ4LjM3NTEgMTQwLjkwMjk3NyAzMS41MDg0QyAxNDAuOTAyOTc3IDIwLjIzMjIgMTI1LjU1Mzk3NyAxMi4yODEgMTE4LjY3Njk3NyAxMEMgMTIyLjg0NDk3NyAxMS42NjMzIDEyNy44MTA5NzcgMTQuNTYyIDEyNy4zMzY5NzcgMjAuMjMyMloiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTYuY3VfMV9zeV92OTkzaW4xYnJ3N2ljLWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzQ0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTcuOTYwMDUyNDkwMjM0NCwgMzg0LjUyMTg1MDU4NTkzNzUpIj48ZyBpZD0iNi5jdV8xX3N5X3Y5OTNpbjFicnc3aWMtZmlsbCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZjVlMGZmIj48Zz48cGF0aCBkPSJNIDM4LjAwNzYgMjcuMTc3MUMgMTYuOTc1NyAyNC4wMzkyIDEwLjkwMjkgMTguNTUzNyAxMCAxNy41MzEzQyAxMS44NzQzIDE5LjUxNzEgMTQuNzkyMiAyMC44NzcxIDE5LjAwMzMgMjEuMjA1M0MgMjguNzAxNCAyMS45NjExIDQ1LjM3OSAxOS4xMTEzIDcyLjUyMiAxNC40NDY5QyA4MS4wNTkzIDEyLjk3OTggODguNjIwNyAxMS41MTI0IDk1LjI4NjQgMTBDIDEwMi41NDQ1IDEyLjE4NCAxMTAuMzQxIDEzLjU2OTUgMTE3LjM1MiAxNi44MTFDIDEyMC4zMzkgMTguMjM3MSAxMjQuODEzIDIwLjg5MyAxMjQuNjg2IDI2LjAxNDhDIDEyNC41MzggMzEuOTg5MyAxMTQuNjYgMzUuNzUzNyAxMDIuMDAwOSAzOC45NDUyQyAxMDEuNjc1NyAzOC44MzEyIDEwMC4zMDQ0IDM4LjI4NDQgOTkuOTk3MyAzOC4xNzEzQyA5Mi4zMDUxIDM1LjI3ODEgNjUuMTU2NCAzMS4yMjc2IDM4LjAwNzYgMjcuMTc3MVoiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTUuY3Vfc3lfbWRtMzlyMWJydzhiMS1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTc0MCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAzMzMuNzcwMTQxNjAxNTYyNSkiPjxnIGlkPSI1LmN1X3N5X21kbTM5cjFicnc4YjEtZmlsbCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZmZkN2VmIj48Zz48cGF0aCBkPSJNIDEyNy4zMzY5NzcgMjAuMjMyMkMgMTI2LjU0Mzk3NyAyOS43MTA4IDk4LjM5NzE3NyAzNC40MTY0IDY5LjkwOTc3NyAzOS42NTA5QyA0OC43MTE4NzcgNDMuNTQ2IDI5LjM1Nzk3NyA0NS4yODggMjEuNzQ1NTc3IDQ3LjAxMzZDIDE1LjUwMjQ3NyA0OC40Mjg4IDkuNDcxMzc3IDUyLjgyODYgMTAuMDM2ODc3IDYxLjYyOUMgMTAuMzgxMDc3IDY2Ljk4NjggMTMuNzAzNDc3IDcxLjQwNDYgMjEuNzQ1NTc3IDcyLjAzNUMgMzEuNDM3Mzc3IDcyLjc5NDggNDguMTA0MDc3IDY5LjkzMDMgNzUuMjI5Mjc3IDY1LjI0MkMgMTIzLjk5ODk3NyA1Ni44MTI0IDE0MC45MDI5NzcgNDguMzc1MSAxNDAuOTAyOTc3IDMxLjUwODRDIDE0MC45MDI5NzcgMjAuMjMyMiAxMjUuNTUzOTc3IDEyLjI4MSAxMTguNjc2OTc3IDEwQyAxMjIuODQ0OTc3IDExLjY2MzMgMTI3LjgxMDk3NyAxNC41NjIgMTI3LjMzNjk3NyAyMC4yMzIyWiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtNS5jdV8xX3N5X2h4c2w1YjFicnc5M2EtZmlsbCIgZGF0YS1pdGVtLW9yZGVyPSItNTU3MzgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1Ny45NjAwNTI0OTAyMzQ0LCAzMjcuNDk3MTkyMzgyODEyNSkiPjxnIGlkPSI1LmN1XzFfc3lfaHhzbDViMWJydzkzYS1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiNmZmQ3ZWYiPjxnPjxwYXRoIGQ9Ik0gMzguMDA3NiAyNy4xNzcxQyAxNi45NzU3IDI0LjAzOTIgMTAuOTAyOSAxOC41NTM3IDEwIDE3LjUzMTNDIDExLjg3NDMgMTkuNTE3MSAxNC43OTIyIDIwLjg3NzEgMTkuMDAzMyAyMS4yMDUzQyAyOC43MDE0IDIxLjk2MTEgNDUuMzc5IDE5LjExMTMgNzIuNTIyIDE0LjQ0NjlDIDgxLjA1OTMgMTIuOTc5OCA4OC42MjA3IDExLjUxMjQgOTUuMjg2NCAxMEMgMTAyLjU0NDUgMTIuMTg0IDExMC4zNDEgMTMuNTY5NSAxMTcuMzUyIDE2LjgxMUMgMTIwLjMzOSAxOC4yMzcxIDEyNC44MTMgMjAuODkzIDEyNC42ODYgMjYuMDE0OEMgMTI0LjUzOCAzMS45ODkzIDExNC42NiAzNS43NTM3IDEwMi4wMDA5IDM4Ljk0NTJDIDEwMS42NzU3IDM4LjgzMTIgMTAwLjMwNDQgMzguMjg0NCA5OS45OTczIDM4LjE3MTNDIDkyLjMwNTEgMzUuMjc4MSA2NS4xNTY0IDMxLjIyNzYgMzguMDA3NiAyNy4xNzcxWiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtNC5jdV9zeV85MnMxemoxYnJ3NnE3LWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzM0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTUuMjY0MzQzMjYxNzE4NzUsIDI3Ni43NDYyMTU4MjAzMTI1KSI+PGcgaWQ9IjQuY3Vfc3lfOTJzMXpqMWJydzZxNy1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiNkMWY0ZmYiPjxnPjxwYXRoIGQ9Ik0gMTI3LjMzNjk3NyAyMC4yMzIyQyAxMjYuNTQzOTc3IDI5LjcxMDggOTguMzk3MTc3IDM0LjQxNjQgNjkuOTA5Nzc3IDM5LjY1MDlDIDQ4LjcxMTg3NyA0My41NDYgMjkuMzU3OTc3IDQ1LjI4OCAyMS43NDU1NzcgNDcuMDEzNkMgMTUuNTAyNDc3IDQ4LjQyODggOS40NzEzNzcgNTIuODI4NiAxMC4wMzY4NzcgNjEuNjI5QyAxMC4zODEwNzcgNjYuOTg2OCAxMy43MDM0NzcgNzEuNDA0NiAyMS43NDU1NzcgNzIuMDM1QyAzMS40MzczNzcgNzIuNzk0OCA0OC4xMDQwNzcgNjkuOTMwMyA3NS4yMjkyNzcgNjUuMjQyQyAxMjMuOTk4OTc3IDU2LjgxMjQgMTQwLjkwMjk3NyA0OC4zNzUxIDE0MC45MDI5NzcgMzEuNTA4NEMgMTQwLjkwMjk3NyAyMC4yMzIyIDEyNS41NTM5NzcgMTIuMjgxIDExOC42NzY5NzcgMTBDIDEyMi44NDQ5NzcgMTEuNjYzMyAxMjcuODEwOTc3IDE0LjU2MiAxMjcuMzM2OTc3IDIwLjIzMjJaIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC00LmN1XzFfc3lfNG15anYzMWJydzdpZy1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTczMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU3Ljk2MDA1MjQ5MDIzNDQsIDI3MC40NzM3NTQ4ODI4MTI1KSI+PGcgaWQ9IjQuY3VfMV9zeV80bXlqdjMxYnJ3N2lnLWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iI2QxZjRmZiI+PGc+PHBhdGggZD0iTSAzOC4wMDc2IDI3LjE3NzFDIDE2Ljk3NTcgMjQuMDM5MiAxMC45MDI5IDE4LjU1MzcgMTAgMTcuNTMxM0MgMTEuODc0MyAxOS41MTcxIDE0Ljc5MjIgMjAuODc3MSAxOS4wMDMzIDIxLjIwNTNDIDI4LjcwMTQgMjEuOTYxMSA0NS4zNzkgMTkuMTExMyA3Mi41MjIgMTQuNDQ2OUMgODEuMDU5MyAxMi45Nzk4IDg4LjYyMDcgMTEuNTEyNCA5NS4yODY0IDEwQyAxMDIuNTQ0NSAxMi4xODQgMTEwLjM0MSAxMy41Njk1IDExNy4zNTIgMTYuODExQyAxMjAuMzM5IDE4LjIzNzEgMTI0LjgxMyAyMC44OTMgMTI0LjY4NiAyNi4wMTQ4QyAxMjQuNTM4IDMxLjk4OTMgMTE0LjY2IDM1Ljc1MzcgMTAyLjAwMDkgMzguOTQ1MkMgMTAxLjY3NTcgMzguODMxMiAxMDAuMzA0NCAzOC4yODQ0IDk5Ljk5NzMgMzguMTcxM0MgOTIuMzA1MSAzNS4yNzgxIDY1LjE1NjQgMzEuMjI3NiAzOC4wMDc2IDI3LjE3NzFaIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC0zLmN1X3N5Xzc1MXFuMWJydzhhcC1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcyOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAyMTkuNzIwNzAzMTI1KSI+PGcgaWQ9IjMuY3Vfc3lfNzUxcW4xYnJ3OGFwLWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iI2U5ZmZiOSI+PGc+PHBhdGggZD0iTSAxMjcuMzM2OTc3IDIwLjIzMjJDIDEyNi41NDM5NzcgMjkuNzEwOCA5OC4zOTcxNzcgMzQuNDE2NCA2OS45MDk3NzcgMzkuNjUwOUMgNDguNzExODc3IDQzLjU0NiAyOS4zNTc5NzcgNDUuMjg4IDIxLjc0NTU3NyA0Ny4wMTM2QyAxNS41MDI0NzcgNDguNDI4OCA5LjQ3MTM3NyA1Mi44Mjg2IDEwLjAzNjg3NyA2MS42MjlDIDEwLjM4MTA3NyA2Ni45ODY4IDEzLjcwMzQ3NyA3MS40MDQ2IDIxLjc0NTU3NyA3Mi4wMzVDIDMxLjQzNzM3NyA3Mi43OTQ4IDQ4LjEwNDA3NyA2OS45MzAzIDc1LjIyOTI3NyA2NS4yNDJDIDEyMy45OTg5NzcgNTYuODEyNCAxNDAuOTAyOTc3IDQ4LjM3NTEgMTQwLjkwMjk3NyAzMS41MDg0QyAxNDAuOTAyOTc3IDIwLjIzMjIgMTI1LjU1Mzk3NyAxMi4yODEgMTE4LjY3Njk3NyAxMEMgMTIyLjg0NDk3NyAxMS42NjMzIDEyNy44MTA5NzcgMTQuNTYyIDEyNy4zMzY5NzcgMjAuMjMyMloiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTMuY3VfMV9zeV8xcWNtM2d2MWJydzh3YS1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcyNiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU3Ljk2MDA4MzAwNzgxMjUsIDIxMy40NDgyNDIxODc1KSI+PGcgaWQ9IjMuY3VfMV9zeV8xcWNtM2d2MWJydzh3YS1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiNlOWZmYjkiPjxnPjxwYXRoIGQ9Ik0gMzguMDA3NiAyNy4xNzcxQyAxNi45NzU3IDI0LjAzOTIgMTAuOTAyOSAxOC41NTM3IDEwIDE3LjUzMTNDIDExLjg3NDMgMTkuNTE3MSAxNC43OTIyIDIwLjg3NzEgMTkuMDAzMyAyMS4yMDUzQyAyOC43MDE0IDIxLjk2MTEgNDUuMzc5IDE5LjExMTMgNzIuNTIyIDE0LjQ0NjlDIDgxLjA1OTMgMTIuOTc5OCA4OC42MjA3IDExLjUxMjQgOTUuMjg2NCAxMEMgMTAyLjU0NDUgMTIuMTg0IDExMC4zNDEgMTMuNTY5NSAxMTcuMzUyIDE2LjgxMUMgMTIwLjMzOSAxOC4yMzcxIDEyNC44MTMgMjAuODkzIDEyNC42ODYgMjYuMDE0OEMgMTI0LjUzOCAzMS45ODkzIDExNC42NiAzNS43NTM3IDEwMi4wMDA5IDM4Ljk0NTJDIDEwMS42NzU3IDM4LjgzMTIgMTAwLjMwNDQgMzguMjg0NCA5OS45OTczIDM4LjE3MTNDIDkyLjMwNTEgMzUuMjc4MSA2NS4xNTY0IDMxLjIyNzYgMzguMDA3NiAyNy4xNzcxWiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtMi5jdV9zeV8xbHhmMmZqMWJydzZpci1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcyMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAxNjIuNjk2Mjg5MDYyNSkiPjxnIGlkPSIyLmN1X3N5XzFseGYyZmoxYnJ3NmlyLWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iI2M4ZmZlNSI+PGc+PHBhdGggZD0iTSAxMjcuMzM2OTc3IDIwLjIzMjJDIDEyNi41NDM5NzcgMjkuNzEwOCA5OC4zOTcxNzcgMzQuNDE2NCA2OS45MDk3NzcgMzkuNjUwOUMgNDguNzExODc3IDQzLjU0NiAyOS4zNTc5NzcgNDUuMjg4IDIxLjc0NTU3NyA0Ny4wMTM2QyAxNS41MDI0NzcgNDguNDI4OCA5LjQ3MTM3NyA1Mi44Mjg2IDEwLjAzNjg3NyA2MS42MjlDIDEwLjM4MTA3NyA2Ni45ODY4IDEzLjcwMzQ3NyA3MS40MDQ2IDIxLjc0NTU3NyA3Mi4wMzVDIDMxLjQzNzM3NyA3Mi43OTQ4IDQ4LjEwNDA3NyA2OS45MzAzIDc1LjIyOTI3NyA2NS4yNDJDIDEyMy45OTg5NzcgNTYuODEyNCAxNDAuOTAyOTc3IDQ4LjM3NTEgMTQwLjkwMjk3NyAzMS41MDg0QyAxNDAuOTAyOTc3IDIwLjIzMjIgMTI1LjU1Mzk3NyAxMi4yODEgMTE4LjY3Njk3NyAxMEMgMTIyLjg0NDk3NyAxMS42NjMzIDEyNy44MTA5NzcgMTQuNTYyIDEyNy4zMzY5NzcgMjAuMjMyMloiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTIuY3VfMV9zeV8xZDFzMjZuMWJydzdiZy1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcyMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU3Ljk2MDA4MzAwNzgxMjUsIDE1Ni40MjI4NTE1NjI1KSI+PGcgaWQ9IjIuY3VfMV9zeV8xZDFzMjZuMWJydzdiZy1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiNjOGZmZTUiPjxnPjxwYXRoIGQ9Ik0gMzguMDA3NiAyNy4xNzcxQyAxNi45NzU3IDI0LjAzOTIgMTAuOTAyOSAxOC41NTM3IDEwIDE3LjUzMTNDIDExLjg3NDMgMTkuNTE3MSAxNC43OTIyIDIwLjg3NzEgMTkuMDAzMyAyMS4yMDUzQyAyOC43MDE0IDIxLjk2MTEgNDUuMzc5IDE5LjExMTMgNzIuNTIyIDE0LjQ0NjlDIDgxLjA1OTMgMTIuOTc5OCA4OC42MjA3IDExLjUxMjQgOTUuMjg2NCAxMEMgMTAyLjU0NDUgMTIuMTg0IDExMC4zNDEgMTMuNTY5NSAxMTcuMzUyIDE2LjgxMUMgMTIwLjMzOSAxOC4yMzcxIDEyNC44MTMgMjAuODkzIDEyNC42ODYgMjYuMDE0OEMgMTI0LjUzOCAzMS45ODkzIDExNC42NiAzNS43NTM3IDEwMi4wMDA5IDM4Ljk0NTJDIDEwMS42NzU3IDM4LjgzMTIgMTAwLjMwNDQgMzguMjg0NCA5OS45OTczIDM4LjE3MTNDIDkyLjMwNTEgMzUuMjc4MSA2NS4xNTY0IDMxLjIyNzYgMzguMDA3NiAyNy4xNzcxWiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtMS5jdV9zeV8xZDFzMjZuMWJydzdiaC1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcxNiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAxMDUuNjcxODc1KSI+PGcgaWQ9IjEuY3Vfc3lfMWQxczI2bjFicnc3YmgtZmlsbCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjZGNlOWZmIj48Zz48cGF0aCBkPSJNIDEyNy4zMzY5NzcgMjAuMjMyMkMgMTI2LjU0Mzk3NyAyOS43MTA4IDk4LjM5NzE3NyAzNC40MTY0IDY5LjkwOTc3NyAzOS42NTA5QyA0OC43MTE4NzcgNDMuNTQ2IDI5LjM1Nzk3NyA0NS4yODggMjEuNzQ1NTc3IDQ3LjAxMzZDIDE1LjUwMjQ3NyA0OC40Mjg4IDkuNDcxMzc3IDUyLjgyODYgMTAuMDM2ODc3IDYxLjYyOUMgMTAuMzgxMDc3IDY2Ljk4NjggMTMuNzAzNDc3IDcxLjQwNDYgMjEuNzQ1NTc3IDcyLjAzNUMgMzEuNDM3Mzc3IDcyLjc5NDggNDguMTA0MDc3IDY5LjkzMDMgNzUuMjI5Mjc3IDY1LjI0MkMgMTIzLjk5ODk3NyA1Ni44MTI0IDE0MC45MDI5NzcgNDguMzc1MSAxNDAuOTAyOTc3IDMxLjUwODRDIDE0MC45MDI5NzcgMjAuMjMyMiAxMjUuNTUzOTc3IDEyLjI4MSAxMTguNjc2OTc3IDEwQyAxMjIuODQ0OTc3IDExLjY2MzMgMTI3LjgxMDk3NyAxNC41NjIgMTI3LjMzNjk3NyAyMC4yMzIyWiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtMS5jdV8xX3N5XzE4bHlrMjcxYnJ3ODNxLWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzE0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTUuMzAxMjY5NTMxMjUsIDg3KSI+PGcgaWQ9IjEuY3VfMV9zeV8xOGx5azI3MWJydzgzcS1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiNkY2U5ZmYiPjxnPjxwYXRoIGQ9Ik0gMjEuNjgyMyAxMC4xMzc4ODVDIDMxLjM3NCA5LjM3ODA4NSA0OC4wNjcgMTEuNzk0ODg1IDc1LjE5MjIgMTYuNDgzMjg1QyA5MC4wMDMgMTkuMDQzMjg1IDEwNi4xODgyIDIyLjgxOTY4NSAxMjAuMDExIDI5LjIxMDM4NUMgMTIyLjk5OCAzMC42MzYzODUgMTI3LjQ3MiAzMy4yOTIzODUgMTI3LjM0NSAzOC40MTQxODVDIDEyNy4xOTYgNDQuMzg4Njg1IDExNy4zMTkgNDguMTUzMDg1IDEwNC42NTk4IDUxLjM0NDU4NUMgMTA0LjMzNDYgNTEuMjMwNTg1IDEwMi45NjMzIDUwLjY4Mzc4NSAxMDIuNjU2MSA1MC41NzA2ODVDIDc4Ljg3NTYgNDEuNjI2MTg1IDUxLjU1ODUgMzkuMjQ0ODg1IDI2LjIzNjggMzUuMjA0MDg1QyAyNC43NjM2IDM1Ljc2Mzg4NSAyMS45NDAzIDM1Ljk2Njg4NSAyMC4yMjEgMzUuNzYzODg1QyAxNS45MzAxIDM0LjY2NjI4NSAxMCAzMS4zNzMxODUgMTAgMjIuNDQ4NTg1QyAxMCAxNy44MTkxODUgMTMuNjQwMSAxMC43NjgyODUgMjEuNjgyMyAxMC4xMzc4ODVaIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC0xLkVsbGlwc2Vfc3lfenFianRiMWJydzh3Zi1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcxMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDY0ODQzNzUsIDg3LjE3ODk1NTA3ODEyNSkiPjxnIGlkPSIxLkVsbGlwc2Vfc3lfenFianRiMWJydzh3Zi1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiNkY2U5ZmYiPjxnPjxwYXRoIGQ9Ik0gMTAgMjIuODQ2MDY2QyA5Ljk5ODE1NiAyOS45NDAxOSAxNS40OTg4MTYgMzUuNjkyMTM2IDIyLjI4NDg2MyAzNS42OTIxMzZDIDI5LjA3MDkwOSAzNS42OTIxMzYgMzQuNTcxNTcgMjkuOTQwMTkgMzQuNTY5NzI2IDIyLjg0NjA2NkMgMzQuNTcxNTcgMTUuNzUxOTQyIDI5LjA3MDkwOSA5Ljk5OTk5NiAyMi4yODQ4NjMgOS45OTk5OTZDIDE1LjQ5ODgxNiA5Ljk5OTk5NiA5Ljk5ODE1NiAxNS43NTE5NDIgMTAgMjIuODQ2MDY2Ij48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC10eF9sb2FkZGF0YV8xZDMxMGN2MWJydzloby1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MS4yNjQzMTI3NDQxNDA2LCAyMzEpIj48ZyBpZD0idHhfbG9hZGRhdGFfMWQzMTBjdjFicnc5aG8tZmlsbCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjNDg0ODQ4Ij48Zz48dGV4dCBzdHlsZT0iZm9udDogMjBweCAmcXVvdDtTaGFudGVsbCBTYW5zJnF1b3Q7LCBjdXJzaXZlOyB3aGl0ZS1zcGFjZTogcHJlOyIgZm9udC1zaXplPSIyMHB4IiBmb250LWZhbWlseT0iJ1NoYW50ZWxsIFNhbnMnLCBjdXJzaXZlIj48dHNwYW4geD0iMTIiIHk9IjM1LjYiIGRvbWluYW50LWJhc2VsaW5lPSJpZGVvZ3JhcGhpYyI+TG9hZCBEYXRhc2V0PC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC0yXzF1cGEzMm4xYzF2cndsLWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIzLjI2NDMxMjc0NDE0MDYsIDIyNSkiPjwvZz48ZyBpZD0iZy1yb290LXR4X2luc3RhbGxkXzE4bnR6YmoxYnJ3NzQ1LWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDcxLjI2NDMxMjc0NDE0MDYsIDE3MSkiPjxnIGlkPSJ0eF9pbnN0YWxsZF8xOG50emJqMWJydzc0NS1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiM0ODQ4NDgiPjxnPjx0ZXh0IHN0eWxlPSJmb250OiAyMHB4ICZxdW90O1NoYW50ZWxsIFNhbnMmcXVvdDssIGN1cnNpdmU7IHdoaXRlLXNwYWNlOiBwcmU7IiBmb250LXNpemU9IjIwcHgiIGZvbnQtZmFtaWx5PSInU2hhbnRlbGwgU2FucycsIGN1cnNpdmUiPjx0c3BhbiB4PSIxMiIgeT0iMzUuNiIgZG9taW5hbnQtYmFzZWxpbmU9ImlkZW9ncmFwaGljIj5JbnN0YWxsIERlcGVuZGVuY2llczwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtNF9odncwc3YxYzFkajQwLWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIzLjI2NDMxMjc0NDE0MDYsIDI4NSkiPjwvZz48ZyBpZD0iZy1yb290LXR4X3ByZXRyYWluXzFxZWhpcTcxYnJ3N3dyLWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDcxLjI2NDMxMjc0NDE0MDYsIDI3OSkiPjxnIGlkPSJ0eF9wcmV0cmFpbl8xcWVoaXE3MWJydzd3ci1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiM0ODQ4NDgiPjxnPjx0ZXh0IHN0eWxlPSJmb250OiAyMHB4ICZxdW90O1NoYW50ZWxsIFNhbnMmcXVvdDssIGN1cnNpdmU7IHdoaXRlLXNwYWNlOiBwcmU7IiBmb250LXNpemU9IjIwcHgiIGZvbnQtZmFtaWx5PSInU2hhbnRlbGwgU2FucycsIGN1cnNpdmUiPjx0c3BhbiB4PSIxMiIgeT0iMzUuNiIgZG9taW5hbnQtYmFzZWxpbmU9ImlkZW9ncmFwaGljIj5QcmUtdHJhaW5lZCBMYW5ndWFnZSBNb2RlbCB3aXRoIDwvdHNwYW4+PHRzcGFuIHg9IjEyIiB5PSI1OS42IiBkb21pbmFudC1iYXNlbGluZT0iaWRlb2dyYXBoaWMiPkxvUkE8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LXB5dGhfOTNkaDViMWMxcms3NS1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQyMy4yNjQzMTI3NDQxNDA2LCAxNjUpIj48L2c+PGcgaWQ9Imctcm9vdC10eF9jaG9vc2VncF96czZ6Mm4xYnJ3N3d1LWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDcxLjI2NDMxMjc0NDE0MDYsIDExMSkiPjxnIGlkPSJ0eF9jaG9vc2VncF96czZ6Mm4xYnJ3N3d1LWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzQ4NDg0OCI+PGc+PHRleHQgc3R5bGU9ImZvbnQ6IDIwcHggJnF1b3Q7U2hhbnRlbGwgU2FucyZxdW90OywgY3Vyc2l2ZTsgd2hpdGUtc3BhY2U6IHByZTsiIGZvbnQtc2l6ZT0iMjBweCIgZm9udC1mYW1pbHk9IidTaGFudGVsbCBTYW5zJywgY3Vyc2l2ZSI+PHRzcGFuIHg9IjEyIiB5PSIzNS42IiBkb21pbmFudC1iYXNlbGluZT0iaWRlb2dyYXBoaWMiPkNob29zZSBHUFUgUnVudGltZTwvdHNwYW4+PC90ZXh0PjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3Qtc2hhcl9xczVidGIxYzFzeXlwLWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIzLjI2NDMxMjc0NDE0MDYsIDM0NSkiPjwvZz48ZyBpZD0iZy1yb290LXR4X2dycG9vcHRpXzkwZ3p6MWJydzdiNi1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MS4yNjQzMTI3NDQxNDA2LCAzNTEuMDAwMTIyMDcwMzEyNSkiPjxnIGlkPSJ0eF9ncnBvb3B0aV85MGd6ejFicnc3YjYtZmlsbCIgc3Ryb2tlPSJub25lIiBmaWxsPSIjNDg0ODQ4Ij48Zz48dGV4dCBzdHlsZT0iZm9udDogMjBweCAmcXVvdDtTaGFudGVsbCBTYW5zJnF1b3Q7LCBjdXJzaXZlOyB3aGl0ZS1zcGFjZTogcHJlOyIgZm9udC1zaXplPSIyMHB4IiBmb250LWZhbWlseT0iJ1NoYW50ZWxsIFNhbnMnLCBjdXJzaXZlIj48dHNwYW4geD0iMTIiIHk9IjM1LjYiIGRvbWluYW50LWJhc2VsaW5lPSJpZGVvZ3JhcGhpYyI+R1JQTyBPcHRpbWl6YXRpb248L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LWZpcmVfMXFjbDRwYjFjMWV5MnMtZmlsbCIgZGF0YS1pdGVtLW9yZGVyPSIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MjMuMjY0MzEyNzQ0MTQwNiwgMTA1KSI+PC9nPjxnIGlkPSJnLXJvb3QtdHhfcHVzaG1vZGVfdmI0aXJ6MWJydzZpdy1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MS4yNjQzMTI3NDQxNDA2LCA0NzEuMDAwMTIyMDcwMzEyNSkiPjxnIGlkPSJ0eF9wdXNobW9kZV92YjRpcnoxYnJ3Nml3LWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzQ4NDg0OCI+PGc+PHRleHQgc3R5bGU9ImZvbnQ6IDIwcHggJnF1b3Q7U2hhbnRlbGwgU2FucyZxdW90OywgY3Vyc2l2ZTsgd2hpdGUtc3BhY2U6IHByZTsiIGZvbnQtc2l6ZT0iMjBweCIgZm9udC1mYW1pbHk9IidTaGFudGVsbCBTYW5zJywgY3Vyc2l2ZSI+PHRzcGFuIHg9IjEyIiB5PSIzNS42IiBkb21pbmFudC1iYXNlbGluZT0iaWRlb2dyYXBoaWMiPlB1c2ggTW9kZWwgdG8gSHViPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC1zY3JpXzF1cWl1eGIxYzFlem5uLWZpbGwiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIzLjI2NDMxMjc0NDE0MDYsIDQwNS4wMDAxMjIwNzAzMTI1KSI+PC9nPjxnIGlkPSJnLXJvb3QtdHhfdGV4dGdlbmVfZGp1aWE3MWJydzh3MS1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MS4yNjQzMTI3NDQxNDA2LCA0MTEuMDAwMTIyMDcwMzEyNSkiPjxnIGlkPSJ0eF90ZXh0Z2VuZV9kanVpYTcxYnJ3OHcxLWZpbGwiIHN0cm9rZT0ibm9uZSIgZmlsbD0iIzQ4NDg0OCI+PGc+PHRleHQgc3R5bGU9ImZvbnQ6IDIwcHggJnF1b3Q7U2hhbnRlbGwgU2FucyZxdW90OywgY3Vyc2l2ZTsgd2hpdGUtc3BhY2U6IHByZTsiIGZvbnQtc2l6ZT0iMjBweCIgZm9udC1mYW1pbHk9IidTaGFudGVsbCBTYW5zJywgY3Vyc2l2ZSI+PHRzcGFuIHg9IjEyIiB5PSIzNS42IiBkb21pbmFudC1iYXNlbGluZT0iaWRlb2dyYXBoaWMiPlRleHQgR2VuZXJhdGlvbiBPdXRwdXQ8L3RzcGFuPjwvdGV4dD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LWZlYXRfaHJpaXZqMWMxYXB6Yy1maWxsIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQyMy4yNjQzMTI3NDQxNDA2LCA0NjUuMDAwMTIyMDcwMzEyNSkiPjwvZz48ZyBpZD0iZy1yb290LXR4X2ZpbmV0dW5pX3ZjZGd5NzFicnc4cDMtZmlsbCIgZGF0YS1pdGVtLW9yZGVyPSIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMzMuMjY0MjgyMjI2NTYyNSwgMjcpIj48ZyBpZD0idHhfZmluZXR1bmlfdmNkZ3k3MWJydzhwMy1maWxsIiBzdHJva2U9Im5vbmUiIGZpbGw9IiM0ODQ4NDgiPjxnPjx0ZXh0IHN0eWxlPSJmb250OiBib2xkIDI1cHggJnF1b3Q7U2hhbnRlbGwgU2FucyZxdW90OywgY3Vyc2l2ZTsgd2hpdGUtc3BhY2U6IHByZTsiIGZvbnQtd2VpZ2h0PSJib2xkIiBmb250LXNpemU9IjI1cHgiIGZvbnQtZmFtaWx5PSInU2hhbnRlbGwgU2FucycsIGN1cnNpdmUiPjx0c3BhbiB4PSIxNi4xNCIgeT0iNDQuMiIgZG9taW5hbnQtYmFzZWxpbmU9ImlkZW9ncmFwaGljIj5FYXNpbHkgRmluZS1UdW5lIExMTXMgd2l0aCBHUlBPPC90c3Bhbj48L3RleHQ+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC10Zl8xNDFxcmtmMWMxb3N1Yy1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iLTYyNjY0NiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTksIC05KSI+PC9nPjxnIGlkPSJnLXJvb3QtNy5jdV9zeV8xY3p3bXhiMWJydzhheC1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzUyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTUuMjY0MzQzMjYxNzE4NzUsIDQ0Ny44MTk0NTgwMDc4MTI1KSI+PGcgaWQ9IjcuY3Vfc3lfMWN6d214YjFicnc4YXgtc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSA2OS45MDk3NzcgMzkuNjUwOUMgOTguMzk3MTc3IDM0LjQxNjQgMTI2LjU0NDA3NyAyOS43MTA4IDEyNy4zMzY4NzcgMjAuMjMyMkMgMTI3LjgxMTE3NyAxNC41NjIgMTIyLjg0NTM3NyAxMS42NjMzIDExOC42NzczNzcgMTBDIDEyNS41NTM5NzcgMTIuMjgxIDE0MC45MDI2NzcgMjAuMjMyMiAxNDAuOTAyNjc3IDMxLjUwODRDIDE0MC45MDI2NzcgNDguMzc1MiAxMjMuOTk5Mzc3IDU2LjgxMjQgNzUuMjI5Mjc3IDY1LjI0MkMgNDguMTA0MDc3IDY5LjkzMDMgMzEuNDM3Mzc3IDcyLjc5NDggMjEuNzQ1NTc3IDcyLjAzNUMgMTMuNzAzNDc3IDcxLjQwNDYgMTAuMzgxMDc3IDY2Ljk4NjggMTAuMDM2ODc3IDYxLjYyOUMgOS40NzEzNzcgNTIuODI4NiAxNS41MDI0NzcgNDguNDI4OCAyMS43NDU1NzcgNDcuMDEzNkMgMjkuMzU3OTc3IDQ1LjI4OCA0OC43MTE4NzcgNDMuNTQ2IDY5LjkwOTc3NyAzOS42NTA5WiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtNy5jdV8xX3N5XzE4azM0c3YxYnJ3OTM2LXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSItNTU3NTAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1Ny45NjAwNTI0OTAyMzQ0LCA0NDEuNTQ2MjY0NjQ4NDM3NSkiPjxnIGlkPSI3LmN1XzFfc3lfMThrMzRzdjFicnc5MzYtc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSAzOC4wMDc2IDI3LjE3NzFDIDE2Ljk3NTcgMjQuMDM5MiAxMC45MDI5IDE4LjU1MzcgMTAgMTcuNTMxM0MgMTEuODc0MyAxOS41MTcxIDE0Ljc5MjIgMjAuODc3MSAxOS4wMDMzIDIxLjIwNTNDIDI4LjcwMTQgMjEuOTYxMSA0NS4zNzkgMTkuMTExMyA3Mi41MjIgMTQuNDQ2OUMgODEuMDU5MyAxMi45Nzk4IDg4LjYyMDcgMTEuNTEyNCA5NS4yODY0IDEwQyAxMDIuNTQ0NSAxMi4xODQgMTEwLjM0MDggMTMuNTY5NSAxMTcuMzUxOSAxNi44MTFDIDEyMC4zMzkzIDE4LjIzNzEgMTI0LjgxMzEgMjAuODkzIDEyNC42ODU5IDI2LjAxNDhDIDEyNC41Mzc2IDMxLjk4OTMgMTE0LjY1OTkgMzUuNzUzNyAxMDIuMDAwOSAzOC45NDUyQyAxMDEuNjc1NyAzOC44MzEyIDEwMC4zMDQ0IDM4LjI4NDQgOTkuOTk3MyAzOC4xNzEzQyA5Mi4zMDUxIDM1LjI3ODEgNjUuMTU2NCAzMS4yMjc2IDM4LjAwNzYgMjcuMTc3MVpNIDExNy4zNTE5IDE2LjgxMUwgMTE3LjU5OTUgMTYuOTI1NSI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtNi5jdV9zeV96cDJsbjMxYnJ3NnEzLXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSItNTU3NDYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NS4yNjQzNDMyNjE3MTg3NSwgMzkwLjc5NDMxMTUyMzQzNzUpIj48ZyBpZD0iNi5jdV9zeV96cDJsbjMxYnJ3NnEzLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gNjkuOTA5Nzc3IDM5LjY1MDlDIDk4LjM5NzE3NyAzNC40MTY0IDEyNi41NDQwNzcgMjkuNzEwOCAxMjcuMzM2ODc3IDIwLjIzMjJDIDEyNy44MTExNzcgMTQuNTYyIDEyMi44NDUzNzcgMTEuNjYzMyAxMTguNjc3Mzc3IDEwQyAxMjUuNTUzOTc3IDEyLjI4MSAxNDAuOTAyNjc3IDIwLjIzMjIgMTQwLjkwMjY3NyAzMS41MDg0QyAxNDAuOTAyNjc3IDQ4LjM3NTIgMTIzLjk5OTM3NyA1Ni44MTI0IDc1LjIyOTI3NyA2NS4yNDJDIDQ4LjEwNDA3NyA2OS45MzAzIDMxLjQzNzM3NyA3Mi43OTQ4IDIxLjc0NTU3NyA3Mi4wMzVDIDEzLjcwMzQ3NyA3MS40MDQ2IDEwLjM4MTA3NyA2Ni45ODY4IDEwLjAzNjg3NyA2MS42MjlDIDkuNDcxMzc3IDUyLjgyODYgMTUuNTAyNDc3IDQ4LjQyODggMjEuNzQ1NTc3IDQ3LjAxMzZDIDI5LjM1Nzk3NyA0NS4yODggNDguNzExODc3IDQzLjU0NiA2OS45MDk3NzcgMzkuNjUwOVoiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTYuY3VfMV9zeV92OTkzaW4xYnJ3N2ljLXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSItNTU3NDQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1Ny45NjAwNTI0OTAyMzQ0LCAzODQuNTIxODUwNTg1OTM3NSkiPjxnIGlkPSI2LmN1XzFfc3lfdjk5M2luMWJydzdpYy1zdHJva2UiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjQiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIj48Zz48cGF0aCBkPSJNIDM4LjAwNzYgMjcuMTc3MUMgMTYuOTc1NyAyNC4wMzkyIDEwLjkwMjkgMTguNTUzNyAxMCAxNy41MzEzQyAxMS44NzQzIDE5LjUxNzEgMTQuNzkyMiAyMC44NzcxIDE5LjAwMzMgMjEuMjA1M0MgMjguNzAxNCAyMS45NjExIDQ1LjM3OSAxOS4xMTEzIDcyLjUyMiAxNC40NDY5QyA4MS4wNTkzIDEyLjk3OTggODguNjIwNyAxMS41MTI0IDk1LjI4NjQgMTBDIDEwMi41NDQ1IDEyLjE4NCAxMTAuMzQwOCAxMy41Njk1IDExNy4zNTE5IDE2LjgxMUMgMTIwLjMzOTMgMTguMjM3MSAxMjQuODEzMSAyMC44OTMgMTI0LjY4NTkgMjYuMDE0OEMgMTI0LjUzNzYgMzEuOTg5MyAxMTQuNjU5OSAzNS43NTM3IDEwMi4wMDA5IDM4Ljk0NTJDIDEwMS42NzU3IDM4LjgzMTIgMTAwLjMwNDQgMzguMjg0NCA5OS45OTczIDM4LjE3MTNDIDkyLjMwNTEgMzUuMjc4MSA2NS4xNTY0IDMxLjIyNzYgMzguMDA3NiAyNy4xNzcxWk0gMTE3LjM1MTkgMTYuODExTCAxMTcuNTk5NSAxNi45MjU1Ij48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC01LmN1X3N5X21kbTM5cjFicnc4YjEtc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTc0MCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAzMzMuNzcwMTQxNjAxNTYyNSkiPjxnIGlkPSI1LmN1X3N5X21kbTM5cjFicnc4YjEtc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSA2OS45MDk3NzcgMzkuNjUwOUMgOTguMzk3MTc3IDM0LjQxNjQgMTI2LjU0NDA3NyAyOS43MTA4IDEyNy4zMzY4NzcgMjAuMjMyMkMgMTI3LjgxMTE3NyAxNC41NjIgMTIyLjg0NTM3NyAxMS42NjMzIDExOC42NzczNzcgMTBDIDEyNS41NTM5NzcgMTIuMjgxIDE0MC45MDI2NzcgMjAuMjMyMiAxNDAuOTAyNjc3IDMxLjUwODRDIDE0MC45MDI2NzcgNDguMzc1MiAxMjMuOTk5Mzc3IDU2LjgxMjQgNzUuMjI5Mjc3IDY1LjI0MkMgNDguMTA0MDc3IDY5LjkzMDMgMzEuNDM3Mzc3IDcyLjc5NDggMjEuNzQ1NTc3IDcyLjAzNUMgMTMuNzAzNDc3IDcxLjQwNDYgMTAuMzgxMDc3IDY2Ljk4NjggMTAuMDM2ODc3IDYxLjYyOUMgOS40NzEzNzcgNTIuODI4NiAxNS41MDI0NzcgNDguNDI4OCAyMS43NDU1NzcgNDcuMDEzNkMgMjkuMzU3OTc3IDQ1LjI4OCA0OC43MTE4NzcgNDMuNTQ2IDY5LjkwOTc3NyAzOS42NTA5WiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtNS5jdV8xX3N5X2h4c2w1YjFicnc5M2Etc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTczOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU3Ljk2MDA1MjQ5MDIzNDQsIDMyNy40OTcxOTIzODI4MTI1KSI+PGcgaWQ9IjUuY3VfMV9zeV9oeHNsNWIxYnJ3OTNhLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gMzguMDA3NiAyNy4xNzcxQyAxNi45NzU3IDI0LjAzOTIgMTAuOTAyOSAxOC41NTM3IDEwIDE3LjUzMTNDIDExLjg3NDMgMTkuNTE3MSAxNC43OTIyIDIwLjg3NzEgMTkuMDAzMyAyMS4yMDUzQyAyOC43MDE0IDIxLjk2MTEgNDUuMzc5IDE5LjExMTMgNzIuNTIyIDE0LjQ0NjlDIDgxLjA1OTMgMTIuOTc5OCA4OC42MjA3IDExLjUxMjQgOTUuMjg2NCAxMEMgMTAyLjU0NDUgMTIuMTg0IDExMC4zNDA4IDEzLjU2OTUgMTE3LjM1MTkgMTYuODExQyAxMjAuMzM5MyAxOC4yMzcxIDEyNC44MTMxIDIwLjg5MyAxMjQuNjg1OSAyNi4wMTQ4QyAxMjQuNTM3NiAzMS45ODkzIDExNC42NTk5IDM1Ljc1MzcgMTAyLjAwMDkgMzguOTQ1MkMgMTAxLjY3NTcgMzguODMxMiAxMDAuMzA0NCAzOC4yODQ0IDk5Ljk5NzMgMzguMTcxM0MgOTIuMzA1MSAzNS4yNzgxIDY1LjE1NjQgMzEuMjI3NiAzOC4wMDc2IDI3LjE3NzFaTSAxMTcuMzUxOSAxNi44MTFMIDExNy41OTk1IDE2LjkyNTUiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTQuY3Vfc3lfOTJzMXpqMWJydzZxNy1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzM0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTUuMjY0MzQzMjYxNzE4NzUsIDI3Ni43NDYyMTU4MjAzMTI1KSI+PGcgaWQ9IjQuY3Vfc3lfOTJzMXpqMWJydzZxNy1zdHJva2UiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjQiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSIyIj48Zz48cGF0aCBkPSJNIDY5LjkwOTc3NyAzOS42NTA5QyA5OC4zOTcxNzcgMzQuNDE2NCAxMjYuNTQ0MDc3IDI5LjcxMDggMTI3LjMzNjg3NyAyMC4yMzIyQyAxMjcuODExMTc3IDE0LjU2MiAxMjIuODQ1Mzc3IDExLjY2MzMgMTE4LjY3NzM3NyAxMEMgMTI1LjU1Mzk3NyAxMi4yODEgMTQwLjkwMjY3NyAyMC4yMzIyIDE0MC45MDI2NzcgMzEuNTA4NEMgMTQwLjkwMjY3NyA0OC4zNzUyIDEyMy45OTkzNzcgNTYuODEyNCA3NS4yMjkyNzcgNjUuMjQyQyA0OC4xMDQwNzcgNjkuOTMwMyAzMS40MzczNzcgNzIuNzk0OCAyMS43NDU1NzcgNzIuMDM1QyAxMy43MDM0NzcgNzEuNDA0NiAxMC4zODEwNzcgNjYuOTg2OCAxMC4wMzY4NzcgNjEuNjI5QyA5LjQ3MTM3NyA1Mi44Mjg2IDE1LjUwMjQ3NyA0OC40Mjg4IDIxLjc0NTU3NyA0Ny4wMTM2QyAyOS4zNTc5NzcgNDUuMjg4IDQ4LjcxMTg3NyA0My41NDYgNjkuOTA5Nzc3IDM5LjY1MDlaIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC00LmN1XzFfc3lfNG15anYzMWJydzdpZy1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzMyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTcuOTYwMDUyNDkwMjM0NCwgMjcwLjQ3Mzc1NDg4MjgxMjUpIj48ZyBpZD0iNC5jdV8xX3N5XzRteWp2MzFicnc3aWctc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSAzOC4wMDc2IDI3LjE3NzFDIDE2Ljk3NTcgMjQuMDM5MiAxMC45MDI5IDE4LjU1MzcgMTAgMTcuNTMxM0MgMTEuODc0MyAxOS41MTcxIDE0Ljc5MjIgMjAuODc3MSAxOS4wMDMzIDIxLjIwNTNDIDI4LjcwMTQgMjEuOTYxMSA0NS4zNzkgMTkuMTExMyA3Mi41MjIgMTQuNDQ2OUMgODEuMDU5MyAxMi45Nzk4IDg4LjYyMDcgMTEuNTEyNCA5NS4yODY0IDEwQyAxMDIuNTQ0NSAxMi4xODQgMTEwLjM0MDggMTMuNTY5NSAxMTcuMzUxOSAxNi44MTFDIDEyMC4zMzkzIDE4LjIzNzEgMTI0LjgxMzEgMjAuODkzIDEyNC42ODU5IDI2LjAxNDhDIDEyNC41Mzc2IDMxLjk4OTMgMTE0LjY1OTkgMzUuNzUzNyAxMDIuMDAwOSAzOC45NDUyQyAxMDEuNjc1NyAzOC44MzEyIDEwMC4zMDQ0IDM4LjI4NDQgOTkuOTk3MyAzOC4xNzEzQyA5Mi4zMDUxIDM1LjI3ODEgNjUuMTU2NCAzMS4yMjc2IDM4LjAwNzYgMjcuMTc3MVpNIDExNy4zNTE5IDE2LjgxMUwgMTE3LjU5OTUgMTYuOTI1NSI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtMy5jdV9zeV83NTFxbjFicnc4YXAtc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcyOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAyMTkuNzIwNzAzMTI1KSI+PGcgaWQ9IjMuY3Vfc3lfNzUxcW4xYnJ3OGFwLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gNjkuOTA5Nzc3IDM5LjY1MDlDIDk4LjM5NzE3NyAzNC40MTY0IDEyNi41NDQwNzcgMjkuNzEwOCAxMjcuMzM2ODc3IDIwLjIzMjJDIDEyNy44MTExNzcgMTQuNTYyIDEyMi44NDUzNzcgMTEuNjYzMyAxMTguNjc3Mzc3IDEwQyAxMjUuNTUzOTc3IDEyLjI4MSAxNDAuOTAyNjc3IDIwLjIzMjIgMTQwLjkwMjY3NyAzMS41MDg0QyAxNDAuOTAyNjc3IDQ4LjM3NTIgMTIzLjk5OTM3NyA1Ni44MTI0IDc1LjIyOTI3NyA2NS4yNDJDIDQ4LjEwNDA3NyA2OS45MzAzIDMxLjQzNzM3NyA3Mi43OTQ4IDIxLjc0NTU3NyA3Mi4wMzVDIDEzLjcwMzQ3NyA3MS40MDQ2IDEwLjM4MTA3NyA2Ni45ODY4IDEwLjAzNjg3NyA2MS42MjlDIDkuNDcxMzc3IDUyLjgyODYgMTUuNTAyNDc3IDQ4LjQyODggMjEuNzQ1NTc3IDQ3LjAxMzZDIDI5LjM1Nzk3NyA0NS4yODggNDguNzExODc3IDQzLjU0NiA2OS45MDk3NzcgMzkuNjUwOVoiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTMuY3VfMV9zeV8xcWNtM2d2MWJydzh3YS1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzI2IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTcuOTYwMDgzMDA3ODEyNSwgMjEzLjQ0ODI0MjE4NzUpIj48ZyBpZD0iMy5jdV8xX3N5XzFxY20zZ3YxYnJ3OHdhLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gMzguMDA3NiAyNy4xNzcxQyAxNi45NzU3IDI0LjAzOTIgMTAuOTAyOSAxOC41NTM3IDEwIDE3LjUzMTNDIDExLjg3NDMgMTkuNTE3MSAxNC43OTIyIDIwLjg3NzEgMTkuMDAzMyAyMS4yMDUzQyAyOC43MDE0IDIxLjk2MTEgNDUuMzc5IDE5LjExMTMgNzIuNTIyIDE0LjQ0NjlDIDgxLjA1OTMgMTIuOTc5OCA4OC42MjA3IDExLjUxMjQgOTUuMjg2NCAxMEMgMTAyLjU0NDUgMTIuMTg0IDExMC4zNDA4IDEzLjU2OTUgMTE3LjM1MTkgMTYuODExQyAxMjAuMzM5MyAxOC4yMzcxIDEyNC44MTMxIDIwLjg5MyAxMjQuNjg1OSAyNi4wMTQ4QyAxMjQuNTM3NiAzMS45ODkzIDExNC42NTk5IDM1Ljc1MzcgMTAyLjAwMDkgMzguOTQ1MkMgMTAxLjY3NTcgMzguODMxMiAxMDAuMzA0NCAzOC4yODQ0IDk5Ljk5NzMgMzguMTcxM0MgOTIuMzA1MSAzNS4yNzgxIDY1LjE1NjQgMzEuMjI3NiAzOC4wMDc2IDI3LjE3NzFaTSAxMTcuMzUxOSAxNi44MTFMIDExNy41OTk1IDE2LjkyNTUiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTIuY3Vfc3lfMWx4ZjJmajFicnc2aXItc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcyMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAxNjIuNjk2Mjg5MDYyNSkiPjxnIGlkPSIyLmN1X3N5XzFseGYyZmoxYnJ3NmlyLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gNjkuOTA5Nzc3IDM5LjY1MDlDIDk4LjM5NzE3NyAzNC40MTY0IDEyNi41NDQwNzcgMjkuNzEwOCAxMjcuMzM2ODc3IDIwLjIzMjJDIDEyNy44MTExNzcgMTQuNTYyIDEyMi44NDUzNzcgMTEuNjYzMyAxMTguNjc3Mzc3IDEwQyAxMjUuNTUzOTc3IDEyLjI4MSAxNDAuOTAyNjc3IDIwLjIzMjIgMTQwLjkwMjY3NyAzMS41MDg0QyAxNDAuOTAyNjc3IDQ4LjM3NTIgMTIzLjk5OTM3NyA1Ni44MTI0IDc1LjIyOTI3NyA2NS4yNDJDIDQ4LjEwNDA3NyA2OS45MzAzIDMxLjQzNzM3NyA3Mi43OTQ4IDIxLjc0NTU3NyA3Mi4wMzVDIDEzLjcwMzQ3NyA3MS40MDQ2IDEwLjM4MTA3NyA2Ni45ODY4IDEwLjAzNjg3NyA2MS42MjlDIDkuNDcxMzc3IDUyLjgyODYgMTUuNTAyNDc3IDQ4LjQyODggMjEuNzQ1NTc3IDQ3LjAxMzZDIDI5LjM1Nzk3NyA0NS4yODggNDguNzExODc3IDQzLjU0NiA2OS45MDk3NzcgMzkuNjUwOVoiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTIuY3VfMV9zeV8xZDFzMjZuMWJydzdiZy1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iLTU1NzIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNTcuOTYwMDgzMDA3ODEyNSwgMTU2LjQyMjg1MTU2MjUpIj48ZyBpZD0iMi5jdV8xX3N5XzFkMXMyNm4xYnJ3N2JnLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gMzguMDA3NiAyNy4xNzcxQyAxNi45NzU3IDI0LjAzOTIgMTAuOTAyOSAxOC41NTM3IDEwIDE3LjUzMTNDIDExLjg3NDMgMTkuNTE3MSAxNC43OTIyIDIwLjg3NzEgMTkuMDAzMyAyMS4yMDUzQyAyOC43MDE0IDIxLjk2MTEgNDUuMzc5IDE5LjExMTMgNzIuNTIyIDE0LjQ0NjlDIDgxLjA1OTMgMTIuOTc5OCA4OC42MjA3IDExLjUxMjQgOTUuMjg2NCAxMEMgMTAyLjU0NDUgMTIuMTg0IDExMC4zNDA4IDEzLjU2OTUgMTE3LjM1MTkgMTYuODExQyAxMjAuMzM5MyAxOC4yMzcxIDEyNC44MTMxIDIwLjg5MyAxMjQuNjg1OSAyNi4wMTQ4QyAxMjQuNTM3NiAzMS45ODkzIDExNC42NTk5IDM1Ljc1MzcgMTAyLjAwMDkgMzguOTQ1MkMgMTAxLjY3NTcgMzguODMxMiAxMDAuMzA0NCAzOC4yODQ0IDk5Ljk5NzMgMzguMTcxM0MgOTIuMzA1MSAzNS4yNzgxIDY1LjE1NjQgMzEuMjI3NiAzOC4wMDc2IDI3LjE3NzFaTSAxMTcuMzUxOSAxNi44MTFMIDExNy41OTk1IDE2LjkyNTUiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTEuY3Vfc3lfMWQxczI2bjFicnc3Ymgtc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9Ii01NTcxNiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjU1LjI2NDM0MzI2MTcxODc1LCAxMDUuNjcxODc1KSI+PGcgaWQ9IjEuY3Vfc3lfMWQxczI2bjFicnc3Ymgtc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSA2OS45MDk3NzcgMzkuNjUwOUMgOTguMzk3MTc3IDM0LjQxNjQgMTI2LjU0NDA3NyAyOS43MTA4IDEyNy4zMzY4NzcgMjAuMjMyMkMgMTI3LjgxMTE3NyAxNC41NjIgMTIyLjg0NTM3NyAxMS42NjMzIDExOC42NzczNzcgMTBDIDEyNS41NTM5NzcgMTIuMjgxIDE0MC45MDI2NzcgMjAuMjMyMiAxNDAuOTAyNjc3IDMxLjUwODRDIDE0MC45MDI2NzcgNDguMzc1MiAxMjMuOTk5Mzc3IDU2LjgxMjQgNzUuMjI5Mjc3IDY1LjI0MkMgNDguMTA0MDc3IDY5LjkzMDMgMzEuNDM3Mzc3IDcyLjc5NDggMjEuNzQ1NTc3IDcyLjAzNUMgMTMuNzAzNDc3IDcxLjQwNDYgMTAuMzgxMDc3IDY2Ljk4NjggMTAuMDM2ODc3IDYxLjYyOUMgOS40NzEzNzcgNTIuODI4NiAxNS41MDI0NzcgNDguNDI4OCAyMS43NDU1NzcgNDcuMDEzNkMgMjkuMzU3OTc3IDQ1LjI4OCA0OC43MTE4NzcgNDMuNTQ2IDY5LjkwOTc3NyAzOS42NTA5WiI+PC9wYXRoPjwvZz48L2c+PC9nPjxnIGlkPSJnLXJvb3QtMS5jdV8xX3N5XzE4bHlrMjcxYnJ3ODNxLXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSItNTU3MTQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NS4zMDEyNjk1MzEyNSwgODcpIj48ZyBpZD0iMS5jdV8xX3N5XzE4bHlrMjcxYnJ3ODNxLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gMTIwLjAxMDggMjkuMjEwMzg1QyAxMjIuOTk4MiAzMC42MzYzODUgMTI3LjQ3MTggMzMuMjkyMzg1IDEyNy4zNDQ2IDM4LjQxNDE4NUMgMTI3LjE5NjMgNDQuMzg4Njg1IDExNy4zMTg3IDQ4LjE1MzA4NSAxMDQuNjU5OCA1MS4zNDQ1ODVDIDEwNC4zMzQ2IDUxLjIzMDU4NSAxMDIuOTYzMyA1MC42ODM3ODUgMTAyLjY1NjEgNTAuNTcwNjg1QyA3OC44NzU2IDQxLjYyNjE4NSA1MS41NTg1IDM5LjI0NDg4NSAyNi4yMzY4IDM1LjIwNDA4NUMgMjQuNzYzNiAzNS43NjM4ODUgMjEuOTQwMyAzNS45NjY4ODUgMjAuMjIxIDM1Ljc2Mzg4NUMgMTUuOTMwMSAzNC42NjYyODUgMTAgMzEuMzczMTg1IDEwIDIyLjQ0ODU4NUMgMTAgMTcuODE5MTg1IDEzLjY0MDEgMTAuNzY4Mjg1IDIxLjY4MjMgMTAuMTM3ODg1QyAzMS4zNzQgOS4zNzgwODUgNDguMDY3IDExLjc5NDg4NSA3NS4xOTIyIDE2LjQ4MzI4NUMgOTAuMDAzIDE5LjA0MzE4NSAxMDYuMTg4MiAyMi44MTk2ODUgMTIwLjAxMDggMjkuMjEwMzg1Wk0gMTIwLjAxMDggMjkuMjEwMzg1TCAxMjAuMjU4MyAyOS4zMjQ3ODUiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LTEuRWxsaXBzZV9zeV96cWJqdGIxYnJ3OHdmLXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSItNTU3MTIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI1NS4yNjQ2NDg0Mzc1LCA4Ny4xNzg5NTUwNzgxMjUpIj48ZyBpZD0iMS5FbGxpcHNlX3N5X3pxYmp0YjFicnc4d2Ytc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSAxMCAyMi44NDYwNjZDIDkuOTk4MTU2IDI5Ljk0MDE5IDE1LjQ5ODgxNiAzNS42OTIxMzYgMjIuMjg0ODYzIDM1LjY5MjEzNkMgMjkuMDcwOTA5IDM1LjY5MjEzNiAzNC41NzE1NyAyOS45NDAxOSAzNC41Njk3MjYgMjIuODQ2MDY2QyAzNC41NzE1NyAxNS43NTE5NDIgMjkuMDcwOTA5IDkuOTk5OTk2IDIyLjI4NDg2MyA5Ljk5OTk5NkMgMTUuNDk4ODE2IDkuOTk5OTk2IDkuOTk4MTU2IDE1Ljc1MTk0MiAxMCAyMi44NDYwNjYiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LXR4X2xvYWRkYXRhXzFkMzEwY3YxYnJ3OWhvLXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NzEuMjY0MzEyNzQ0MTQwNiwgMjMxKSI+PC9nPjxnIGlkPSJnLXJvb3QtMl8xdXBhMzJuMWMxdnJ3bC1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIzLjI2NDMxMjc0NDE0MDYsIDIyNSkiPjxnIGlkPSIyXzF1cGEzMm4xYzF2cndsLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjOTJiZDM5IiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gMTcuMTI1IDI1Ljc1MDE1MUMgMjAuNDM4NzA5IDI1Ljc1MDE1MSAyMy4xMjUgMjQuNjc1NjcxIDIzLjEyNSAyMy4zNTAxOEMgMjMuMTI1IDIyLjAyNDcwNCAyMC40Mzg3MDkgMjAuOTUwMTggMTcuMTI1IDIwLjk1MDE4QyAxMy44MTEyOSAyMC45NTAxOCAxMS4xMjUgMjIuMDI0NzA0IDExLjEyNSAyMy4zNTAxOEMgMTEuMTI1IDI0LjY3NTY3MSAxMy44MTEyOSAyNS43NTAxNTEgMTcuMTI1IDI1Ljc1MDE1MVpNIDExLjEyNSAyMy4zNDk5NTVMIDExLjEyNSAzMi45NTAwMDFDIDExLjEyNSAzNC4zMDAwMDMgMTMuODI1IDM1LjM0OTk5OCAxNy4xMjUgMzUuMzQ5OTk4QyAyMC40MjQ5OTkgMzUuMzQ5OTk4IDIzLjEyNSAzNC4zMDAwMDMgMjMuMTI1IDMyLjk1MDAwMUwgMjMuMTI1IDIzLjM0OTk1NU0gNDAuOTAyMSAxNS4wNTk5NUMgNDMuMDIyOTQ5IDE1LjA1OTk1IDQ0Ljc0MjEgMTQuMTI4NzA1IDQ0Ljc0MjEgMTIuOTc5OTU5QyA0NC43NDIxIDExLjgzMTIgNDMuMDIyOTQ5IDEwLjg5OTk1MiA0MC45MDIxIDEwLjg5OTk1MkMgMzguNzgxMzk5IDEwLjg5OTk1MiAzNy4wNjIxMDMgMTEuODMxMiAzNy4wNjIxMDMgMTIuOTc5OTU5QyAzNy4wNjIxMDMgMTQuMTI4NzA1IDM4Ljc4MTM5OSAxNS4wNTk5NSA0MC45MDIxIDE1LjA1OTk1Wk0gMzcuMDYyMTAzIDEyLjk4MDAzNUwgMzcuMDYyMTAzIDE4LjQyMDAyNUMgMzcuMDYyMTAzIDE5LjU0MDAzIDM4LjgyMjIwMSAyMC41MDAwMzEgNDAuOTAyMSAyMC41MDAwMzFDIDQyLjk4MjE1MSAyMC41MDAwMzEgNDQuNzQyMSAxOS41NDAwMyA0NC43NDIxIDE4LjQyMDAyNUwgNDQuNzQyMSAxMi45ODAwMzVNIDQwLjkwMjEgMjcuNTIwMTUxQyA0My4wMjI5NDkgMjcuNTIwMTUxIDQ0Ljc0MjEgMjYuNTg4OCA0NC43NDIxIDI1LjQ0MDFDIDQ0Ljc0MjEgMjQuMjkxMzU1IDQzLjAyMjk0OSAyMy4zNjAxMTEgNDAuOTAyMSAyMy4zNjAxMTFDIDM4Ljc4MTM5OSAyMy4zNjAxMTEgMzcuMDYyMTAzIDI0LjI5MTM1NSAzNy4wNjIxMDMgMjUuNDQwMUMgMzcuMDYyMTAzIDI2LjU4ODggMzguNzgxMzk5IDI3LjUyMDE1MSA0MC45MDIxIDI3LjUyMDE1MVpNIDM3LjA2MjEwMyAyNS40NDAyNUwgMzcuMDYyMTAzIDMwLjg4MDE1QyAzNy4wNjIxMDMgMzIuMDAwMTk4IDM4LjgyMjIwMSAzMi45NjAyMDEgNDAuOTAyMSAzMi45NjAyMDFDIDQyLjk4MjE1MSAzMi45NjAyMDEgNDQuNzQyMSAzMi4wMDAxOTggNDQuNzQyMSAzMC44ODAxNUwgNDQuNzQyMSAyNS40NDAyNU0gNDAuOTAyMSAzOS42NTk5NUMgNDMuMDIyOTQ5IDM5LjY1OTk1IDQ0Ljc0MjEgMzguNzI4NzUyIDQ0Ljc0MjEgMzcuNTc5OTAzQyA0NC43NDIxIDM2LjQzMTE5OCA0My4wMjI5NDkgMzUuNSA0MC45MDIxIDM1LjVDIDM4Ljc4MTM5OSAzNS41IDM3LjA2MjEwMyAzNi40MzExOTggMzcuMDYyMTAzIDM3LjU3OTkwM0MgMzcuMDYyMTAzIDM4LjcyODc1MiAzOC43ODEzOTkgMzkuNjU5OTUgNDAuOTAyMSAzOS42NTk5NVpNIDM3LjA2MjEwMyAzNy41ODAwNDhMIDM3LjA2MjEwMyA0My4wMjAxQyAzNy4wNjIxMDMgNDQuMTM5OTk5IDM4LjgyMjIwMSA0NS4wOTk5OTggNDAuOTAyMSA0NS4wOTk5OThDIDQyLjk4MjE1MSA0NS4wOTk5OTggNDQuNzQyMSA0NC4xMzk5OTkgNDQuNzQyMSA0My4wMjAxTCA0NC43NDIxIDM3LjU4MDA0OE0gMzMuNDY4NyAxNS41NUwgMzAuNDY4NyAxNS41NUwgMzAuNDY4NyA0MC40NDk5OTdMIDMzLjQ2ODcgNDAuNDQ5OTk3TSAzMy40Njg3IDI4TCAyNi43MTg3IDI4TSAxMS4xMjUgMjguMTk2NjVDIDExLjEyNSAyOS40NjUzNTEgMTMuNzE5NTk1IDMwLjUwMzIwMSAxNy4xMjUwMzEgMzAuNTAzMjAxQyAyMC41MzA0NDkgMzAuNTAzMjAxIDIzLjEyNTA0NCAyOS40NjUzNTEgMjMuMTI1MDQ0IDI4LjE5NjY1Ij48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC10eF9pbnN0YWxsZF8xOG50emJqMWJydzc0NS1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDcxLjI2NDMxMjc0NDE0MDYsIDE3MSkiPjwvZz48ZyBpZD0iZy1yb290LTRfaHZ3MHN2MWMxZGo0MC1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIzLjI2NDMxMjc0NDE0MDYsIDI4NSkiPjxnIGlkPSI0X2h2dzBzdjFjMWRqNDAtc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiMxZWFiZGEiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSAyNS4zNzUgMjYuNzUwNUwgMzEuMzkzIDI2Ljc1MDVMIDMxLjI0MyAzMS43NUwgMzcuMDkzMDAyIDI2Ljc1MDVMIDQzLjI0MyAyNi43NTA1QyA0My43NzQ4NiAyNi43NTI0OTUgNDQuMjg1NTk1IDI2LjU0MjUwOSA0NC42NjIyNDMgMjYuMTY2OTg4QyA0NS4wMzg4ODcgMjUuNzkxNDcgNDUuMjUwNDA0IDI1LjI4MTM2MSA0NS4yNSAyNC43NDk1TCA0NS4yNSAxMi43NDk1QyA0NS4yNSAxMS42NDUyMDYgNDQuMzU0Nzk0IDEwLjc1IDQzLjI1MDUgMTAuNzVMIDI1LjI1MDUgMTAuNzVDIDI0LjE0NTYyMiAxMC43NDkxNzEgMjMuMjQ5NSAxMS42NDQ2MjEgMjMuMjQ5NSAxMi43NDk1TCAyMy4yNDk1IDIwLjVNIDMxIDIyLjc1TCAzNC43NSAxNC41TCAzOC41IDIyLjc1TSAzMS44MzA5OTkgMjAuOTIxNTAxTCAzNy42Njg5OTkgMjAuOTIxNTAxTSAyNy4yNSA0My43NUMgMjcuMjUgNDQuNTc4NDI2IDI2LjU3ODQyOCA0NS4yNSAyNS43NSA0NS4yNUwgMTIuMjUgNDUuMjVDIDExLjQyMTU3MyA0NS4yNSAxMC43NSA0NC41Nzg0MjYgMTAuNzUgNDMuNzVMIDEwLjc1IDM4LjVDIDEwLjc1IDMzLjk0MzY1MyAxNC40NDM2NTEgMzAuMjUwMDAyIDE5IDMwLjI1MDAwMkMgMjMuNTU2MzQ5IDMwLjI1MDAwMiAyNy4yNSAzMy45NDM2NTMgMjcuMjUgMzguNVpNIDEwLjc1IDQwLjc1TCAyNy4yNSA0MC43NU0gMTUuMjUgMzYuNjI1QyAxNS4yNSAzNi44MzIxMDggMTUuNDE3ODkzIDM3IDE1LjYyNSAzN0MgMTUuODMyMTA3IDM3IDE2IDM2LjgzMjEwOCAxNiAzNi42MjVDIDE2IDM2LjQxNzg5MiAxNS44MzIxMDcgMzYuMjUgMTUuNjI1IDM2LjI1QyAxNS40MTc4OTMgMzYuMjUgMTUuMjUgMzYuNDE3ODkyIDE1LjI1IDM2LjYyNU0gMjIgMzYuNjI1QyAyMiAzNi44MzIxMDggMjIuMTY3ODkyIDM3IDIyLjM3NSAzN0MgMjIuNTgyMTA4IDM3IDIyLjc1IDM2LjgzMjEwOCAyMi43NSAzNi42MjVDIDIyLjc1IDM2LjQxNzg5MiAyMi41ODIxMDggMzYuMjUgMjIuMzc1IDM2LjI1QyAyMi4xNjc4OTIgMzYuMjUgMjIgMzYuNDE3ODkyIDIyIDM2LjYyNU0gMTkgMzAuMjVMIDE5IDI3LjI1TSAxNi43NSAyNUMgMTYuNzUgMjYuMjQyNjQxIDE3Ljc1NzM2IDI3LjI1IDE5IDI3LjI1QyAyMC4yNDI2NDEgMjcuMjUgMjEuMjUgMjYuMjQyNjQxIDIxLjI1IDI1QyAyMS4yNSAyMy43NTczNiAyMC4yNDI2NDEgMjIuNzUgMTkgMjIuNzVDIDE3Ljc1NzM2IDIyLjc1IDE2Ljc1IDIzLjc1NzM2IDE2Ljc1IDI1Ij48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC10eF9wcmV0cmFpbl8xcWVoaXE3MWJydzd3ci1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDcxLjI2NDMxMjc0NDE0MDYsIDI3OSkiPjwvZz48ZyBpZD0iZy1yb290LXB5dGhfOTNkaDViMWMxcms3NS1zdHJva2UiIGRhdGEtaXRlbS1vcmRlcj0iMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDIzLjI2NDMxMjc0NDE0MDYsIDE2NSkiPjxnIGlkPSJweXRoXzkzZGg1YjFjMXJrNzUtc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiMzY2M1ODMiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSAxOS43NSAyMC41TCAyNy4xMzI5OTkgMjAuNU0gMjguODY3MDAxIDM1LjVMIDM2LjI1IDM1LjVNIDMwLjI1IDQwLjc1QyAzMC4yNSA0MS4xNjQyMTUgMzAuNTg1Nzg3IDQxLjUgMzEgNDEuNUMgMzEuNDE0MjEzIDQxLjUgMzEuNzUgNDEuMTY0MjE1IDMxLjc1IDQwLjc1QyAzMS43NSA0MC4zMzU3ODUgMzEuNDE0MjEzIDQwIDMxIDQwQyAzMC41ODU3ODcgNDAgMzAuMjUgNDAuMzM1Nzg1IDMwLjI1IDQwLjc1TSAyNC4yNSAxNS4yNUMgMjQuMjUgMTUuNjY0MjEzIDI0LjU4NTc4NyAxNiAyNSAxNkMgMjUuNDE0MjEzIDE2IDI1Ljc1IDE1LjY2NDIxMyAyNS43NSAxNS4yNUMgMjUuNzUgMTQuODM1Nzg3IDI1LjQxNDIxMyAxNC41IDI1IDE0LjVDIDI0LjU4NTc4NyAxNC41IDI0LjI1IDE0LjgzNTc4NyAyNC4yNSAxNS4yNU0gNDQuMTUyIDIxLjU0OTk5OUMgNDMuOTU1Mjk5IDIwLjkyNDUzNiA0My4zNzUxNjQgMjAuNDk5MzA2IDQyLjcxOTQ5OCAyMC41TCAzNi4yNSAyMC41TCAzNi4yNSAxMy4yODA1QyAzNi4yNTA2OTQgMTIuNjI0ODM2IDM1LjgyNTQ2MiAxMi4wNDQ2OTkgMzUuMTk5OTk3IDExLjg0OEMgMzAuNTExNjg0IDEwLjM4MzY0NyAyNS40ODgzMTYgMTAuMzgzNjQ3IDIwLjgwMDAwMSAxMS44NDhDIDIwLjE3NDUzNiAxMi4wNDQ2OTkgMTkuNzQ5MzA2IDEyLjYyNDgzNiAxOS43NSAxMy4yODA1TCAxOS43NSAyMC41TCAxMy4yODA1IDIwLjVDIDEyLjYyNDgzNiAyMC40OTkzMDYgMTIuMDQ0Njk5IDIwLjkyNDUzNiAxMS44NDggMjEuNTQ5OTk5QyAxMC4zODI1OTIgMjUuNzI1MTQ5IDEwLjM4MjU5MiAzMC4yNzQ4NDkgMTEuODQ4IDM0LjQ0OTk5N0MgMTIuMDQ0Njk5IDM1LjA3NTQ2MiAxMi42MjQ4MzYgMzUuNTAwNjk0IDEzLjI4MDUgMzUuNUwgMTkuNzUgMzUuNUwgMTkuNzUgNDIuNzE5NDk4QyAxOS43NDkzMDYgNDMuMzc1MTY0IDIwLjE3NDUzNiA0My45NTUyOTkgMjAuNzk5OTk5IDQ0LjE1MkMgMjUuNDg4MzE2IDQ1LjYxNjM1NiAzMC41MTE2ODQgNDUuNjE2MzU2IDM1LjIwMDAwMSA0NC4xNTJDIDM1LjgyNTQ2MiA0My45NTUyOTkgMzYuMjUwNjk0IDQzLjM3NTE2NCAzNi4yNSA0Mi43MTk0OThMIDM2LjI1IDM1LjVMIDQyLjcxOTQ5OCAzNS41QyA0My4zNzUxNjQgMzUuNTAwNjk0IDQzLjk1NTI5OSAzNS4wNzU0NjIgNDQuMTUyIDM0LjQ0OTk5N0MgNDUuNjE3NDA5IDMwLjI3NDg0OSA0NS42MTc0MDkgMjUuNzI1MTQ5IDQ0LjE1MiAyMS41NDk5OTlaTSAxOS43NSAzNS41TCAxOS43NSAzNEMgMTkuNzUgMzAuNjg2MjkxIDIyLjQzNjI5MSAyOCAyNS43NSAyOEwgMzAuMjUgMjhDIDMzLjU2MzcwOSAyOCAzNi4yNSAyNS4zMTM3MDkgMzYuMjUgMjJMIDM2LjI1IDIwLjUiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LXR4X2Nob29zZWdwX3pzNnoybjFicnc3d3Utc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MS4yNjQzMTI3NDQxNDA2LCAxMTEpIj48L2c+PGcgaWQ9Imctcm9vdC1zaGFyX3FzNWJ0YjFjMXN5eXAtc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQyMy4yNjQzMTI3NDQxNDA2LCAzNDUpIj48ZyBpZD0ic2hhcl9xczVidGIxYzFzeXlwLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjZGU1OGE5IiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gMzAuNjgzNSAxMC43NUwgNDMuNzE3MDAzIDEwLjc1QyA0My43MTcwMDMgMTAuNzUgNDUuMjUgMTAuNzUgNDUuMjUgMTIuMjgzTCA0NS4yNSAyNC41NDk5OTlDIDQ1LjI1IDI0LjU0OTk5OSA0NS4yNSAyNi4wODMgNDMuNzE3MDAzIDI2LjA4M0wgMzAuNjgzNSAyNi4wODNDIDMwLjY4MzUgMjYuMDgzIDI5LjE1MDUwMSAyNi4wODMgMjkuMTUwNTAxIDI0LjU0OTk5OUwgMjkuMTUwNTAxIDEyLjI4M0MgMjkuMTUwNTAxIDEyLjI4MyAyOS4xNTA1MDEgMTAuNzUgMzAuNjgzNSAxMC43NU0gMjkuMTUwNTAxIDE1Ljk3MTVMIDQ1LjI1IDE1Ljk3MTVNIDI5LjE1MDUwMSAyMS4wMjhMIDQ1LjI1IDIxLjAyOE0gMzYuNDMxNDk5IDE1Ljk3MTVMIDM2LjQzMTQ5OSAyNi4wODNNIDQwLjc0ODUwMSAxNS45NzE1TCA0MC43NDg1MDEgMjYuMDgzTSAxNy42NSAyMC4yMDAwMDFMIDE0LjIgMjMuNUwgMTQuMiAyMC4yMDAwMDFDIDE0LjI0OTIxNCAxNy43MDg3MDQgMTYuMzA5MjI1IDE1LjcyOTI5NCAxOC44MDA1MDEgMTUuNzc5NUwgMjQuNTQ5OTk5IDE1Ljc3OTVNIDEwLjc1IDIwLjIwMDAwMUwgMTQuMiAyMy41MDc1TSAyMS4xIDEyLjQ2NzVMIDI0LjU0OTk5OSAxNS43Nzk1TCAyMS4xIDE5LjA5MTQ5OU0gMTIuMjgzIDI3LjYxNjAwMUwgMjAuNzE3NTAxIDI3LjYxNjAwMUMgMjAuNzE3NTAxIDI3LjYxNjAwMSAyMi4yNTA1IDI3LjYxNjAwMSAyMi4yNTA1IDI5LjE0OTAwMkwgMjIuMjUwNSA0My43MTcwMDNDIDIyLjI1MDUgNDMuNzE3MDAzIDIyLjI1MDUgNDUuMjUgMjAuNzE3NTAxIDQ1LjI1TCAxMi4yODMgNDUuMjVDIDEyLjI4MyA0NS4yNSAxMC43NSA0NS4yNSAxMC43NSA0My43MTcwMDNMIDEwLjc1IDI5LjE0OTAwMkMgMTAuNzUgMjkuMTQ5MDAyIDEwLjc1IDI3LjYxNjAwMSAxMi4yODMgMjcuNjE2MDAxTSAxMC43NSA0MC42NDk1MDJMIDIyLjI1MDUgNDAuNjQ5NTAyIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC10eF9ncnBvb3B0aV85MGd6ejFicnc3YjYtc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MS4yNjQzMTI3NDQxNDA2LCAzNTEuMDAwMTIyMDcwMzEyNSkiPjwvZz48ZyBpZD0iZy1yb290LWZpcmVfMXFjbDRwYjFjMWV5MnMtc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQyMy4yNjQzMTI3NDQxNDA2LCAxMDUpIj48ZyBpZD0iZmlyZV8xcWNsNHBiMWMxZXkycy1zdHJva2UiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjQiIHN0cm9rZT0iIzRlODhlNyIgc3Ryb2tlLXdpZHRoPSIyIj48Zz48cGF0aCBkPSJNIDMzLjI1IDI4Ljc1TCAzMy4yNSAzOS4yNUMgMzMuMjUgNDAuMDc4NDI2IDMyLjU3ODQyNiA0MC43NSAzMS43NSA0MC43NUwgMTYuNzUgNDAuNzVDIDE1LjkyMTU3MyA0MC43NSAxNS4yNSA0MC4wNzg0MjYgMTUuMjUgMzkuMjVMIDE1LjI1IDI0LjI1QyAxNS4yNSAyMy40MjE1NzIgMTUuOTIxNTczIDIyLjc1IDE2Ljc1IDIyLjc1TCAzMC4yNSAyMi43NU0gMjQuMjUgNDAuNzVMIDI0LjI1IDQ1LjI1TSAzMC4yNSA0MC43NUwgMzAuMjUgNDUuMjVNIDI0LjI1IDE4LjI1TCAyNC4yNSAyMi43NU0gMTguMjUgNDAuNzVMIDE4LjI1IDQ1LjI1TSAxOC4yNSAxOC4yNUwgMTguMjUgMjIuNzVNIDMzLjI1IDM3Ljc1TCAzNy43NSAzNy43NU0gMTUuMjUgMzEuNzVMIDEwLjc1IDMxLjc1TSAzNy43NSAzMS43NUwgMzMuMjUgMzEuNzVNIDE1LjI1IDI1Ljc1TCAxMC43NSAyNS43NU0gMTUuMjUgMzcuNzVMIDEwLjc1IDM3Ljc1TSAxOC4yNSAyNS43NUwgMzAuMjUgMjUuNzVMIDMwLjI1IDM3Ljc1TCAxOC4yNSAzNy43NVpNIDM3IDEwLjc1QyAzOS4yMzg0MDMgMTIuNTY0MDY2IDM5Ljg2ODUgMTUuNzE0NTU0IDM4LjUgMTguMjVDIDM3LjcxNTY1MiAxNy43MzQzNjQgMzcuMTc0MzAxIDE2LjkyMjMzNyAzNyAxNkMgMzQuNzQzMDM0IDE2Ljc1MDYzMSAzMy4yMjgwNjkgMTguODcxNTg2IDMzLjI1IDIxLjI1QyAzMy4yNSAyNC41NjM3MDkgMzUuOTM2MjkxIDI3LjI1IDM5LjI1IDI3LjI1QyA0Mi41NjM3MDkgMjcuMjUgNDUuMjUgMjQuNTYzNzA5IDQ1LjI1IDIxLjI1QyA0NS4xOTkxODEgMTYuMjg0MTQ5IDQxLjgxMjg0MyAxMS45NzQyNiAzNyAxMC43NVoiPjwvcGF0aD48L2c+PC9nPjwvZz48ZyBpZD0iZy1yb290LXR4X3B1c2htb2RlX3ZiNGlyejFicnc2aXctc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ3MS4yNjQzMTI3NDQxNDA2LCA0NzEuMDAwMTIyMDcwMzEyNSkiPjwvZz48ZyBpZD0iZy1yb290LXNjcmlfMXVxaXV4YjFjMWV6bm4tc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQyMy4yNjQzMTI3NDQxNDA2LCA0MDUuMDAwMTIyMDcwMzEyNSkiPjxnIGlkPSJzY3JpXzF1cWl1eGIxYzFlem5uLXN0cm9rZSIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iNCIgc3Ryb2tlPSIjYmE1ZGU1IiBzdHJva2Utd2lkdGg9IjIiPjxnPjxwYXRoIGQ9Ik0gMTIuMjUgMTAuNzVMIDQzLjc1IDEwLjc1QyA0My43NSAxMC43NSA0NS4yNSAxMC43NSA0NS4yNSAxMi4yNUwgNDUuMjUgNDMuNzVDIDQ1LjI1IDQzLjc1IDQ1LjI1IDQ1LjI1IDQzLjc1IDQ1LjI1TCAxMi4yNSA0NS4yNUMgMTIuMjUgNDUuMjUgMTAuNzUgNDUuMjUgMTAuNzUgNDMuNzVMIDEwLjc1IDEyLjI1QyAxMC43NSAxMi4yNSAxMC43NSAxMC43NSAxMi4yNSAxMC43NU0gMzMuMjUgMzdDIDMzLjI1IDM5LjA3MTA2OCAzNC45Mjg5MzIgNDAuNzUgMzcgNDAuNzVDIDM5LjA3MTA2OCA0MC43NSA0MC43NSAzOS4wNzEwNjggNDAuNzUgMzdDIDQwLjc1IDM0LjkzIDM5LjI1IDM0IDM3IDMzLjI1QyAzNC43NSAzMi41IDMzLjI1IDMxLjU3IDMzLjI1IDI5LjVDIDMzLjI1IDI3LjQyODkzMiAzNC45Mjg5MzIgMjUuNzUgMzcgMjUuNzVDIDM5LjA3MTA2OCAyNS43NSA0MC43NSAyNy40Mjg5MzIgNDAuNzUgMjkuNU0gMjAuNSAyNS43NUwgMjkuNSAyNS43NU0gMjUgMjUuNzVMIDI1IDQwLjc1Ij48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC10eF90ZXh0Z2VuZV9kanVpYTcxYnJ3OHcxLXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NzEuMjY0MzEyNzQ0MTQwNiwgNDExLjAwMDEyMjA3MDMxMjUpIj48L2c+PGcgaWQ9Imctcm9vdC1mZWF0X2hyaWl2ajFjMWFwemMtc3Ryb2tlIiBkYXRhLWl0ZW0tb3JkZXI9IjAiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQyMy4yNjQzMTI3NDQxNDA2LCA0NjUuMDAwMTIyMDcwMzEyNSkiPjxnIGlkPSJmZWF0X2hyaWl2ajFjMWFwemMtc3Ryb2tlIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSI0IiBzdHJva2U9IiNkZTg0MzEiIHN0cm9rZS13aWR0aD0iMiI+PGc+PHBhdGggZD0iTSAxMC43NSAyMy41TCA0NS4yNSAyMy41TCA0NS4yNSAzMi41TCAxMC43NSAzMi41Wk0gMjMuNSAxMC43NUwgMzIuNSAxMC43NUwgMzIuNSAxOS43NUwgMjMuNSAxOS43NVpNIDIzLjUgMzYuMjVMIDMyLjUgMzYuMjVMIDMyLjUgNDUuMjVMIDIzLjUgNDUuMjVaIj48L3BhdGg+PC9nPjwvZz48L2c+PGcgaWQ9Imctcm9vdC10eF9maW5ldHVuaV92Y2RneTcxYnJ3OHAzLXN0cm9rZSIgZGF0YS1pdGVtLW9yZGVyPSIwIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMzMuMjY0MjgyMjI2NTYyNSwgMjcpIj48L2c+PC9nPjwvZz48L3N2Zz4=)\n",
19
+ "\n",
20
+ "\n",
21
+ "<small>*Repository: [elswa-dev/notebook-courses](https://huggingface.co/elswa-dev/notebook-courses)*</small>"
22
+ ],
23
+ "metadata": {
24
+ "id": "pZ3PeFCfiE0R"
25
+ }
26
+ },
27
+ {
28
+ "cell_type": "markdown",
29
+ "source": [
30
+ "# **For this course you should already understand basic concepts in large language models, so here's a quick recap in very simple terms.**\n",
31
+ "\n",
32
+ "\n",
33
+ "**What is LLM Training (from scratch)?**\n",
34
+ "\n",
35
+ "\n",
36
+ "\n",
37
+ "Imagine you have a big, empty coloring book. Training an LLM from scratch is like filling in that entire book with colors—starting with a completely blank page. The model begins with no idea of language; it must learn everything by looking at a vast amount of text and figuring out the patterns, grammar, and meaning on its own. This process needs a lot of time, huge amounts of data, and significant computational power, much like teaching a child language from zero.\n",
38
+ "\n",
39
+ "**What is LLM Fine-Tuning?**\n",
40
+ "\n",
41
+ "\n",
42
+ "\n",
43
+ "Now imagine that you already have a coloring book where most of the pictures are nicely colored in, but you want to change a few specific images to better suit your taste. Fine-tuning is like that: you take a pre-trained model (one that already has a good grasp of language) and give it extra, focused lessons to improve its performance on a specific task or style. Instead of starting all over again, you’re just tweaking and refining what the model already knows.\n",
44
+ "\n",
45
+ "**The Key Difference**\n",
46
+ "\n",
47
+ "\n",
48
+ "The big difference is where you start. Training from scratch means beginning with nothing and building up all the knowledge from the ground up, while fine-tuning starts with an already knowledgeable model and customizes it for a particular purpose for example reasoning."
49
+ ],
50
+ "metadata": {
51
+ "id": "jE2wyM7eKaB3"
52
+ }
53
+ },
54
+ {
55
+ "cell_type": "markdown",
56
+ "source": [
57
+ "#Prerequisites\n",
58
+ "\n",
59
+ "**Before you begin, please ensure the following:**\n",
60
+ "\n",
61
+ "Hugging Face Account:\n",
62
+ "Create an account at [Hugging Face](https://colab.research.google.com/drive/16wuZjYRKrwd0l9J6zAGN62sHq2vfmKqZ#scrollTo=BOUVMas8C_ep&line=1&uniqifier=1) if you haven’t already.\n",
63
+ "\n",
64
+ "Once signed in, go to your account settings and generate a personal access token. This token is useful when you need to download models or datasets that require authentication.\n",
65
+ "\n",
66
+ "\n",
67
+ "Weights & Biases (W&B) Account:\n",
68
+ "Sign up at [Weights & Biases](https://wandb.ai/register). After registration, head over to your profile or account settings to obtain your personal API token. This token allows you to log your experiments and track training metrics through W&B."
69
+ ],
70
+ "metadata": {
71
+ "id": "BOUVMas8C_ep"
72
+ }
73
+ },
74
+ {
75
+ "cell_type": "markdown",
76
+ "metadata": {
77
+ "id": "dd4GYb6a0geP"
78
+ },
79
+ "source": [
80
+ "# Fine-tune LLMs with GRPO for e.g. reasoning\n",
81
+ "\n",
82
+ "how to finetune an LLM with GRPO, using the `trl` library.\n",
83
+ "\n",
84
+ "1. **Introduction**\n",
85
+ "* Imagine you want to teach a language model to write or answer questions better. We do that by starting with a “pre-trained” language model (kind of like a well-read student) and then fine tuning it so it becomes even smarter on a specific topic or style. In this course, we will use a method called GRPO (Group Relative Policy Optimization) that trains the model by comparing groups of its answers and rewarding the best ones, much like giving praise to the best drawings in a classroom.\n",
86
+ "\n",
87
+ "2. **Setting Up Your Google Colab Notebook**\n",
88
+ "\n",
89
+ "* Change the runtime to use a GPU for faster training (from the menu, click Runtime > Change runtime type and select GPU).\n",
90
+ "\n",
91
+ "\n",
92
+ "**Why This Is Important:**\n",
93
+ "\n",
94
+ "The notebook is like your digital notebook where you write instructions (code) and explanations. Using a GPU is similar to having a super fast computer helper for heavy tasks.\n",
95
+ "\n",
96
+ "3. **Install the Necessary Dependencies**\n",
97
+ "\n",
98
+ "* In the first code cell, install all the libraries needed to run the training. For our example, we need tools that help manage data, work with language models, efficiently fine tune with reinforcement learning, and even track our progress with charts.\n",
99
+ "\n",
100
+ "\n",
101
+ "Here’s a simple version of the installation cell:"
102
+ ]
103
+ },
104
+ {
105
+ "cell_type": "code",
106
+ "execution_count": null,
107
+ "metadata": {
108
+ "id": "l3IstgzN63QW"
109
+ },
110
+ "outputs": [],
111
+ "source": [
112
+ "!pip install -qqq datasets==3.2.0 transformers==4.47.1 trl==0.14.0 peft==0.14.0 accelerate==1.2.1 bitsandbytes==0.45.2 wandb==0.19.7 --progress-bar off\n",
113
+ "!pip install -qqq flash-attn --no-build-isolation --progress-bar off"
114
+ ]
115
+ },
116
+ {
117
+ "cell_type": "markdown",
118
+ "source": [
119
+ "— when installing dependencies you might see a message like:\n",
120
+ "\n",
121
+ "> ERROR: pip's dependency resolver does not currently take into account all the packages that are installed.\n",
122
+ "\n",
123
+ "You can safely ignore it— the training and fine tuning will still work as expected.\n",
124
+ "\n",
125
+ "\n",
126
+ "**Why This Is Important:**\n",
127
+ "Each package is like a tool in our toolbox:\n",
128
+ "\n",
129
+ "* *datasets and transformers* help us work with text data and language models.\n",
130
+ "* *trl* (for reinforcement learning) and *peft* (for efficient training) help us customize the training process.\n",
131
+ "* *wandb* tracks what happens during training, so we can see progress and fix issues if needed."
132
+ ],
133
+ "metadata": {
134
+ "id": "vf4qs2LWnnQD"
135
+ }
136
+ },
137
+ {
138
+ "cell_type": "markdown",
139
+ "metadata": {
140
+ "id": "Q9MjbDWR0geT"
141
+ },
142
+ "source": [
143
+ "## Load Dataset"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "markdown",
148
+ "source": [
149
+ "**What You Do:**\n",
150
+ "\n",
151
+ "Load a collection of examples (our dataset) from Hugging Face. In our case, the dataset has paired “prompts” (questions or instructions) and “completions” (answers or responses).\n",
152
+ "\n",
153
+ "Example code:"
154
+ ],
155
+ "metadata": {
156
+ "id": "7FPu2cpACZr-"
157
+ }
158
+ },
159
+ {
160
+ "cell_type": "code",
161
+ "execution_count": null,
162
+ "metadata": {
163
+ "collapsed": true,
164
+ "id": "5Y-X13wB7UP4"
165
+ },
166
+ "outputs": [],
167
+ "source": [
168
+ "import torch\n",
169
+ "import wandb\n",
170
+ "from datasets import load_dataset\n",
171
+ "from peft import LoraConfig, get_peft_model\n",
172
+ "from transformers import AutoModelForCausalLM, AutoTokenizer\n",
173
+ "from trl import GRPOConfig, GRPOTrainer\n",
174
+ "\n",
175
+ "# Log to Weights & Biases\n",
176
+ "wandb.login()\n",
177
+ "\n",
178
+ "# Load dataset\n",
179
+ "dataset = load_dataset(\"mlabonne/smoltldr\")\n",
180
+ "print(dataset)"
181
+ ]
182
+ },
183
+ {
184
+ "cell_type": "markdown",
185
+ "source": [
186
+ "**Why This Is Important:**\n",
187
+ "Think of the dataset like a set of flash cards. The model learns from these examples so that when it gets a new question, it knows what kinds of answers look good."
188
+ ],
189
+ "metadata": {
190
+ "id": "y4HqxagjqkI6"
191
+ }
192
+ },
193
+ {
194
+ "cell_type": "markdown",
195
+ "metadata": {
196
+ "id": "Y1tlrHXB0geU"
197
+ },
198
+ "source": [
199
+ "## Load Model"
200
+ ]
201
+ },
202
+ {
203
+ "cell_type": "markdown",
204
+ "source": [
205
+ "**What to do:**\n",
206
+ "\n",
207
+ "Load a pre-trained language model and its tokenizer. The tokenizer helps convert words into numbers that the model understands. We then add a special “LoRA” module to make the fine tuning process lighter and faster.\n",
208
+ "\n",
209
+ "Example code:"
210
+ ],
211
+ "metadata": {
212
+ "id": "69fISWv99oBX"
213
+ }
214
+ },
215
+ {
216
+ "cell_type": "code",
217
+ "execution_count": null,
218
+ "metadata": {
219
+ "id": "3tLRvi5i-Qls"
220
+ },
221
+ "outputs": [],
222
+ "source": [
223
+ "# Load model\n",
224
+ "model_id = \"HuggingFaceTB/SmolLM-135M-Instruct\"\n",
225
+ "model = AutoModelForCausalLM.from_pretrained(\n",
226
+ " model_id,\n",
227
+ " torch_dtype=\"auto\",\n",
228
+ " device_map=\"auto\",\n",
229
+ " attn_implementation=\"flash_attention_2\",\n",
230
+ ")\n",
231
+ "tokenizer = AutoTokenizer.from_pretrained(model_id)\n",
232
+ "\n",
233
+ "# Load LoRA\n",
234
+ "lora_config = LoraConfig(\n",
235
+ " task_type=\"CAUSAL_LM\",\n",
236
+ " r=16,\n",
237
+ " lora_alpha=32,\n",
238
+ " target_modules=\"all-linear\",\n",
239
+ ")\n",
240
+ "model = get_peft_model(model, lora_config)\n",
241
+ "print(model.print_trainable_parameters())"
242
+ ]
243
+ },
244
+ {
245
+ "cell_type": "markdown",
246
+ "source": [
247
+ "**Why This Is Important:**\n",
248
+ "\n",
249
+ "This step loads an already good “student” (the model) and prepares it to learn a little more without re-learning everything from scratch. The LoRA module acts like a shortcut to quickly tune only the important parts."
250
+ ],
251
+ "metadata": {
252
+ "id": "6spl1KEOq3GI"
253
+ }
254
+ },
255
+ {
256
+ "cell_type": "markdown",
257
+ "metadata": {
258
+ "id": "3P4Ww0-f0geV"
259
+ },
260
+ "source": [
261
+ "## Define Reward Function\n",
262
+ "\n",
263
+ "**What to do:**\n",
264
+ "\n",
265
+ "Set up a reward function. In reinforcement learning, the computer is given a score (reward) based on how good its answer is. For simplicity, we use a function that rewards answers that are about 50 characters long."
266
+ ]
267
+ },
268
+ {
269
+ "cell_type": "code",
270
+ "execution_count": null,
271
+ "metadata": {
272
+ "id": "745L0RC6-XBT"
273
+ },
274
+ "outputs": [],
275
+ "source": [
276
+ "# Reward function\n",
277
+ "def reward_len(completions, **kwargs):\n",
278
+ " return [-abs(50 - len(completion)) for completion in completions]"
279
+ ]
280
+ },
281
+ {
282
+ "cell_type": "markdown",
283
+ "source": [
284
+ "**Why This Is Important:**\n",
285
+ "\n",
286
+ "Imagine you’re playing a game where you get points based on how close you are to a target number. This function acts as the “score keeper” that tells the model whether it did well or needs more practice."
287
+ ],
288
+ "metadata": {
289
+ "id": "Kv3O4TrBrX7i"
290
+ }
291
+ },
292
+ {
293
+ "cell_type": "markdown",
294
+ "metadata": {
295
+ "id": "jFggiY3M0geX"
296
+ },
297
+ "source": [
298
+ "## Define Training Arguments\n",
299
+ "\n",
300
+ "**What You Do:**\n",
301
+ "\n",
302
+ "Set the parameters for training the model. This includes where to save your progress, how many examples to process at once, and how many times to go through the dataset.\n",
303
+ "Here’s a plain-English explanation of some key points:\n",
304
+ "1. output_dir: Where the computer saves its work (checkpoints).\n",
305
+ "2. learning_rate: How quickly the model adjusts its thinking. A small number means the model learns slowly and carefully.\n",
306
+ "3. per_device_train_batch_size: How many examples the model sees at once before making adjustments.\n",
307
+ "4. gradient_accumulation_steps: How many steps to combine so the model takes a smarter update (like saving multiple drafts before finalizing).\n",
308
+ "5. num_train_epochs: How many times the model goes through the entire set of examples.\n"
309
+ ]
310
+ },
311
+ {
312
+ "cell_type": "markdown",
313
+ "source": [
314
+ "## Fine Tune the Model with GRPOTrainer\n",
315
+ "\n",
316
+ "**What You Do:**\n",
317
+ "\n",
318
+ "Combine everything using a GRPO trainer. GRPO (Group Relative Policy Optimization) fine tunes the model by comparing groups of different answers and rewarding the best ones. We also use Weights & Biases (wandb) to track the training progress.\n",
319
+ "\n",
320
+ "A simplified version of the training cell might look like this:"
321
+ ],
322
+ "metadata": {
323
+ "id": "mQMYQSV5unk_"
324
+ }
325
+ },
326
+ {
327
+ "cell_type": "code",
328
+ "execution_count": null,
329
+ "metadata": {
330
+ "id": "NtiMrN480geX"
331
+ },
332
+ "outputs": [],
333
+ "source": [
334
+ "# Training arguments\n",
335
+ "training_args = GRPOConfig(\n",
336
+ " output_dir=\"GRPO\",\n",
337
+ " learning_rate=2e-5,\n",
338
+ " per_device_train_batch_size=8,\n",
339
+ " gradient_accumulation_steps=2,\n",
340
+ " max_prompt_length=512,\n",
341
+ " max_completion_length=96,\n",
342
+ " num_generations=8,\n",
343
+ " optim=\"adamw_8bit\",\n",
344
+ " num_train_epochs=1,\n",
345
+ " bf16=True,\n",
346
+ " report_to=[\"wandb\"],\n",
347
+ " remove_unused_columns=False,\n",
348
+ " logging_steps=1,\n",
349
+ ")\n",
350
+ "\n",
351
+ "# Trainer\n",
352
+ "trainer = GRPOTrainer(\n",
353
+ " model=model,\n",
354
+ " reward_funcs=[reward_len],\n",
355
+ " args=training_args,\n",
356
+ " train_dataset=dataset[\"train\"],\n",
357
+ ")\n",
358
+ "\n",
359
+ "# Train model\n",
360
+ "wandb.init(project=\"GRPO\")\n",
361
+ "trainer.train()"
362
+ ]
363
+ },
364
+ {
365
+ "cell_type": "markdown",
366
+ "source": [
367
+ "**Why This Is Important:**\n",
368
+ "\n",
369
+ "These configurations are like setting the rules and pace for studying. They ensure the model learns steadily without overwhelming the computer.\n",
370
+ "\n",
371
+ "The trainer goes over each example, checks the group of generated answers, and uses the reward function to figure out which answers are best. With every step, the model “learns” from its mistakes—much like practicing math problems and improving over time"
372
+ ],
373
+ "metadata": {
374
+ "id": "ILhtAr8-sL67"
375
+ }
376
+ },
377
+ {
378
+ "cell_type": "markdown",
379
+ "metadata": {
380
+ "id": "JUqHI2Ah0geX"
381
+ },
382
+ "source": [
383
+ "## Wrap-Up & Push Model to Hub\n",
384
+ "\n",
385
+ "After training, you can save your fine tuned model so that later you (or your colleagues) can use it to generate better answers. A code cell for saving might look like this: Where you need to give your fine-tuned model an name or enhance the existing as i did with ...*reason-we*"
386
+ ]
387
+ },
388
+ {
389
+ "cell_type": "code",
390
+ "execution_count": null,
391
+ "metadata": {
392
+ "id": "oKHhpA4z-sRF"
393
+ },
394
+ "outputs": [],
395
+ "source": [
396
+ "# Save model\n",
397
+ "merged_model = trainer.model.merge_and_unload()\n",
398
+ "merged_model.push_to_hub(\"HuggingFaceTB/SmolLM-135M-Instruct-reason-we\", private=False)"
399
+ ]
400
+ },
401
+ {
402
+ "cell_type": "markdown",
403
+ "source": [
404
+ "**Why This Is Important:**\n",
405
+ "\n",
406
+ "Saving the model is like keeping your best project in a folder—you can share it, build upon it, and use it to answer real-world questions."
407
+ ],
408
+ "metadata": {
409
+ "id": "KzVobAX0tNsw"
410
+ }
411
+ },
412
+ {
413
+ "cell_type": "markdown",
414
+ "metadata": {
415
+ "id": "oJcrL4z60geY"
416
+ },
417
+ "source": [
418
+ "## Generate Text\n",
419
+ "\n",
420
+ "In the final section, you use your newly fine tuned language model to produce written responses from text prompts. Once the model has learned during training, this section shows you how to \"ask\" the model for a response and then translate the model’s internal numerical output back into readable text. In simple terms, it’s the part where you put your model to the test by giving it a sentence or question and letting it complete or respond.\n",
421
+ "\n",
422
+ "**How It Works**\n",
423
+ "\n",
424
+ "Imagine your model is like a child who has just finished learning from lots of flash cards. Now, you give the child a prompt—like “Tell me a story about a brave knight”—and ask them to make up a story. The Generate Text section is where you let the model “speak” by running its built-in text-generation function. The steps typically include:\n",
425
+ "\n",
426
+ "* Preparing the Prompt: You write a prompt (the question or sentence you want the model to complete).\n",
427
+ "* Tokenizing the Prompt: The model doesn’t understand plain text; it turns your words into numbers using a process called tokenization.\n",
428
+ "\n",
429
+ "* Generating Output: The model then uses its learned knowledge to predict what token (number) comes next repeatedly until it creates a complete response.\n",
430
+ "* Decoding the Output: Finally, the sequence of numbers is converted back into human-readable text.\n",
431
+ "\n",
432
+ "\n",
433
+ "What the Code Looks Like\n",
434
+ "An example code snippet in a Google Colab notebook for the Generate Text section might be:"
435
+ ]
436
+ },
437
+ {
438
+ "cell_type": "code",
439
+ "execution_count": null,
440
+ "metadata": {
441
+ "id": "RsLvPu1z0geY"
442
+ },
443
+ "outputs": [],
444
+ "source": [
445
+ "prompt = \"\"\"\n",
446
+ "# A long document about the Cat\n",
447
+ "\n",
448
+ "The cat (Felis catus), also referred to as the domestic cat or house cat, is a small\n",
449
+ "domesticated carnivorous mammal. It is the only domesticated species of the family Felidae.\n",
450
+ "Advances in archaeology and genetics have shown that the domestication of the cat occurred\n",
451
+ "in the Near East around 7500 BC. It is commonly kept as a pet and farm cat, but also ranges\n",
452
+ "freely as a feral cat avoiding human contact. It is valued by humans for companionship and\n",
453
+ "its ability to kill vermin. Its retractable claws are adapted to killing small prey species\n",
454
+ "such as mice and rats. It has a strong, flexible body, quick reflexes, and sharp teeth,\n",
455
+ "and its night vision and sense of smell are well developed. It is a social species,\n",
456
+ "but a solitary hunter and a crepuscular predator. Cat communication includes\n",
457
+ "vocalizations—including meowing, purring, trilling, hissing, growling, and grunting—as\n",
458
+ "well as body language. It can hear sounds too faint or too high in frequency for human ears,\n",
459
+ "such as those made by small mammals. It secretes and perceives pheromones.\n",
460
+ "\"\"\"\n",
461
+ "\n",
462
+ "messages = [\n",
463
+ " {\"role\": \"user\", \"content\": prompt},\n",
464
+ "]"
465
+ ]
466
+ },
467
+ {
468
+ "cell_type": "code",
469
+ "execution_count": null,
470
+ "metadata": {
471
+ "id": "6jbz8DYd-o7A"
472
+ },
473
+ "outputs": [],
474
+ "source": [
475
+ "# Generate text\n",
476
+ "from transformers import pipeline\n",
477
+ "\n",
478
+ "generator = pipeline(\"text-generation\", model=\"<your-model-id>\")\n",
479
+ "\n",
480
+ "## Or use the model and tokenizer we defined earlier\n",
481
+ "# generator = pipeline(\"text-generation\", model=model, tokenizer=tokenizer)\n",
482
+ "\n",
483
+ "generate_kwargs = {\n",
484
+ " \"max_new_tokens\": 256,\n",
485
+ " \"do_sample\": True,\n",
486
+ " \"temperature\": 0.5,\n",
487
+ " \"min_p\": 0.1,\n",
488
+ "}\n",
489
+ "\n",
490
+ "generated_text = generator(messages, generate_kwargs=generate_kwargs)\n",
491
+ "\n",
492
+ "print(generated_text)"
493
+ ]
494
+ },
495
+ {
496
+ "cell_type": "markdown",
497
+ "source": [
498
+ "**Why This Section Is Important**\n",
499
+ "\n",
500
+ "Imagine if after studying, you never got to answer any questions—you wouldn’t know if you understood the information! The Generate Text section is like a pop quiz for your model, showing you in real time if it learned properly during training. It gives you immediate feedback: you can see if the responses are clear, on-topic, or if further adjustments are needed."
501
+ ],
502
+ "metadata": {
503
+ "id": "9b9swdoo-59d"
504
+ }
505
+ },
506
+ {
507
+ "cell_type": "markdown",
508
+ "source": [
509
+ "### Greate! ✨\n",
510
+ "### You have fine-tuned your first model ✅"
511
+ ],
512
+ "metadata": {
513
+ "id": "WfNDbbD_D842"
514
+ }
515
+ }
516
+ ],
517
+ "metadata": {
518
+ "accelerator": "GPU",
519
+ "colab": {
520
+ "gpuType": "A100",
521
+ "machine_shape": "hm",
522
+ "provenance": []
523
+ },
524
+ "kernelspec": {
525
+ "display_name": "Python 3",
526
+ "name": "python3"
527
+ },
528
+ "language_info": {
529
+ "name": "python"
530
+ }
531
+ },
532
+ "nbformat": 4,
533
+ "nbformat_minor": 0
534
+ }