va<#Z$>1mx&+Wa`wLlffs{@W>k%OJp@=mHNW~Ph n9t5h9En!`)1mvEW#(I&Fw|(YxRv=~rVs;?r*gkVQ=SL3!R$y$} diff --git a/public/preview.png b/public/preview.png index 2151f06e55e34f594ddf35d384d047140c2c4ec0..be216da147fb145d8f625155bbfefed6b0a0e854 100644 GIT binary patch delta 36 ucmV+<0Nek}sS3%d3IvHzPDg> i) & 1; -} - - -// Usage: -get_ith_bit(10, 0); // Returns: 0 -get_ith_bit(10, 1); // Returns: 1 -get_ith_bit(10, 2); // Returns: 0 -get_ith_bit(10, 3); // Returns: 1 +--- +title: Get ith bit +description: Get the i-th bit of a number +tags: bit-manipulation, number, get +author: aelshinawy +--- + +```c +int get_ith_bit(int n, int i) { + return (n >> i) & 1; +} + + +// Usage: +get_ith_bit(10, 0); // Returns: 0 +get_ith_bit(10, 1); // Returns: 1 +get_ith_bit(10, 2); // Returns: 0 +get_ith_bit(10, 3); // Returns: 1 ``` \ No newline at end of file diff --git a/snippets/c/bit-manipulation/is-odd.md b/snippets/c/bit-manipulation/is-odd.md index 754f7684..24a86f6b 100644 --- a/snippets/c/bit-manipulation/is-odd.md +++ b/snippets/c/bit-manipulation/is-odd.md @@ -1,17 +1,17 @@ ---- -title: Is Odd -description: Check if a number is odd -tags: bit-manipulation, number, is-odd -author: aelshinawy ---- - -```c -bool is_odd(int n) { - return n & 1; -} - - -// Usage: -is_odd(10); // Returns: false -is_odd(11); // Returns: true +--- +title: Is Odd +description: Check if a number is odd +tags: bit-manipulation, number, is-odd +author: aelshinawy +--- + +```c +bool is_odd(int n) { + return n & 1; +} + + +// Usage: +is_odd(10); // Returns: false +is_odd(11); // Returns: true ``` \ No newline at end of file diff --git a/snippets/c/bit-manipulation/set-ith-bit.md b/snippets/c/bit-manipulation/set-ith-bit.md index de1d86c3..84ed52c8 100644 --- a/snippets/c/bit-manipulation/set-ith-bit.md +++ b/snippets/c/bit-manipulation/set-ith-bit.md @@ -1,19 +1,19 @@ ---- -title: Set ith bit -description: Set the i-th bit of a number and returns the resulting number -tags: bit-manipulation, number, set -author: aelshinawy ---- - -```c -int set_ith_bit(int n, int i) { - return n | (1 << i); -} - - -// Usage: -set_ith_bit(10, 0); // Returns: 11 -set_ith_bit(10, 2); // Returns: 14 -set_ith_bit(1, 8); // Returns: 257 -set_ith_bit(1, 3); // Returns: 9 +--- +title: Set ith bit +description: Set the i-th bit of a number and returns the resulting number +tags: bit-manipulation, number, set +author: aelshinawy +--- + +```c +int set_ith_bit(int n, int i) { + return n | (1 << i); +} + + +// Usage: +set_ith_bit(10, 0); // Returns: 11 +set_ith_bit(10, 2); // Returns: 14 +set_ith_bit(1, 8); // Returns: 257 +set_ith_bit(1, 3); // Returns: 9 ``` \ No newline at end of file diff --git a/snippets/c/bit-manipulation/swap-numbers.md b/snippets/c/bit-manipulation/swap-numbers.md index 14a377f1..79669ad0 100644 --- a/snippets/c/bit-manipulation/swap-numbers.md +++ b/snippets/c/bit-manipulation/swap-numbers.md @@ -1,20 +1,20 @@ ---- -title: Swap Numbers -description: Swap two numbers without a temporary variable -tags: bit-manipulation, number, swap -author: aelshinawy ---- - -```c -void swap(int *a, int *b) { - *a ^= *b; - *b ^= *a; - *a ^= *b; -} - - -// Usage: -int x = 5, y = 10; -swap(&x, &y); -printf("x = %d, y = %d\n", x, y); // x = 10, y = 5 +--- +title: Swap Numbers +description: Swap two numbers without a temporary variable +tags: bit-manipulation, number, swap +author: aelshinawy +--- + +```c +void swap(int *a, int *b) { + *a ^= *b; + *b ^= *a; + *a ^= *b; +} + + +// Usage: +int x = 5, y = 10; +swap(&x, &y); +printf("x = %d, y = %d\n", x, y); // x = 10, y = 5 ``` \ No newline at end of file diff --git a/snippets/c/bit-manipulation/toggle-ith-bit.md b/snippets/c/bit-manipulation/toggle-ith-bit.md index 0c3fd0fa..d8d7cc1b 100644 --- a/snippets/c/bit-manipulation/toggle-ith-bit.md +++ b/snippets/c/bit-manipulation/toggle-ith-bit.md @@ -1,18 +1,18 @@ ---- -title: Toggle ith bit -description: Toggle the i-th bit of a number and returns the resulting number -tags: bit-manipulation, number, toggle -author: aelshinawy ---- - -```c -int toggle_ith_bit(int n, int i) { - return n ^ (1 << i); -} - - -// Usage: -toggle_ith_bit(10, 0); // Returns: 11 -toggle_ith_bit(10, 1); // Returns: 8 -toggle_ith_bit(8, 1); // Returns: 10 +--- +title: Toggle ith bit +description: Toggle the i-th bit of a number and returns the resulting number +tags: bit-manipulation, number, toggle +author: aelshinawy +--- + +```c +int toggle_ith_bit(int n, int i) { + return n ^ (1 << i); +} + + +// Usage: +toggle_ith_bit(10, 0); // Returns: 11 +toggle_ith_bit(10, 1); // Returns: 8 +toggle_ith_bit(8, 1); // Returns: 10 ``` \ No newline at end of file diff --git a/snippets/java/array-manipulation/remove-duplicates.md b/snippets/java/array-manipulation/remove-duplicates.md index 4f25da30..a6fc9ef8 100644 --- a/snippets/java/array-manipulation/remove-duplicates.md +++ b/snippets/java/array-manipulation/remove-duplicates.md @@ -1,22 +1,22 @@ ---- -title: Remove duplicates -description: Removes duplicate elements from an list -author: Mcbencrafter -tags: list,duplicates,unique ---- - -```java -import java.util.List; -import java.util.stream.Collectors; - -public static List removeDuplicates(List list) { - return list.stream() - .distinct() - .collect(Collectors.toList()); -} - -// Usage: -List list = List.of(1, 2, 3, 4, 5, 1, 2, 3, 4, 5); -List result = removeDuplicates(list); -System.out.println("List with duplicates removed: " + result); // [1, 2, 3, 4, 5] +--- +title: Remove duplicates +description: Removes duplicate elements from an list +author: Mcbencrafter +tags: list,duplicates,unique +--- + +```java +import java.util.List; +import java.util.stream.Collectors; + +public static List removeDuplicates(List list) { + return list.stream() + .distinct() + .collect(Collectors.toList()); +} + +// Usage: +List list = List.of(1, 2, 3, 4, 5, 1, 2, 3, 4, 5); +List result = removeDuplicates(list); +System.out.println("List with duplicates removed: " + result); // [1, 2, 3, 4, 5] ``` \ No newline at end of file diff --git a/snippets/java/bit-manipulation/bit-counting.md b/snippets/java/bit-manipulation/bit-counting.md index 534e5f7b..8eeb2d2a 100644 --- a/snippets/java/bit-manipulation/bit-counting.md +++ b/snippets/java/bit-manipulation/bit-counting.md @@ -1,23 +1,23 @@ ---- -title: Bit Counting -description: Counts the set bits in the binary representation of an integer -author: Mcbencrafter -tags: math,number,bits,bit-counting ---- - -```java -public static int countBits(int number) { - int bits = 0; - - while (number > 0) { - bits += number & 1; - number >>= 1; - } - - return bits; -} - -// Usage: -int number = 5; -System.out.println(countBits(5)); // 2 (101) +--- +title: Bit Counting +description: Counts the set bits in the binary representation of an integer +author: Mcbencrafter +tags: math,number,bits,bit-counting +--- + +```java +public static int countBits(int number) { + int bits = 0; + + while (number > 0) { + bits += number & 1; + number >>= 1; + } + + return bits; +} + +// Usage: +int number = 5; +System.out.println(countBits(5)); // 2 (101) ``` \ No newline at end of file diff --git a/snippets/java/bit-manipulation/is-power-of-two.md b/snippets/java/bit-manipulation/is-power-of-two.md index 42055f43..d71d26c4 100644 --- a/snippets/java/bit-manipulation/is-power-of-two.md +++ b/snippets/java/bit-manipulation/is-power-of-two.md @@ -1,16 +1,16 @@ ---- -title: Is Power Of Two -description: Checks if a number is a power of two -author: Mcbencrafter -tags: math,number,bit,power-of-two ---- - -```java -public static boolean isPowerOfTwo(int number) { - return (number > 0) && ((number & (number - 1)) == 0); -} - -// Usage: -int number = 16; -System.out.println(isPowerOfTwo(number)); // true (2^4) -``` +--- +title: Is Power Of Two +description: Checks if a number is a power of two +author: Mcbencrafter +tags: math,number,bit,power-of-two +--- + +```java +public static boolean isPowerOfTwo(int number) { + return (number > 0) && ((number & (number - 1)) == 0); +} + +// Usage: +int number = 16; +System.out.println(isPowerOfTwo(number)); // true (2^4) +``` diff --git a/snippets/java/math/checksum.md b/snippets/java/math/checksum.md index d48184a1..adda949b 100644 --- a/snippets/java/math/checksum.md +++ b/snippets/java/math/checksum.md @@ -1,24 +1,24 @@ ---- -title: Checksum -description: Calculates the checksum of an int -author: Mcbencrafter -tags: math,number,checksum ---- - -```java -public static int checksum(int number) { - number = Math.abs(number); - int sum = 0; - - while (number != 0) { - sum += number % 10; - number /= 10; - } - - return sum; -} - -// Usage: -int number = 12345; -System.out.println(checksum(number)); // 15 = 1+2+3+4+5 +--- +title: Checksum +description: Calculates the checksum of an int +author: Mcbencrafter +tags: math,number,checksum +--- + +```java +public static int checksum(int number) { + number = Math.abs(number); + int sum = 0; + + while (number != 0) { + sum += number % 10; + number /= 10; + } + + return sum; +} + +// Usage: +int number = 12345; +System.out.println(checksum(number)); // 15 = 1+2+3+4+5 ``` \ No newline at end of file diff --git a/snippets/java/math/factorial.md b/snippets/java/math/factorial.md index 1b3ff2ed..a9f0ffab 100644 --- a/snippets/java/math/factorial.md +++ b/snippets/java/math/factorial.md @@ -1,24 +1,24 @@ ---- -title: Factorial -description: Computes the factorial of a given number -author: Mcbencrafter -tags: math,number,factorial ---- - -```java -import java.math.BigInteger; - -public static BigInteger factorial(int number) { - BigInteger result = BigInteger.ONE; - - for (int currentNumber = 1; currentNumber <= number; currentNumber++) { - result = result.multiply(BigInteger.valueOf(currentNumber)); - } - - return result; -} - -// Usage: -int number = 6; -System.out.println(factorial(number)); // 720 = 6*5*4*3*2 -``` +--- +title: Factorial +description: Computes the factorial of a given number +author: Mcbencrafter +tags: math,number,factorial +--- + +```java +import java.math.BigInteger; + +public static BigInteger factorial(int number) { + BigInteger result = BigInteger.ONE; + + for (int currentNumber = 1; currentNumber <= number; currentNumber++) { + result = result.multiply(BigInteger.valueOf(currentNumber)); + } + + return result; +} + +// Usage: +int number = 6; +System.out.println(factorial(number)); // 720 = 6*5*4*3*2 +``` diff --git a/snippets/java/math/fibonacci.md b/snippets/java/math/fibonacci.md index c2fb507c..0f07aa96 100644 --- a/snippets/java/math/fibonacci.md +++ b/snippets/java/math/fibonacci.md @@ -1,19 +1,19 @@ ---- -title: Fibonacci -description: Calculates the nth fibonacci number -author: Mcbencrafter -tags: math,number,fibonacci ---- - -```java -public static int fibonacci(int number) { - if (number <= 1) - return number; - - return fibonacci(number - 1) + fibonacci(number - 2); -} - -// Usage: -int number = 5; -System.out.println(fibonacci(number)) // 3 (0, 1, 1, 2, 3) +--- +title: Fibonacci +description: Calculates the nth fibonacci number +author: Mcbencrafter +tags: math,number,fibonacci +--- + +```java +public static int fibonacci(int number) { + if (number <= 1) + return number; + + return fibonacci(number - 1) + fibonacci(number - 2); +} + +// Usage: +int number = 5; +System.out.println(fibonacci(number)) // 3 (0, 1, 1, 2, 3) ``` \ No newline at end of file diff --git a/snippets/java/math/greatest-common-divisor.md b/snippets/java/math/greatest-common-divisor.md index dc3acdb7..8d777ee3 100644 --- a/snippets/java/math/greatest-common-divisor.md +++ b/snippets/java/math/greatest-common-divisor.md @@ -1,23 +1,23 @@ ---- -title: Greatest Common Divisor -description: Calculates the greatest common divisor (gcd) of two numbers -author: Mcbencrafter -tags: math,number,greatest-common-devisor,gcd,euclidean-algorithm ---- - -```java -public static int gcd(int number1, int number2) { - while (number2 != 0) { - int remainder = number2; - number2 = number1 % number2; - number1 = remainder; - } - - return number1; -} - -// Usage: -int a = 16; -int b = 12; -System.out.println(gcd(a, b)); // 4 +--- +title: Greatest Common Divisor +description: Calculates the greatest common divisor (gcd) of two numbers +author: Mcbencrafter +tags: math,number,greatest-common-devisor,gcd,euclidean-algorithm +--- + +```java +public static int gcd(int number1, int number2) { + while (number2 != 0) { + int remainder = number2; + number2 = number1 % number2; + number1 = remainder; + } + + return number1; +} + +// Usage: +int a = 16; +int b = 12; +System.out.println(gcd(a, b)); // 4 ``` \ No newline at end of file diff --git a/snippets/java/math/least-common-multiple.md b/snippets/java/math/least-common-multiple.md index 4180be1e..0ee1de99 100644 --- a/snippets/java/math/least-common-multiple.md +++ b/snippets/java/math/least-common-multiple.md @@ -1,26 +1,26 @@ ---- -title: Least Common Multiple -description: Calculates the least common multiple (lcm) of two numbers -author: Mcbencrafter -tags: math,number,least-common-multiple,lcm,euclidean-algorithm ---- - -```java -public static int lcm(int number1, int number2) { - int gcdNumber1 = number1; - int gcdNumber2 = number2; - - while (gcdNumber2 != 0) { - int remainder = gcdNumber2; - gcdNumber2 = gcdNumber1 % gcdNumber2; - gcdNumber1 = remainder; - } - - return (number1 / gcdNumber1) * number2; -} - -// Usage: -int a = 16; -int b = 12; -System.out.println(lcm(a, b)); // 48 +--- +title: Least Common Multiple +description: Calculates the least common multiple (lcm) of two numbers +author: Mcbencrafter +tags: math,number,least-common-multiple,lcm,euclidean-algorithm +--- + +```java +public static int lcm(int number1, int number2) { + int gcdNumber1 = number1; + int gcdNumber2 = number2; + + while (gcdNumber2 != 0) { + int remainder = gcdNumber2; + gcdNumber2 = gcdNumber1 % gcdNumber2; + gcdNumber1 = remainder; + } + + return (number1 / gcdNumber1) * number2; +} + +// Usage: +int a = 16; +int b = 12; +System.out.println(lcm(a, b)); // 48 ``` \ No newline at end of file diff --git a/snippets/java/math/prime-check.md b/snippets/java/math/prime-check.md index 47b9440a..121ee2a5 100644 --- a/snippets/java/math/prime-check.md +++ b/snippets/java/math/prime-check.md @@ -1,31 +1,31 @@ ---- -title: Prime Check -description: Checks if a number is a prime -author: Mcbencrafter -tags: math,number,prime ---- - -```java -public static boolean isPrime(int number) { - if (number <= 1) - return false; - - if (number <= 3) - return true; - - boolean prime = true; - for (int divisor = 3; divisor < number; divisor++) { - if (number % divisor != 0) - continue; - - prime = false; - break; - } - - return prime; -} - -// Usage: -int number = 31; -System.out.println(isPrime(number)); // true +--- +title: Prime Check +description: Checks if a number is a prime +author: Mcbencrafter +tags: math,number,prime +--- + +```java +public static boolean isPrime(int number) { + if (number <= 1) + return false; + + if (number <= 3) + return true; + + boolean prime = true; + for (int divisor = 3; divisor < number; divisor++) { + if (number % divisor != 0) + continue; + + prime = false; + break; + } + + return prime; +} + +// Usage: +int number = 31; +System.out.println(isPrime(number)); // true ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/ascii-to-string.md b/snippets/java/string-manipulation/ascii-to-string.md index 8e7cb924..eb544572 100644 --- a/snippets/java/string-manipulation/ascii-to-string.md +++ b/snippets/java/string-manipulation/ascii-to-string.md @@ -1,23 +1,23 @@ ---- -title: Ascii To String -description: Converts a list of ascii numbers into a string -author: Mcbencrafter -tags: string,ascii,encoding,decode,conversion ---- - -```java -import java.util.List; - -public static String asciiToString(List asciiCodes) { - StringBuilder text = new StringBuilder(); - - for (int asciiCode : asciiCodes) { - text.append((char) asciiCode); - } - - return text.toString(); -} - -// Usage: -System.out.println(asciiToString(List.of(104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100))); // "hello world" +--- +title: Ascii To String +description: Converts a list of ascii numbers into a string +author: Mcbencrafter +tags: string,ascii,encoding,decode,conversion +--- + +```java +import java.util.List; + +public static String asciiToString(List asciiCodes) { + StringBuilder text = new StringBuilder(); + + for (int asciiCode : asciiCodes) { + text.append((char) asciiCode); + } + + return text.toString(); +} + +// Usage: +System.out.println(asciiToString(List.of(104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100))); // "hello world" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/camelcase-to-snake-case.md b/snippets/java/string-manipulation/camelcase-to-snake-case.md index 86219c7b..1814ab42 100644 --- a/snippets/java/string-manipulation/camelcase-to-snake-case.md +++ b/snippets/java/string-manipulation/camelcase-to-snake-case.md @@ -1,15 +1,15 @@ ---- -title: camelCase to snake_case -description: Converts a camelCase string into snake_case -author: Mcbencrafter -tags: string,conversion,camel-case,snake-case ---- - -```java -public static String camelToSnake(String camelCase) { - return camelCase.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase(); -} - -// Usage: -System.out.println(camelToSnake("helloWorld")); // "hello_world" +--- +title: camelCase to snake_case +description: Converts a camelCase string into snake_case +author: Mcbencrafter +tags: string,conversion,camel-case,snake-case +--- + +```java +public static String camelToSnake(String camelCase) { + return camelCase.replaceAll("([a-z])([A-Z])", "$1_$2").toLowerCase(); +} + +// Usage: +System.out.println(camelToSnake("helloWorld")); // "hello_world" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/capitalize-words.md b/snippets/java/string-manipulation/capitalize-words.md index 81327166..360b2f00 100644 --- a/snippets/java/string-manipulation/capitalize-words.md +++ b/snippets/java/string-manipulation/capitalize-words.md @@ -1,27 +1,27 @@ ---- -title: Capitalize Words -description: Capitalizes the first letter of each word in a string -author: Mcbencrafter -tags: string,capitalize,words ---- - -```java -public static String capitalizeWords(String text) { - String[] words = text.split("(?<=\\S)(?=\\s+)|(?<=\\s+)(?=\\S)"); // this is needed to preserve spaces (text.split(" ") would remove multiple spaces) - StringBuilder capitalizedText = new StringBuilder(); - - for (String word : words) { - if (word.trim().isEmpty()) { - capitalizedText.append(word); - continue; - } - capitalizedText.append(Character.toUpperCase(word.charAt(0))) - .append(word.substring(1)); - } - - return capitalizedText.toString(); -} - -// Usage: -System.out.println(capitalizeWords("hello world")); // "Hello World" +--- +title: Capitalize Words +description: Capitalizes the first letter of each word in a string +author: Mcbencrafter +tags: string,capitalize,words +--- + +```java +public static String capitalizeWords(String text) { + String[] words = text.split("(?<=\\S)(?=\\s+)|(?<=\\s+)(?=\\S)"); // this is needed to preserve spaces (text.split(" ") would remove multiple spaces) + StringBuilder capitalizedText = new StringBuilder(); + + for (String word : words) { + if (word.trim().isEmpty()) { + capitalizedText.append(word); + continue; + } + capitalizedText.append(Character.toUpperCase(word.charAt(0))) + .append(word.substring(1)); + } + + return capitalizedText.toString(); +} + +// Usage: +System.out.println(capitalizeWords("hello world")); // "Hello World" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/check-anagram.md b/snippets/java/string-manipulation/check-anagram.md index f1d27dee..2c0cdfb0 100644 --- a/snippets/java/string-manipulation/check-anagram.md +++ b/snippets/java/string-manipulation/check-anagram.md @@ -1,28 +1,28 @@ ---- -title: Check Anagram -description: Checks if two strings are anagrams, meaning they contain the same characters ignoring order, spaces and case sensitivity -author: Mcbencrafter -tags: string,anagram,compare,arrays ---- - -```java -import java.util.Arrays; - -public static boolean isAnagram(String text1, String text2) { - String text1Normalized = text1.replaceAll("\\s+", ""); - String text2Normalized = text2.replaceAll("\\s+", ""); - - if (text1Normalized.length() != text2Normalized.length()) - return false; - - char[] text1Array = text1Normalized.toCharArray(); - char[] text2Array = text2Normalized.toCharArray(); - Arrays.sort(text1Array); - Arrays.sort(text2Array); - return Arrays.equals(text1Array, text2Array); -} - -// Usage: -System.out.println(isAnagram("listen", "silent")); // true -System.out.println(isAnagram("hello", "world")); // false +--- +title: Check Anagram +description: Checks if two strings are anagrams, meaning they contain the same characters ignoring order, spaces and case sensitivity +author: Mcbencrafter +tags: string,anagram,compare,arrays +--- + +```java +import java.util.Arrays; + +public static boolean isAnagram(String text1, String text2) { + String text1Normalized = text1.replaceAll("\\s+", ""); + String text2Normalized = text2.replaceAll("\\s+", ""); + + if (text1Normalized.length() != text2Normalized.length()) + return false; + + char[] text1Array = text1Normalized.toCharArray(); + char[] text2Array = text2Normalized.toCharArray(); + Arrays.sort(text1Array); + Arrays.sort(text2Array); + return Arrays.equals(text1Array, text2Array); +} + +// Usage: +System.out.println(isAnagram("listen", "silent")); // true +System.out.println(isAnagram("hello", "world")); // false ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/check-palindrome.md b/snippets/java/string-manipulation/check-palindrome.md index dde8ac34..9d0da856 100644 --- a/snippets/java/string-manipulation/check-palindrome.md +++ b/snippets/java/string-manipulation/check-palindrome.md @@ -1,20 +1,20 @@ ---- -title: Check Palindrome -description: Checks if a string reads the same backward as forward, ignoring whitespaces and case sensitivity -author: Mcbencrafter -tags: string,palindrome,compare,reverse ---- - -```java -public static boolean isPalindrome(String text) { - String cleanText = text.toLowerCase().replaceAll("\\s+", ""); - - return new StringBuilder(cleanText) - .reverse() - .toString() - .equals(cleanText); -} - -// Usage: -System.out.println(isPalindrome("A man a plan a canal Panama")); // true +--- +title: Check Palindrome +description: Checks if a string reads the same backward as forward, ignoring whitespaces and case sensitivity +author: Mcbencrafter +tags: string,palindrome,compare,reverse +--- + +```java +public static boolean isPalindrome(String text) { + String cleanText = text.toLowerCase().replaceAll("\\s+", ""); + + return new StringBuilder(cleanText) + .reverse() + .toString() + .equals(cleanText); +} + +// Usage: +System.out.println(isPalindrome("A man a plan a canal Panama")); // true ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/count-character-frequency.md b/snippets/java/string-manipulation/count-character-frequency.md index 85082d64..f1a8e14a 100644 --- a/snippets/java/string-manipulation/count-character-frequency.md +++ b/snippets/java/string-manipulation/count-character-frequency.md @@ -1,27 +1,27 @@ ---- -title: Count Character Frequency -description: Counts the frequency of each character in a string -author: Mcbencrafter -tags: string,character,frequency,character-frequency ---- - -```java -public static Map characterFrequency(String text, boolean countSpaces, boolean caseSensitive) { - Map frequencyMap = new HashMap<>(); - - for (char character : text.toCharArray()) { - if (character == ' ' && !countSpaces) - continue; - - if (!caseSensitive) - character = Character.toLowerCase(character); - - frequencyMap.put(character, frequencyMap.getOrDefault(character, 0) + 1); - } - - return frequencyMap; -} - -// Usage: -System.out.println(characterFrequency("hello world", false, false)); // {r=1, d=1, e=1, w=1, h=1, l=3, o=2} +--- +title: Count Character Frequency +description: Counts the frequency of each character in a string +author: Mcbencrafter +tags: string,character,frequency,character-frequency +--- + +```java +public static Map characterFrequency(String text, boolean countSpaces, boolean caseSensitive) { + Map frequencyMap = new HashMap<>(); + + for (char character : text.toCharArray()) { + if (character == ' ' && !countSpaces) + continue; + + if (!caseSensitive) + character = Character.toLowerCase(character); + + frequencyMap.put(character, frequencyMap.getOrDefault(character, 0) + 1); + } + + return frequencyMap; +} + +// Usage: +System.out.println(characterFrequency("hello world", false, false)); // {r=1, d=1, e=1, w=1, h=1, l=3, o=2} ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/count-character-occurrences.md b/snippets/java/string-manipulation/count-character-occurrences.md index 6906fe14..5b15f8f6 100644 --- a/snippets/java/string-manipulation/count-character-occurrences.md +++ b/snippets/java/string-manipulation/count-character-occurrences.md @@ -1,26 +1,26 @@ ---- -title: Count Character Occurrences -description: Counts the occurrences of the specified characters in a given string -author: Mcbencrafter -tags: string,characters,counter,occurence ---- - -```java -import java.util.List; - -public static int countCharacterOccurrences(String text, List characters) { - int count = 0; - - for (char character : text.toCharArray()) { - if (characters.indexOf(character) == -1) - continue; - - count++; - } - - return count; -} - -// Usage: -System.out.println(countCharacterOccurrences("hello world", List.of('l', 'o'))); // 5 +--- +title: Count Character Occurrences +description: Counts the occurrences of the specified characters in a given string +author: Mcbencrafter +tags: string,characters,counter,occurence +--- + +```java +import java.util.List; + +public static int countCharacterOccurrences(String text, List characters) { + int count = 0; + + for (char character : text.toCharArray()) { + if (characters.indexOf(character) == -1) + continue; + + count++; + } + + return count; +} + +// Usage: +System.out.println(countCharacterOccurrences("hello world", List.of('l', 'o'))); // 5 ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/count-words.md b/snippets/java/string-manipulation/count-words.md index b0293ef1..7284ac83 100644 --- a/snippets/java/string-manipulation/count-words.md +++ b/snippets/java/string-manipulation/count-words.md @@ -1,15 +1,15 @@ ---- -title: Count Words -description: Counts the number of words in a string -author: Mcbencrafter -tags: string,word,count ---- - -```java -public static int countWords(String text) { - return text.split("\\s+").length; -} - -// Usage: -System.out.println(countWords("hello world")); // 2 +--- +title: Count Words +description: Counts the number of words in a string +author: Mcbencrafter +tags: string,word,count +--- + +```java +public static int countWords(String text) { + return text.split("\\s+").length; +} + +// Usage: +System.out.println(countWords("hello world")); // 2 ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/extract-text-between-delimiters.md b/snippets/java/string-manipulation/extract-text-between-delimiters.md index cededfb6..e377cde8 100644 --- a/snippets/java/string-manipulation/extract-text-between-delimiters.md +++ b/snippets/java/string-manipulation/extract-text-between-delimiters.md @@ -1,21 +1,21 @@ ---- -title: Extract Text Between Delimiters -description: Extracts a text between two given delimiters from a string -author: Mcbencrafter -tags: string,delimiters,start,end ---- - -```java -public static String extractBetweenDelimiters(String text, String start, String end) { - int startIndex = text.indexOf(start); - int endIndex = text.indexOf(end, startIndex + start.length()); - - if (startIndex == -1 || endIndex == -1) - return ""; - - return text.substring(startIndex + start.length(), endIndex); -} - -// Usage: -System.out.println(extractBetweenDelimiters("hello, world!", ",", "!")); // " world" +--- +title: Extract Text Between Delimiters +description: Extracts a text between two given delimiters from a string +author: Mcbencrafter +tags: string,delimiters,start,end +--- + +```java +public static String extractBetweenDelimiters(String text, String start, String end) { + int startIndex = text.indexOf(start); + int endIndex = text.indexOf(end, startIndex + start.length()); + + if (startIndex == -1 || endIndex == -1) + return ""; + + return text.substring(startIndex + start.length(), endIndex); +} + +// Usage: +System.out.println(extractBetweenDelimiters("hello, world!", ",", "!")); // " world" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/find-longest-word.md b/snippets/java/string-manipulation/find-longest-word.md index 4279c960..24a62016 100644 --- a/snippets/java/string-manipulation/find-longest-word.md +++ b/snippets/java/string-manipulation/find-longest-word.md @@ -1,25 +1,25 @@ ---- -title: Find Longest Word -description: Returns the longest word in a string -author: Mcbencrafter -tags: string,length,words ---- - -```java -public static String findLongestWord(String text) { - String[] words = text.split("\\s+"); - String longestWord = words[0]; - - for (String word : words) { - if (word.length() <= longestWord.length()) - continue; - - longestWord = word; - } - - return longestWord; -} - -// Usage: -System.out.println(findLongestWord("hello world123")); // "world123" +--- +title: Find Longest Word +description: Returns the longest word in a string +author: Mcbencrafter +tags: string,length,words +--- + +```java +public static String findLongestWord(String text) { + String[] words = text.split("\\s+"); + String longestWord = words[0]; + + for (String word : words) { + if (word.length() <= longestWord.length()) + continue; + + longestWord = word; + } + + return longestWord; +} + +// Usage: +System.out.println(findLongestWord("hello world123")); // "world123" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/find-unique-characters.md b/snippets/java/string-manipulation/find-unique-characters.md index b52d91e6..aed5942d 100644 --- a/snippets/java/string-manipulation/find-unique-characters.md +++ b/snippets/java/string-manipulation/find-unique-characters.md @@ -1,25 +1,25 @@ ---- -Title: Find Unique Characters -Description: Returns a set of unique characters from a string, with options to include spaces and control case sensitivity -Author: Mcbencrafter -Tags: string,unique,characters,case-sensitive ---- - -```java -public static Set findUniqueCharacters(String text, boolean countSpaces, boolean caseSensitive) { - Set uniqueCharacters = new TreeSet<>(); - - for (char character : text.toCharArray()) { - if (character == ' ' && !countSpaces) - continue; - if (!caseSensitive) - character = Character.toLowerCase(character); - uniqueCharacters.add(character); - } - - return uniqueCharacters; -} - -// Usage: -System.out.println(findUniqueCharacters("hello world", false, true)); // Output: [d, e, h, l, o, r, w] +--- +Title: Find Unique Characters +Description: Returns a set of unique characters from a string, with options to include spaces and control case sensitivity +Author: Mcbencrafter +Tags: string,unique,characters,case-sensitive +--- + +```java +public static Set findUniqueCharacters(String text, boolean countSpaces, boolean caseSensitive) { + Set uniqueCharacters = new TreeSet<>(); + + for (char character : text.toCharArray()) { + if (character == ' ' && !countSpaces) + continue; + if (!caseSensitive) + character = Character.toLowerCase(character); + uniqueCharacters.add(character); + } + + return uniqueCharacters; +} + +// Usage: +System.out.println(findUniqueCharacters("hello world", false, true)); // Output: [d, e, h, l, o, r, w] ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/mask-text.md b/snippets/java/string-manipulation/mask-text.md index c7f51314..cc66ff71 100644 --- a/snippets/java/string-manipulation/mask-text.md +++ b/snippets/java/string-manipulation/mask-text.md @@ -1,25 +1,25 @@ ---- -title: Mask Text -description: Masks portions of a string, leaving specific parts at the beginning and end visible while replacing the rest with a specified character -author: Mcbencrafter -tags: string,mask,hide ---- - -```java -public static String partialMask(String text, int maskLengthStart, int maskLengthEnd, char mask) - if (text == null) - return null; - - StringBuilder maskedText = new StringBuilder(); - maskedText.append(text, 0, maskLengthStart); - - for (int currentChar = maskLengthStart; currentChar < text.length(); currentChar++) { - maskedText.append(mask); - } - maskedText.append(text, text.length() - maskLengthEnd, text.length()); - return maskedText.toString(); -} - -// Usage: -System.out.println(partialMask("1234567890", 4, 2, '*')); // "1234****90" +--- +title: Mask Text +description: Masks portions of a string, leaving specific parts at the beginning and end visible while replacing the rest with a specified character +author: Mcbencrafter +tags: string,mask,hide +--- + +```java +public static String partialMask(String text, int maskLengthStart, int maskLengthEnd, char mask) + if (text == null) + return null; + + StringBuilder maskedText = new StringBuilder(); + maskedText.append(text, 0, maskLengthStart); + + for (int currentChar = maskLengthStart; currentChar < text.length(); currentChar++) { + maskedText.append(mask); + } + maskedText.append(text, text.length() - maskLengthEnd, text.length()); + return maskedText.toString(); +} + +// Usage: +System.out.println(partialMask("1234567890", 4, 2, '*')); // "1234****90" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/normalize-whitespace.md b/snippets/java/string-manipulation/normalize-whitespace.md index 15c0df7a..e9e7f310 100644 --- a/snippets/java/string-manipulation/normalize-whitespace.md +++ b/snippets/java/string-manipulation/normalize-whitespace.md @@ -1,15 +1,15 @@ ---- -title: Normalize Whitespace -description: Replaces consecutive whitespaces with a single space -author: Mcbencrafter -tags: string,whitespace,normalize ---- - -```java -public static String normalizeWhitespace(String text) { - return text.replaceAll(" {2,}", " "); -} - -// Usage: -System.out.println(normalizeWhitespace("hello world")); // "hello world" +--- +title: Normalize Whitespace +description: Replaces consecutive whitespaces with a single space +author: Mcbencrafter +tags: string,whitespace,normalize +--- + +```java +public static String normalizeWhitespace(String text) { + return text.replaceAll(" {2,}", " "); +} + +// Usage: +System.out.println(normalizeWhitespace("hello world")); // "hello world" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/password-generator.md b/snippets/java/string-manipulation/password-generator.md index 5e0add08..7a1cffa6 100644 --- a/snippets/java/string-manipulation/password-generator.md +++ b/snippets/java/string-manipulation/password-generator.md @@ -1,38 +1,38 @@ ---- -title: Password Generator -description: Generates a random string with specified length and character set, including options for letters, numbers, and special characters -author: Mcbencrafter -tags: string,password,generator,security,random,token ---- - -```java -public static String randomString(int length, boolean useLetters, boolean useNumbers, boolean useSpecialCharacters) { - String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - String numbers = "0123456789"; - String specialCharacters = "!@#$%^&*()_+-=[]{}|;:,.<>?"; - - String allowedCharacters = ""; - - if (useLetters) - allowedCharacters += characters; - - if (useNumbers) - allowedCharacters += numbers; - - if (useSpecialCharacters) - allowedCharacters += specialCharacters; - - SecureRandom random = new SecureRandom(); - StringBuilder result = new StringBuilder(length); - - for (int i = 0; i < length; i++) { - int index = random.nextInt(allowedCharacters.length()); - result.append(allowedCharacters.charAt(index)); - } - - return result.toString(); -} - -// Usage: -System.out.println(randomString(10, true, true, false)); // Random string containing letters, numbers but no special characters with 10 characters +--- +title: Password Generator +description: Generates a random string with specified length and character set, including options for letters, numbers, and special characters +author: Mcbencrafter +tags: string,password,generator,security,random,token +--- + +```java +public static String randomString(int length, boolean useLetters, boolean useNumbers, boolean useSpecialCharacters) { + String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + String numbers = "0123456789"; + String specialCharacters = "!@#$%^&*()_+-=[]{}|;:,.<>?"; + + String allowedCharacters = ""; + + if (useLetters) + allowedCharacters += characters; + + if (useNumbers) + allowedCharacters += numbers; + + if (useSpecialCharacters) + allowedCharacters += specialCharacters; + + SecureRandom random = new SecureRandom(); + StringBuilder result = new StringBuilder(length); + + for (int i = 0; i < length; i++) { + int index = random.nextInt(allowedCharacters.length()); + result.append(allowedCharacters.charAt(index)); + } + + return result.toString(); +} + +// Usage: +System.out.println(randomString(10, true, true, false)); // Random string containing letters, numbers but no special characters with 10 characters ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/remove-punctuation.md b/snippets/java/string-manipulation/remove-punctuation.md index 5074f744..9cabdc79 100644 --- a/snippets/java/string-manipulation/remove-punctuation.md +++ b/snippets/java/string-manipulation/remove-punctuation.md @@ -1,15 +1,15 @@ ---- -title: Remove Punctuation -description: Removes punctuation (, . !) from a string -author: Mcbencrafter -tags: string,punctuation,clean,normalization ---- - -```java -public static String removePunctuation(String text) { - return text.replaceAll("[,!.?;:]", ""); -} - -// Usage: -System.out.println(removePunctuation("hello, world!")); // "hello world" +--- +title: Remove Punctuation +description: Removes punctuation (, . !) from a string +author: Mcbencrafter +tags: string,punctuation,clean,normalization +--- + +```java +public static String removePunctuation(String text) { + return text.replaceAll("[,!.?;:]", ""); +} + +// Usage: +System.out.println(removePunctuation("hello, world!")); // "hello world" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/remove-special-characters.md b/snippets/java/string-manipulation/remove-special-characters.md index a784478b..22c00a84 100644 --- a/snippets/java/string-manipulation/remove-special-characters.md +++ b/snippets/java/string-manipulation/remove-special-characters.md @@ -1,15 +1,15 @@ ---- -title: Remove Special Characters -description: Removes any character which is not alphabetic (A-Z, a-z) or numeric (0-9) -author: Mcbencrafter -tags: string,special-characters,clean,normalization ---- - -```java -public static String removeSpecialCharacters(String text) { - return text.replaceAll("[^a-zA-Z0-9]", ""); -} - -// Usage: -System.out.println(removeSpecialCharacters("hello, world!#%")); // "hello world" +--- +title: Remove Special Characters +description: Removes any character which is not alphabetic (A-Z, a-z) or numeric (0-9) +author: Mcbencrafter +tags: string,special-characters,clean,normalization +--- + +```java +public static String removeSpecialCharacters(String text) { + return text.replaceAll("[^a-zA-Z0-9]", ""); +} + +// Usage: +System.out.println(removeSpecialCharacters("hello, world!#%")); // "hello world" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/reverse-word-contents.md b/snippets/java/string-manipulation/reverse-word-contents.md index 8112f768..90b1dd6b 100644 --- a/snippets/java/string-manipulation/reverse-word-contents.md +++ b/snippets/java/string-manipulation/reverse-word-contents.md @@ -1,23 +1,23 @@ ---- -Title: Reverse Word Contents -Description: Reverses the characters of each word in a string while preserving word order -Author: Mcbencrafter -Tags: string,reverse,words,transformation,order ---- - -```java -public static String reverseWords(String text) { - String[] words = text.split("\\s+"); - StringBuilder reversedText = new StringBuilder(); - - for (String word : words) { - StringBuilder reversedWord = new StringBuilder(word).reverse(); - reversedText.append(reversedWord).append(" "); - } - - return reversedText.toString().trim(); -} - -// Usage: -System.out.println(reverseWordContents("hello world")); // "olleh dlrow" +--- +Title: Reverse Word Contents +Description: Reverses the characters of each word in a string while preserving word order +Author: Mcbencrafter +Tags: string,reverse,words,transformation,order +--- + +```java +public static String reverseWords(String text) { + String[] words = text.split("\\s+"); + StringBuilder reversedText = new StringBuilder(); + + for (String word : words) { + StringBuilder reversedWord = new StringBuilder(word).reverse(); + reversedText.append(reversedWord).append(" "); + } + + return reversedText.toString().trim(); +} + +// Usage: +System.out.println(reverseWordContents("hello world")); // "olleh dlrow" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/reverse-word-order.md b/snippets/java/string-manipulation/reverse-word-order.md index 7e18b6de..1d582c9f 100644 --- a/snippets/java/string-manipulation/reverse-word-order.md +++ b/snippets/java/string-manipulation/reverse-word-order.md @@ -1,22 +1,22 @@ ---- -Title: Reverse Word Order -Description: Reverses the order of words in a sentence while preserving the content of each word -Author: Mcbencrafter -Tags: string,reverse,words,transformation,sentence ---- - -```java -public static String reverseWords(String text) { - String[] words = text.split("\\s+"); - StringBuilder reversedSentence = new StringBuilder(); - - for (int currentWord = words.length - 1; currentWord >= 0; currentWord--) { - reversedSentence.append(words[currentWord]).append(" "); - } - - return reversedSentence.toString().trim(); -} - -// Usage: -System.out.println(reverseWords("hello world")); // Output: world hello +--- +Title: Reverse Word Order +Description: Reverses the order of words in a sentence while preserving the content of each word +Author: Mcbencrafter +Tags: string,reverse,words,transformation,sentence +--- + +```java +public static String reverseWords(String text) { + String[] words = text.split("\\s+"); + StringBuilder reversedSentence = new StringBuilder(); + + for (int currentWord = words.length - 1; currentWord >= 0; currentWord--) { + reversedSentence.append(words[currentWord]).append(" "); + } + + return reversedSentence.toString().trim(); +} + +// Usage: +System.out.println(reverseWords("hello world")); // Output: world hello ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/slugify-string.md b/snippets/java/string-manipulation/slugify-string.md index b12b2432..46f4c83f 100644 --- a/snippets/java/string-manipulation/slugify-string.md +++ b/snippets/java/string-manipulation/slugify-string.md @@ -1,31 +1,31 @@ ---- -title: Slugify String -description: Converts a string into a URL-friendly slug format -author: Mcbencrafter -tags: string,slug,slugify ---- - -```java -public static String slugify(String text, String separator) { - if (text == null) - return ""; - - // used to decompose accented characters to their base characters (e.g. "é" to "e") - String normalizedString = Normalizer.normalize(text, Normalizer.Form.NFD); - normalizedString = normalizedString.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); - - String slug = normalizedString.trim() - .toLowerCase() - .replaceAll("\\s+", separator) - .replaceAll("[^a-z0-9\\-_" + separator + "]", "") - .replaceAll("_", separator) - .replaceAll("-", separator) - .replaceAll(separator + "+", separator) - .replaceAll(separator + "$", ""); - - return slug; -} - -// Usage: -System.out.println(slugify("Hello World-#123-é", "-")); // "hello-world-123-e" +--- +title: Slugify String +description: Converts a string into a URL-friendly slug format +author: Mcbencrafter +tags: string,slug,slugify +--- + +```java +public static String slugify(String text, String separator) { + if (text == null) + return ""; + + // used to decompose accented characters to their base characters (e.g. "é" to "e") + String normalizedString = Normalizer.normalize(text, Normalizer.Form.NFD); + normalizedString = normalizedString.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); + + String slug = normalizedString.trim() + .toLowerCase() + .replaceAll("\\s+", separator) + .replaceAll("[^a-z0-9\\-_" + separator + "]", "") + .replaceAll("_", separator) + .replaceAll("-", separator) + .replaceAll(separator + "+", separator) + .replaceAll(separator + "$", ""); + + return slug; +} + +// Usage: +System.out.println(slugify("Hello World-#123-é", "-")); // "hello-world-123-e" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/snake-case-to-camelcase.md b/snippets/java/string-manipulation/snake-case-to-camelcase.md index fd8e3206..58d6829d 100644 --- a/snippets/java/string-manipulation/snake-case-to-camelcase.md +++ b/snippets/java/string-manipulation/snake-case-to-camelcase.md @@ -1,19 +1,19 @@ ---- -title: snake_case to camelCase -description: Converts a snake_case string into camelCase -author: Mcbencrafter -tags: string,conversion,camel-case,snake-case ---- - -```java -import java.util.regex.Pattern; - -public static String snakeToCamel(String snakeCase) { - return Pattern.compile("(_)([a-z])") - .matcher(snakeCase) - .replaceAll(match -> match.group(2).toUpperCase()); -} - -// Usage: -System.out.println(snakeToCamel("hello_world")); // "helloWorld" +--- +title: snake_case to camelCase +description: Converts a snake_case string into camelCase +author: Mcbencrafter +tags: string,conversion,camel-case,snake-case +--- + +```java +import java.util.regex.Pattern; + +public static String snakeToCamel(String snakeCase) { + return Pattern.compile("(_)([a-z])") + .matcher(snakeCase) + .replaceAll(match -> match.group(2).toUpperCase()); +} + +// Usage: +System.out.println(snakeToCamel("hello_world")); // "helloWorld" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/spaces-to-tabs.md b/snippets/java/string-manipulation/spaces-to-tabs.md index 91300110..1142f263 100644 --- a/snippets/java/string-manipulation/spaces-to-tabs.md +++ b/snippets/java/string-manipulation/spaces-to-tabs.md @@ -1,15 +1,15 @@ ---- -Title: Spaces To Tabs -description: Converts spaces into tabs -author: Mcbencrafter -tags: string,tab,space,conversion ---- - -```java -public static String convertSpacesToTab(String text, int spacesPerTab) { - return text.replaceAll(" ".repeat(spacesPerTab), "\t"); -} - -// Usage: -System.out.println(convertSpacesToTab("hello world", 4)); // Output: hello\tworld +--- +Title: Spaces To Tabs +description: Converts spaces into tabs +author: Mcbencrafter +tags: string,tab,space,conversion +--- + +```java +public static String convertSpacesToTab(String text, int spacesPerTab) { + return text.replaceAll(" ".repeat(spacesPerTab), "\t"); +} + +// Usage: +System.out.println(convertSpacesToTab("hello world", 4)); // Output: hello\tworld ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/string-to-ascii.md b/snippets/java/string-manipulation/string-to-ascii.md index d5e51458..56fc81aa 100644 --- a/snippets/java/string-manipulation/string-to-ascii.md +++ b/snippets/java/string-manipulation/string-to-ascii.md @@ -1,24 +1,24 @@ ---- -title: String To Ascii -description: Converts a string into ascii numbers -author: Mcbencrafter -tags: string,ascii,encoding,conversion ---- - -```java -import java.util.ArrayList; -import java.util.List; - -public static List stringToAscii(String text) { - List asciiCodes = new ArrayList<>(); - - for (char character : text.toCharArray()) { - asciiCodes.add((int) character); - } - - return asciiCodes; -} - -// Usage: -System.out.println(stringToAscii("hello world")); // [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100] +--- +title: String To Ascii +description: Converts a string into ascii numbers +author: Mcbencrafter +tags: string,ascii,encoding,conversion +--- + +```java +import java.util.ArrayList; +import java.util.List; + +public static List stringToAscii(String text) { + List asciiCodes = new ArrayList<>(); + + for (char character : text.toCharArray()) { + asciiCodes.add((int) character); + } + + return asciiCodes; +} + +// Usage: +System.out.println(stringToAscii("hello world")); // [104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100] ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/string-to-camelcase.md b/snippets/java/string-manipulation/string-to-camelcase.md index 5a94713c..daf654d8 100644 --- a/snippets/java/string-manipulation/string-to-camelcase.md +++ b/snippets/java/string-manipulation/string-to-camelcase.md @@ -1,25 +1,25 @@ ---- -title: String To camelCase -description: Converts a string into camelCase -author: Mcbencrafter -tags: string,conversion,camel-case ---- - -```java -public static String stringToCamelCase(String text) { - String[] words = text.split("\\s+"); - StringBuilder camelCase = new StringBuilder( - words[0].substring(0, 1).toLowerCase() + words[0].substring(1) - ); - - for (int i = 1; i < words.length; i++) { - camelCase.append(words[i].substring(0, 1).toUpperCase()); - camelCase.append(words[i].substring(1)); - } - - return camelCase.toString(); -} - -// Usage: -System.out.println(stringToCamelCase("Hello world test")); // "helloWorldTest" +--- +title: String To camelCase +description: Converts a string into camelCase +author: Mcbencrafter +tags: string,conversion,camel-case +--- + +```java +public static String stringToCamelCase(String text) { + String[] words = text.split("\\s+"); + StringBuilder camelCase = new StringBuilder( + words[0].substring(0, 1).toLowerCase() + words[0].substring(1) + ); + + for (int i = 1; i < words.length; i++) { + camelCase.append(words[i].substring(0, 1).toUpperCase()); + camelCase.append(words[i].substring(1)); + } + + return camelCase.toString(); +} + +// Usage: +System.out.println(stringToCamelCase("Hello world test")); // "helloWorldTest" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/string-to-param-case.md b/snippets/java/string-manipulation/string-to-param-case.md index 576d3987..181308db 100644 --- a/snippets/java/string-manipulation/string-to-param-case.md +++ b/snippets/java/string-manipulation/string-to-param-case.md @@ -1,15 +1,15 @@ ---- -title: String To param-case -description: Converts a string into param-case -author: Mcbencrafter -tags: string,conversion,param-case ---- - -```java -public static String stringToParamCase(String text) { - return text.toLowerCase().replaceAll("\\s+", "-"); -} - -// Usage: -System.out.println(stringToParamCase("Hello World 123")); // "hello-world-123" +--- +title: String To param-case +description: Converts a string into param-case +author: Mcbencrafter +tags: string,conversion,param-case +--- + +```java +public static String stringToParamCase(String text) { + return text.toLowerCase().replaceAll("\\s+", "-"); +} + +// Usage: +System.out.println(stringToParamCase("Hello World 123")); // "hello-world-123" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/string-to-pascalcase.md b/snippets/java/string-manipulation/string-to-pascalcase.md index f760f369..120d88da 100644 --- a/snippets/java/string-manipulation/string-to-pascalcase.md +++ b/snippets/java/string-manipulation/string-to-pascalcase.md @@ -1,23 +1,23 @@ ---- -title: String To PascalCase -description: Converts a string into PascalCase -author: Mcbencrafter -tags: string,conversion,pascal-case ---- - -```java -public static String stringToPascalCase(String text) { - String[] words = text.split("\\s+"); - StringBuilder pascalCase = new StringBuilder(); - - for (String word : words) { - pascalCase.append(word.substring(0, 1).toUpperCase()); - pascalCase.append(word.substring(1).toLowerCase()); - } - - return pascalCase.toString(); -} - -// Usage: -System.out.println(stringToPascalCase("hello world")); // "HelloWorld" +--- +title: String To PascalCase +description: Converts a string into PascalCase +author: Mcbencrafter +tags: string,conversion,pascal-case +--- + +```java +public static String stringToPascalCase(String text) { + String[] words = text.split("\\s+"); + StringBuilder pascalCase = new StringBuilder(); + + for (String word : words) { + pascalCase.append(word.substring(0, 1).toUpperCase()); + pascalCase.append(word.substring(1).toLowerCase()); + } + + return pascalCase.toString(); +} + +// Usage: +System.out.println(stringToPascalCase("hello world")); // "HelloWorld" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/string-to-snake-case.md b/snippets/java/string-manipulation/string-to-snake-case.md index 69a24762..83c4a36f 100644 --- a/snippets/java/string-manipulation/string-to-snake-case.md +++ b/snippets/java/string-manipulation/string-to-snake-case.md @@ -1,15 +1,15 @@ ---- -title: String To snake_case -description: Converts a string into snake_case -author: Mcbencrafter -tags: string,conversion,snake-case ---- - -```java -public static String stringToSnakeCase(String text) { - return text.toLowerCase().replaceAll("\\s+", "_"); -} - -// Usage: -System.out.println(stringToSnakeCase("Hello World 123")); // "hello_world_123" +--- +title: String To snake_case +description: Converts a string into snake_case +author: Mcbencrafter +tags: string,conversion,snake-case +--- + +```java +public static String stringToSnakeCase(String text) { + return text.toLowerCase().replaceAll("\\s+", "_"); +} + +// Usage: +System.out.println(stringToSnakeCase("Hello World 123")); // "hello_world_123" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/string-to-titlecase.md b/snippets/java/string-manipulation/string-to-titlecase.md index 400fd86a..89d5c9c3 100644 --- a/snippets/java/string-manipulation/string-to-titlecase.md +++ b/snippets/java/string-manipulation/string-to-titlecase.md @@ -1,28 +1,28 @@ ---- -title: String To Titlecase -description: Converts a string into Title Case, where the first letter of each word is capitalized and the remaining letters are lowercase -author: Mcbencrafter -tags: string,conversion,title-case ---- - -```java -public static String convertToTitleCase(String text) { - String[] words = text.split("(?<=\\S)(?=\\s+)|(?<=\\s+)(?=\\S)"); // this is needed to preserve spaces (text.split(" ") would remove multiple spaces) - StringBuilder capitalizedText = new StringBuilder(); - - for (String word : words) { - if (word.trim().isEmpty()) { - capitalizedText.append(word); - continue; - } - - capitalizedText.append(Character.toUpperCase(word.charAt(0))) - .append(word.substring(1).toLowerCase()); - } - - return capitalizedText.toString().trim(); -} - -// Usage: -System.out.println(convertToTitleCase("heLlo wOrld")); // "Hello World" +--- +title: String To Titlecase +description: Converts a string into Title Case, where the first letter of each word is capitalized and the remaining letters are lowercase +author: Mcbencrafter +tags: string,conversion,title-case +--- + +```java +public static String convertToTitleCase(String text) { + String[] words = text.split("(?<=\\S)(?=\\s+)|(?<=\\s+)(?=\\S)"); // this is needed to preserve spaces (text.split(" ") would remove multiple spaces) + StringBuilder capitalizedText = new StringBuilder(); + + for (String word : words) { + if (word.trim().isEmpty()) { + capitalizedText.append(word); + continue; + } + + capitalizedText.append(Character.toUpperCase(word.charAt(0))) + .append(word.substring(1).toLowerCase()); + } + + return capitalizedText.toString().trim(); +} + +// Usage: +System.out.println(convertToTitleCase("heLlo wOrld")); // "Hello World" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/string-to-unicode.md b/snippets/java/string-manipulation/string-to-unicode.md index cd6bc518..7c66775e 100644 --- a/snippets/java/string-manipulation/string-to-unicode.md +++ b/snippets/java/string-manipulation/string-to-unicode.md @@ -1,21 +1,21 @@ ---- -title: String To Unicode -description: Converts characters of a string into their unicode representation -author: Mcbencrafter -tags: string,unicode,encoding,conversion ---- - -```java -public static String stringToUnicode(String text) { - StringBuilder unicodeText = new StringBuilder(); - - for (char character : text.toCharArray()) { - unicodeText.append(String.format("\\u%04x", (int) character)); - } - - return unicodeText.toString(); -} - -// Usage: -System.out.println(stringToUnicode("hello world")); // \u0068\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u006C\u0064 +--- +title: String To Unicode +description: Converts characters of a string into their unicode representation +author: Mcbencrafter +tags: string,unicode,encoding,conversion +--- + +```java +public static String stringToUnicode(String text) { + StringBuilder unicodeText = new StringBuilder(); + + for (char character : text.toCharArray()) { + unicodeText.append(String.format("\\u%04x", (int) character)); + } + + return unicodeText.toString(); +} + +// Usage: +System.out.println(stringToUnicode("hello world")); // \u0068\u0065\u006C\u006C\u006F\u0020\u0077\u006F\u0072\u006C\u0064 ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/tabs-to-spaces.md b/snippets/java/string-manipulation/tabs-to-spaces.md index 23b7f18d..e37163db 100644 --- a/snippets/java/string-manipulation/tabs-to-spaces.md +++ b/snippets/java/string-manipulation/tabs-to-spaces.md @@ -1,15 +1,15 @@ ---- -Title: Tabs To Spaces -description: Converts tabs into spaces -author: Mcbencrafter -tags: string,tab,space,conversion ---- - -```java -public static String convertTabToSpace(String text, int spacesPerTab) { - return text.replaceAll("\t", " ".repeat(spacesPerTab)); -} - -// Usage: -System.out.println(convertTabToSpace("hello\tworld", 2)); // "hello world" +--- +Title: Tabs To Spaces +description: Converts tabs into spaces +author: Mcbencrafter +tags: string,tab,space,conversion +--- + +```java +public static String convertTabToSpace(String text, int spacesPerTab) { + return text.replaceAll("\t", " ".repeat(spacesPerTab)); +} + +// Usage: +System.out.println(convertTabToSpace("hello\tworld", 2)); // "hello world" ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/truncate-string.md b/snippets/java/string-manipulation/truncate-string.md index 6401e867..38f85281 100644 --- a/snippets/java/string-manipulation/truncate-string.md +++ b/snippets/java/string-manipulation/truncate-string.md @@ -1,18 +1,18 @@ ---- -title: Truncate String -description: Truncates a string after a specified length (can also be used for hiding information) -author: Mcbencrafter -tags: string,truncate,mask,hide ---- - -```java -public static String truncate(String text, int length, String suffix) { - if (text.length() <= length) - return text; - - return text.substring(0, length).trim() + (suffix != null ? suffix : ""); -} - -// Usage: -System.out.println(truncate("hello world", 5, "...")); // "hello..." +--- +title: Truncate String +description: Truncates a string after a specified length (can also be used for hiding information) +author: Mcbencrafter +tags: string,truncate,mask,hide +--- + +```java +public static String truncate(String text, int length, String suffix) { + if (text.length() <= length) + return text; + + return text.substring(0, length).trim() + (suffix != null ? suffix : ""); +} + +// Usage: +System.out.println(truncate("hello world", 5, "...")); // "hello..." ``` \ No newline at end of file diff --git a/snippets/java/string-manipulation/unicode-to-string.md b/snippets/java/string-manipulation/unicode-to-string.md index 4846c823..8f0385c7 100644 --- a/snippets/java/string-manipulation/unicode-to-string.md +++ b/snippets/java/string-manipulation/unicode-to-string.md @@ -1,23 +1,23 @@ ---- -title: Unicode To String -description: Converts a unicode String into its normal representation -author: Mcbencrafter -tags: string,unicode,encoding,decoding,conversion ---- - -```java -public static String unicodeToString(String unicode) { - StringBuilder string = new StringBuilder(); - String[] hex = unicode.split("\\\\u"); - - for (int symbol = 1; symbol < hex.length; symbol++) { - int data = Integer.parseInt(hex[symbol], 16); - string.append((char) data); - } - - return string.toString(); -} - -// Usage: -System.out.println(unicodeToString("\\u0068\\u0065\\u006c\\u006c\\u006f\\u0020\\u0077\\u006f\\u0072\\u006c\\u0064")); // "hello world" +--- +title: Unicode To String +description: Converts a unicode String into its normal representation +author: Mcbencrafter +tags: string,unicode,encoding,decoding,conversion +--- + +```java +public static String unicodeToString(String unicode) { + StringBuilder string = new StringBuilder(); + String[] hex = unicode.split("\\\\u"); + + for (int symbol = 1; symbol < hex.length; symbol++) { + int data = Integer.parseInt(hex[symbol], 16); + string.append((char) data); + } + + return string.toString(); +} + +// Usage: +System.out.println(unicodeToString("\\u0068\\u0065\\u006c\\u006c\\u006f\\u0020\\u0077\\u006f\\u0072\\u006c\\u0064")); // "hello world" ``` \ No newline at end of file From 64852db749629a712c5f7734b760f424577d9885 Mon Sep 17 00:00:00 2001 From: Doston Nabotov Date: Sat, 8 Feb 2025 18:17:51 +0200 Subject: [PATCH 05/66] Fix text formatting --- CONTRIBUTING.md | 10 +++++----- src/layouts/Banner.tsx | 5 +---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0561809d..613c0cd3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -161,8 +161,8 @@ Expected file structure: ```md /snippets |- language -|- category-name -|- your-snippet-here.md + |- category-name + |- your-snippet-here.md ``` > Please do **NOT** add or edit anything in `/public` folder. It will be used for consolidating snippets. @@ -221,9 +221,9 @@ Example structure: ```md /snippets |- python -|- file-handling -|- list-manipulation -|- .... + |- file-handling + |- list-manipulation + |- .... ``` ### Adding a New Language diff --git a/src/layouts/Banner.tsx b/src/layouts/Banner.tsx index 075c1ee2..ba49ac8a 100644 --- a/src/layouts/Banner.tsx +++ b/src/layouts/Banner.tsx @@ -5,10 +5,7 @@ const Banner = () => { Made to save your time. - Find code snippets in seconds, across multiple languages. Just{" "} -
From acf0f907847ae3e0011df58728ceceb30f77c3da Mon Sep 17 00:00:00 2001 From: Doston Nabotov- search -{" "} + Find code snippets in seconds, across multiple languages. Just search and copy!Date: Sat, 8 Feb 2025 19:17:19 +0200 Subject: [PATCH 06/66] Add share button and relocate copy button --- CONTRIBUTING.md | 10 ++++----- src/components/CodePreview.tsx | 34 +++++++++++++++++++--------- src/components/CopyToClipboard.tsx | 3 ++- src/components/CopyURLButton.tsx | 33 +++++++++++++++++++++++++++ src/components/Icons.tsx | 15 +++++++++++++ src/components/SnippetList.tsx | 2 +- src/components/SnippetModal.tsx | 18 ++++++++++----- src/styles/main.css | 36 +++++++++++++----------------- 8 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 src/components/CopyURLButton.tsx diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 613c0cd3..0561809d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -161,8 +161,8 @@ Expected file structure: ```md /snippets |- language - |- category-name - |- your-snippet-here.md +|- category-name +|- your-snippet-here.md ``` > Please do **NOT** add or edit anything in `/public` folder. It will be used for consolidating snippets. @@ -221,9 +221,9 @@ Example structure: ```md /snippets |- python - |- file-handling - |- list-manipulation - |- .... +|- file-handling +|- list-manipulation +|- .... ``` ### Adding a New Language diff --git a/src/components/CodePreview.tsx b/src/components/CodePreview.tsx index b936fbaa..449da0d6 100644 --- a/src/components/CodePreview.tsx +++ b/src/components/CodePreview.tsx @@ -5,14 +5,18 @@ import { oneLight, } from "react-syntax-highlighter/dist/esm/styles/prism"; +import { slugify } from "@utils/slugify"; + import CopyToClipboard from "./CopyToClipboard"; +import CopyURLButton from "./CopyURLButton"; type Props = { - language: string; + extension: string; + languageName: string; code: string; }; -const CodePreview = ({ language = "markdown", code }: Props) => { +const CodePreview = ({ extension = "markdown", languageName, code }: Props) => { const [theme, setTheme] = useState<"dark" | "light">("dark"); useEffect(() => { @@ -35,15 +39,23 @@ const CodePreview = ({ language = "markdown", code }: Props) => { return ( -); }; diff --git a/src/components/CopyToClipboard.tsx b/src/components/CopyToClipboard.tsx index f089e355..7bc8a8c4 100644 --- a/src/components/CopyToClipboard.tsx +++ b/src/components/CopyToClipboard.tsx @@ -22,7 +22,8 @@ const CopyToClipboard = ({ text, ...props }: Props) => { return ( ); }; diff --git a/src/components/CopyURLButton.tsx b/src/components/CopyURLButton.tsx new file mode 100644 index 00000000..65547cb9 --- /dev/null +++ b/src/components/CopyURLButton.tsx @@ -0,0 +1,33 @@ +import { useState } from "react"; +import { useLocation } from "react-router-dom"; + +import Button from "./Button"; +import { ShareIcon } from "./Icons"; + +type Props = {} & React.ButtonHTMLAttributes- - {code} - +++{slugify(languageName)}
++++ + ++ {code} + +; + +const CopyURLButton = ({ ...props }: Props) => { + const location = useLocation(); + const [isCopied, setIsCopied] = useState(false); + + const copyText = () => { + const fullURL = + window.location.origin + location.pathname + location.search; + navigator.clipboard + .writeText(fullURL) + .then(() => { + setIsCopied(true); + setTimeout(() => setIsCopied(false), 2000); + }) + .catch((err) => alert("Error occurred: " + err)); + }; + + return ( + + ); +}; + +export default CopyURLButton; diff --git a/src/components/Icons.tsx b/src/components/Icons.tsx index 9d6706c7..46a75413 100644 --- a/src/components/Icons.tsx +++ b/src/components/Icons.tsx @@ -157,6 +157,21 @@ export const CopyIcon: FC = ({ fillColor = ACCENT_ICON_COLOR }) => ( ); +export const ShareIcon: FC = ({ fillColor = ACCENT_ICON_COLOR }) => ( + +); + export const LeftAngleArrowIcon: FC = ({ fillColor = ACCENT_ICON_COLOR, }) => ( diff --git a/src/components/SnippetList.tsx b/src/components/SnippetList.tsx index ab986886..33ff2671 100644 --- a/src/components/SnippetList.tsx +++ b/src/components/SnippetList.tsx @@ -130,7 +130,7 @@ const SnippetList = () => { )} diff --git a/src/components/SnippetModal.tsx b/src/components/SnippetModal.tsx index ee5133a1..17cde51a 100644 --- a/src/components/SnippetModal.tsx +++ b/src/components/SnippetModal.tsx @@ -2,9 +2,9 @@ import { motion, useReducedMotion } from "motion/react"; import React from "react"; import ReactDOM from "react-dom"; +import { useAppContext } from "@contexts/AppContext"; import { useEscapeKey } from "@hooks/useEscapeKey"; import { SnippetType } from "@types"; -import { slugify } from "@utils/slugify"; import Button from "./Button"; import CodePreview from "./CodePreview"; @@ -12,17 +12,18 @@ import { CloseIcon } from "./Icons"; type Props = { snippet: SnippetType; - language: string; + extension: string; handleCloseModal: () => void; }; const SnippetModal: React.FC = ({ snippet, - language, + extension, handleCloseModal, }) => { const modalRoot = document.getElementById("modal-root"); + const { language, subLanguage } = useAppContext(); const shouldReduceMotion = useReducedMotion(); useEscapeKey(handleCloseModal); @@ -49,7 +50,7 @@ const SnippetModal: React.FC = ({ key="modal-content" className="modal | flow" data-flow-space="lg" - layoutId={`${language}-${snippet.title}`} + layoutId={`${extension}-${snippet.title}`} transition={{ ease: [0, 0.75, 0.25, 1], duration: shouldReduceMotion ? 0 : 0.3, @@ -62,7 +63,14 @@ const SnippetModal: React.FC = ({ -+ {/* TODO: update the language name and remove all-sub-languages */} + Description: {snippet.description} diff --git a/src/styles/main.css b/src/styles/main.css index 6cbeb0d7..cac60682 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -297,6 +297,7 @@ abbr { .button--icon { min-height: unset; display: inline-flex; + gap: 0.35em; align-items: center; justify-content: center; background-color: transparent; @@ -490,11 +491,6 @@ abbr { transform: rotate(-90deg); transition: transform 100ms ease; cursor: pointer; - transition: all 200ms ease; -} - -.sublanguage__arrow:hover { - border-top-color: var(--clr-accent); } [aria-expanded="true"] .sublanguage__arrow { @@ -505,10 +501,6 @@ abbr { border-top-color: var(--clr-text-tertiary); } -.selector__item.selected .sublanguage__arrow:hover { - border-top-color: var(--clr-text-primary); -} - .selector__item label { width: 100%; padding: 0.25em 0.75em; @@ -763,22 +755,26 @@ body:has(.modal-overlay) { border: 1px solid var(--clr-border-primary); border-radius: var(--br-md); width: 100%; - overflow-x: auto; + overflow: hidden; position: relative; } -.modal__copy { - position: absolute; - top: 0.5em; - right: 1.2em; - z-index: 10; - isolation: isolate; - background-color: var(--clr-bg-secondary); - border: 1px solid var(--clr-border-primary); +.code-preview__header { + display: flex; + gap: 1rem; + justify-content: space-between; + align-items: center; + padding: 0.25em 1em; } -.modal__copy:hover { - background-color: var(--clr-bg-primary); +.code-preview__body { + width: 100%; + overflow-x: auto; +} + +.code-preview__buttons { + display: flex; + gap: 0.5em; } .modal__tags { From b44d5e75eeccc8753e2e241e09f5ed86cc8181cc Mon Sep 17 00:00:00 2001 From: Doston Nabotov
Date: Sun, 9 Feb 2025 20:56:17 +0200 Subject: [PATCH 07/66] Fix font error and replace with smaller size --- .../SourceSans3-Italic-VariableFont_wght.ttf | Bin 395357 -> 0 bytes .../SourceSans3-Italic-VariableFont_wght.woff2 | Bin 0 -> 135884 bytes public/fonts/SourceSans3-VariableFont_wght.ttf | Bin 647306 -> 0 bytes .../fonts/SourceSans3-VariableFont_wght.woff2 | Bin 0 -> 167396 bytes src/styles/main.css | 8 ++++++-- 5 files changed, 6 insertions(+), 2 deletions(-) delete mode 100644 public/fonts/SourceSans3-Italic-VariableFont_wght.ttf create mode 100644 public/fonts/SourceSans3-Italic-VariableFont_wght.woff2 delete mode 100644 public/fonts/SourceSans3-VariableFont_wght.ttf create mode 100644 public/fonts/SourceSans3-VariableFont_wght.woff2 diff --git a/public/fonts/SourceSans3-Italic-VariableFont_wght.ttf b/public/fonts/SourceSans3-Italic-VariableFont_wght.ttf deleted file mode 100644 index 660d1f65c7e2d99ddd04e952c1cab11a4a5d8a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395357 zcmc$n2S5~8zxL0Wot;HQKtx1@-K8rc0yacM#oiGSJJLbyh>E?J*u@$PDi-V&d+(^I zSYnGY#u#IaF^Mt8B*y)o|C~WF<-YHGzx& 7EChgOWWdfFnUQIt#bKiV 1(Iywm_hC^=%+tbNDo!DGTZ`rx<+j^jE;H;R7V{BwlWnQ^>6erSBglF*NE zo$tW0Ut+)bf%j}%3}P(i8DkMOQ*eE8quxgl{xGg5rN$2)2(^d*B&bzt-{C2?J-Y`n zx$R8G58h9O|4BBTCo*aI7DRbJEjd2Pr@c=w{NIEB+G#jpJ!G( SFnk zwI*dvcq|L%Mw~6J)9GYgDM^07Bnx9^9m1&p8a0V%&&D&e#UkoMx1O8LjIX4N{JyjR zVn)1_7ki}0nIp4eR>M-$GLar5bd#WrSLOcVm{-FQ+&lox1=Ybz5Quzqfd)ZgWgOO` zGec`=aZrh=CK%Evg}oP(C>;(zy))zca=PxojLeUPvSuub#j aq#fz%eNnX{p`nAzrT4a>lG{O(l)mC4vyuWDmc5i8qFS_ zUOtum1F8oG1=p+{S}!cTLBoh9&DunEi%m#M?Jpv1$Qq(F%*tRkgfVUiH$-6H)X)a| z9)=#+_cvr NJ<14UV#aCm$hOfmwk8i+!3*U XsK_BZ%V>_6w9WB&zzjQt-RC6e?Kh9k*FDucbf1k;gRBp2*!NOiEUD>cTxt<)X+ zp3+9_^QC>*ACwMZe?&sPNhhWA*k6*6iu8r_1@>P`h+ldteT)5f(hu0bmEJP0V>;BH z&RU0h)7k25u`jE0#NJtl6m@PoBlhk(5A1_=!PwW=b-})y4z(wz%Bk3=%jwwnmHS~o zKpueoAbAk>Lu6Q(JVJ(5$fM;k*iVorU_VJleabWB8Q9Olc+BO+GHgR$C$GnTtBg97 zx69kH-zD$Devgcrl=sW~u|FuIjPeor2=>QhlvF+?!$RZ&xd8i%av}CbGVDaYCf~sR zj(i9E$MV qxWH4X|2FolxQUy z`@TwF^b?c8ggx~uo!YN-=vTwwre35|dyzI|MxfesNRmdVnWg @*wFV);-nTI}0b612rMz}GU+3H(pZvH;cTw?b65beAU?#h~5 zX0Cc0&8=q+@^6}3VUhAC&23=8vX&M)ZC| EIyQlfFX0 8i=Q_=B|nPwTtGi#jII7 z&0U+>Vtx_%se_eAP0byG8O=*`*ToF&s<}fk8yDxl9$Z*RB8_-VAAML;mc=qz296@w z0Gv&FryW@`CY9drj@#lm3CBZlHVW=kxG0tk)&^%&SsLPbAKUwL@6$4~mhcmgP`#1% zd%wjge|Y`x&;B`AABHKJ#}BW(&(DYFJEJ7Ux$g)UO{0Br&WwDTQ7SWzD9sF9OMxcg zOiNJNdl&Y-SruHRS{RJ-i>o74-ve;9I|u|lSrgQ4Cboa}(HL ;h_oP;f=f#b0AdMeG9*E*a@k{1o$_ z<8nm!N}v>|3F?8a{}5lInq$h_P{jGyxM1mW4K1EJ&=61;GyoBx8E64e!*b7mGmQi_ zCDgSXq=rD-Xf2k2e8jW SCaEEdYrD9X+r3LaLhT!=2tl z$YSQr9o6`$Jz8P`+X(H@j#WdbG~{?7Vxhj&6!B3nL;iWIcm6xV2aP?{a#Y{cbEx(x z!~pmgx#&}z11=-9Gth&IfO1CmQyD47Bh4miEZ-o$KlkN$oGICp`cf$G!`Qb`eV4qJ z`X|5fSc(r+TUd;K9g#2Uv1B7ug8s-~jei*P{%Jfa8Hf2@EM~+*<7+0;3uV=@ktLFC z4aB*@ECA5x5P%$Hpnj^e_PFzE!=hE2qS|Pt)>$T8ltKzZ4MPs8PH7Y)A7W&o+NRz> zH9Z7wVd-Z0CtIV?EfKF7@ly--hwFXJR3_0sC Lhv^pQ zCLSY5yjrGsmVmrb+9i7;rQ3+X^582Ibz=T+)z61Hd0&!$sw0~J1|vPH`2^HY@rW); zM=fqPJ0o9Y`7K#TGi(v_CmrKRt&z@fMY9&DzfMpy>x`>W*c!o7qj9aN8n!*om|^?v zakhyXqNVDlc&TO0s(%`VTjMJEq1vXIOte#mdX%MFC(R$!zGN9xyJCjx4c|#>OHhxX z+WpU4`2EOG9Com36^TfN=C4G=N^>Li@F7r|Z782)IW${QU6S2W?NJWNC)piY1YM<( zibk5^>(uXQUZL^1w;HP%^P=c;WUXX%RL&IaDM!Mt|G8BI{$w-5U}3{hC-KO|0JLv1 z+=+1YLx0LdN|f(NT%~o78Ffz9(*j2{J~et5=EEK=@<1cBSY=Uv>W4To)OkSU^?g`s zAJ~wZdn!vOwWP&X))D95&r71Vsw02YuC%_O9!hS?v&a?MDYbt9tm^N^rfRSric|E# zKlj!e2p7m|v0zpYaZ?HubAPnK`<@(#YgC>-NQZpT8Yv5y5h{SyR%0lc_J?EIhikEt z=`}+AM!?qV{bSDGuODgL5hHNP($qtnG(ijz=u;)n|5v&ByEr$hWeG%iYQR;ptt$Tq z_ESZ*{P!bRl-e%TUS!c^_3!PJ<}6y1(O6O ?JTkZ%IvIu<_8A^qIapP<>TR{a>Xg-8tH)L^tlpNgF6C6pqf|ht&{EAxMU{#z zwY=25Qcp^~v}V>e*3Q;m)-|mgTDP(8Vx452X+6$*i}il%)7C$h4lX^R^z710ORq1z ztMt**7fRo>DQn|qQ^ls1O(UDOHl1wd+AO!(V3Tii+@{dxw#_4(A8g)~u__Z@CbP`A zGBe98DYLfBjxvYK6qdPN=7nu-+X&lsw%u$~Y%^@f*iN@yWP9EAbGu->aJyD^F?I=d z{q2U^O}3k7x7Y53U7_7AyN7n)*}b;c+1uJzwD+=aW#7p@&VHDEj{PS4z4o8me{26s zSzTG%vMyzP$_AHhRJLu|K4mAD-B9*3hcXTo9lRZa9O^r?bm-&|@6gX-xWi FHSlqJEuxczD_lq8aTCf>g<&0G{9-B(+sD@PHUXDI~{U5=XBla zbEj`B_*V$2(4<0Sg&q~sDr8m|S7CXD{S{7ED5`L;!jlRwotd+Zv$M08bD;Au=ZVg9 zoR>N0Iq!Bp=KQiEtJtVw+lpN)CRZF(adgFxDlV+Jy5iP~2P&Sac(vkZ6~C$YvkP}A z<5JPZ+a<`QzDrA&PA>5-^IZ13d{xP#Qs+vEm6lh!?y9&(yT-bvx#qgwa+BR^xD9q& z?6%r%v)etRY;0v5XdGpnVO(rnW87vuXgq83HAR|wn9@v{rg5g3rX{AerX8lkrUKIq zvzK|ed9rz)d4+kSd5`&o`KtLd^Ec+7-MM>NcQ^Oh?n~X*yMN{3<1x@ eTMo> z@Y(Nk%IC7r9iK-&-~0ULtM|3{t>o+D8{`}2+uS$WH_o?@?@-_IzN>t<`0n>T?fbd! zQ{PvWd1af*E|tA2$5ftJd4J{8m4B%GrixV+$13J3{#8P%G^r9 t!hfuf~wd2 znSWRRZT_#T$<^$uxmK%Ot!A}`)!J0+QZ1?4fNCSEeN=5hwN=%&RNG(ebhV;t_o_Xq z_A;PJK%anN0TTn}1S|{43)mfSEZ|l3fa;;un^ljh9$P)V`q1hVs?V;zwEFt$&jRZP zHVy0$*fX$q;E=%afwKay1>O&Q8u%(m3bGAy3GxXF4hj!y6%-Sc5Y#_tM9`F=?4X>W zO+kBuP6k~Lx*PO3=tXdy;6cHwgYVTSSHo1JXN?6l4%Rf(jH)@L=JuKoYw2nQ)rzUL zyw-_Ymuh`h>zi6X*JibCYCG2+T6=#TU7dDyrq}r-q(VrGkdH&YtXr+_;<|4`6GK;p zZVG)+&%a*3dOO1G!=l4Rg-r_EANFhg=Jkix&kvWwUBhdHM}-dypAfz({7eH~gK`a; zG#K09bi>jO6B-sZvTYRAXnmui2y;Z&h(!^P8v8VE(Kx;F+Qy$X{=JD$lgK99nta~W zxoPvJLz|v&=GAO&bKbmE^9IdFH9y(>w-! uRlITd!{YMeFZc|JtT;oAqsuv?*wFz0LhL-?Vwz#?sch zZTYt5wpH84w(Z?Ev+dZntJ*$jSGrx>c3s;gw;R-Mbi0q*Eo`^C-PU#o+MQ|d-hN{H zIqjFV&uhQC{jv5J+uv&cb^D*%TOvzGR*3YCtPwdTa(ZNTWKQI!$i0y#BQHnZjeH#W zBJynq>kdvGvN}BM@VvusQA(6UlrhRLDm1EDR8&-KRC?5is3}o*qaJsx*KuFRQys5# z{IuiO9e?U*i7p*oA=)dtdUU<$X3-s@dqt;5PmW$5eJJ`|^!4b^qrdG`u2bbsJvt?I z>f32_r<_jfJ8kQ +>h85}bwW^v5Qn0qmgIy-mn+<9E* z8J!n(Ufp?1=lsscI$!8~t@CGH{JV_mvZ>4Kt_{16>YCq8>gLleuG`1mKJPAdkLf F1K^r+n {-_j{J^*{bK9o&~XTY`xg%*cq`GW3Tt}>Xp!IZLb}@4)-ePb-ma9 zUQc_yij(4O<0{5^#|6gKi)$9wF0N}_Qrv*J5pk2_=Eg0FTNSrCZg1R)xbtzJ#C;L> zUEHtna=cx `6GDa53R}!siL!Cj649OSDU@ zl<1pSBe6kZ>%`89iHQReM =bII3}KTm#|{BsIRDV^e!;-2E4QYR%MrEN-=l*E+&DZ^7H zrOZiLmXepUJLOo)#gtnqU#5JY@_VWwwOpzxwQ6de)W)gpQ@f|8rVdUWn>r(Paq61X z?Wu=S&!t{Z{XF&C)L+tcX?AIq(tOiuq%}xuoz^)mF>OHF$h4_x^V3$QZBE;lb}H>k z+NWuc(_W;#?QPxLskcY(fZn0KoAr+B9osv-_t4%Gde82?wD Ug>+Q@7sP#Kihsy`?c-2q~G2CN`Hs` z_4}vy&*(p*|AhY2`)BuG+CR7d#R1X)>j9MqbR5ukz`Ozb2YfZqdSIi0QwQ!Jczj^N zAU4QmQ1e0U2X!9QYf$Q-Eraf7l*y==;hhnb(JEs|#@>uCGhPiYJGk25NrNwC%9$aV z<1*K0ULRsJ#BoUYkgOrwhTI+UaLDr^zYUd!+75LZ>M_)BXz zVur;ITRrUIu&2XbWw~WF%UY1NB`ZJcaMtOp!mJxv_l7qZ-hB9!;X8)!A7MYD<%p>x zj*R$mWc87KMh+f1a^&%mg`=cV)}tIoxs37{l{sq9s3W7!kGeYQv(a{=6G!(My?FGk zG0tN;k6AzFyRqi6?Z?g?n?LsRaplL=8rNgo{BZ^2ipJd=_h{S?<6e)K$J>l|9Pc{b zYkc7Nu<^ae&mX^i{J!zW#y^|jF(F_=(uA24c1-wY!p{@_m{@9J*@ GT&fY-TvlaGjAdW5bMFGk%!qHZx)7q?w0io|<`o=Hpq_X4RV2a@LSpqi0Q?HEY(w zSvzL!pLKlJtJ!w5!)A}4y L7G55?oHqU-u zrFo6!rOX>NZ`8cW^XAUmKktid>ujfNkL;@1HM5cgar59+*8kdwTZb?6uiDvyWz< z&AyWTB>RW?Zu6_m51rp~e$V-R=Z~L1cmCS>yXT*q|8V~E`M)nv7T7HaSkQVw+Jcb_ zW-qw4(7dqv!mx#{7RD|dwQ$kGql?Uo8Z2tHC}vT@qW+6UEIP87FD|>-eR0s@MvJ>G z9=v$k;^m9CEW^5XkTLYK^3a{FV$$B7>oEUmtD*D||hU6*~l?7{Mc &e=T!|>ja;>0)!Eg$)h?^k zR$4ayD8ZJgUCw^MFxZffqp+~K(sa%bc&$X%YhHg`+zl{Lzm z+H1P38MtQhnuBYut$DEK?ONxxRo2F?oxb+q+RxUxuWP;Tqjf9Ron7~EeWmry*Qcx> zy?)pFZ}Ob-+U8Bl+no2~2G 9%jShi-4az2o+{ z?fteN*rDGMzN6oc`8z(@X}z=Q&dEE^?R>q >U$gSjojON@4~$~dpGVqu=mQ|NBj6bw|#Z?wcXcu--3NB_ifvEWZ%7g-|la? zzwiE$`={(*u>Z~hrvo()L>=gNVBUd`53D}0^}zW9_YOQe=y!0)!C42_9Xx#S#=+-@ zltbo2bq{qvH0scbL&px?KlI08_rvuM4>&yP@Vvtt4<9&u{_y9AzdxcJsc on@>GE9df$Q=_{vyI8)|~(;3s5%4dSkgq~@9rp=j7XJXH!o*8&%_?Zc3rk~k) z=GK`%&Q>~G_iV4Tlg} }&bg?p>Fz z*S|jU`u6MhZ W-l~18 z>#b3@@^9teu711q?UA=P-M)7F@t?LAx8L3wcGuzVyibEa-F>g~y{vmn?w!2%?Pt|K zqql-M-J;v=!p@Og>OUvLCGLewK5Qem;jU~0Ub5K0&D )H <=@$OCAB__@S4nIHv5AR`C7^%eYDV@wj=86 zGxQ3Lx}p6XO4L`$x+~#E3vR_{!SA #vt1_!_bpx(%L3;CWZN-1San7c&DR`|%(rjWb-q%w% zvP{IgfHv64-^8uH4D{FY7e4gMJ#f6?U8`xW$4kM=|9-p2-Pk?!gzfAKH&IE|Z7W(z zt7Bdhz003nl5}`OPQ>viJK!Iyt^Cf;i|zgIl$Sv-WawMV*f_jUwZ6obi~d(~duIol zJ=|s&*x8aB`l?^Ct^5luwqnv7@2v0!+$A@%2yNqb7!fwYB2Wt$Ehulhv2A6azzR;Q z_Hu%qz`Gdt)cW6svgUDTZijGdxhpr}t%@ydDYi@O6G=vjxokaJuonDOgf)5L&4v|t z1LFo_TBp|DCUzZf32x=HQ2)Ex9X5vt<848z>1~LE^a3}ajmp3}PU3oTP3_^ncrh#w zDOOeMrjTvs<6)&M(R=K99pvs4_`iXd&bIO@2#<$v>dR%@_&kZhs$JA_-C%o=k9@RE zHs65PzjF9a_%2T4Zxk=0IkMB}pMP#89IO5IZ_XF{rBGB)|FEt2hx72S)~*BF{O1kt zdv0S#i!B^)iqI%{iLb=VYqQxlUQLqFY8x?T-a_A4f*!pE*H2<>IDj_ZkE87<`vT;T z&fLNNIOdGGcoMu6ufrAc*?cuC;>+Oc0K%>2wis>Jp&hrvB5AZN#Or +5m-^w=uSO>PH*mmI=^)9{()_0FD=ZpDTY=`&(a7cZ%59LR$KfzFXXGSVd2J?(zuALi}1qVGJX&*_U#4Zu}$UMu${qn8rx>R87bsqJI;@S ?)gG!6z3qhb{oC0a-ofE~L5*aqK{-?Yum!`xMqf zv|hM@xs5FFB&>7?VhO}7b_4z92*MS?-VVUeZZ+L42zv%}d`bH^6lP>ly0P*Vqp3 z4Le_rcylp#Z9@zvv06HaIB3 %Oo~@YMs2|XJi%PW-apWOXo|@}V za2+!^pNukp3VXhWl5S#iY4qbW5f{ci)XfUan=3G9 ?Sq{(C UF1Cj&cwIaP zS180(yjZTbKUtY-X%~ 8*~HOZanH`A7c6x7WNUgX<+8xZmJRfi``tT`KWgmvGa)kU;Vp* ze#uZ8rnVck-CsBA;k420K`S)s6XY(ougwUvLv1T{9gnv||DXNi <4xiFjcFv(45PWooWUM#B)!ibKd zBb>z2w}4&76mS<)$mi@Kd&C~I=j;c(Nc@`p#@-+a3Cmt &m2GJU8%JAb`$}b99gOA7jvf^}EBHA3 zI9IOdSJB@!z%9@iY^rIl>0ZSn#3R%*)GNd*)GN$8+$Y?pVdV(FW>s7Gw+d)ey 7eY;^!X_i0{pWgocGTjA-1XS&LS!+q7*L*&!-A zrgN9B-MaVa8QUu^J|QtFB{eO*Pv3t12WDgr%^EQZUtK^Vlnh?)_ep73{QWAt2;C5; zr7p}5mC5)6%T39LRhFDts1(L3^GDz~jze)AgZBY%;CKs@Bx~pnoL>vNfFu?!*=S1F zo-hag4DYk!-7I`@BwD)3`tqZedzjH;@LszFzX6EDA949hwk&|(!22DqSfHdZg};XT zCSjQlOY=v=2J5Wg7w7p)gtJ0^tq`Urj>jR-9(X_gHEW2~bEuSy?}Cl86!9gNEqt8i z6_w{d;M#xS_k(zKiseBuY8{3%Cus?5sMck1eNvtN8PqY=^9Mw-+R`?ZhwA=+6w7PW zyVJY&q&EFK5=xv$n^U`gh~?nB<1s9ZY~o*IdBtv6Xw?S4mKXTiQy||UY>Dg%Hlo@T z*;TP^k$wGzgO<1aG{T<7wP(zQ7clF0c1X5JkUjoaw7~T!KsNh7hlIE!od*l&hb`C8 z&i1l|_@}_8|0xaXFIsv3PSrj{{pcT%x~X-LMEwjj15uhgOjDe c;d#!MOmRV6oJEyhtAOaBM)C?1z-Z2niMV>FG^ zA7D9Le2hA6D8_bmj5osVTH=_-{5RUMBiu!*`!U)L^8wWZ%?T=REjgq#Ka_;#3am_m z*+a_>xa|d&qbP$jp6FEut~?aTXlF^xD>S#fn_oW2_lM<>a#>t)IXLE_|3TF64eLS> z=Mu{kzS;6jm!h_3@IR%2wx{m``@hF>0d7TL$yet^nj8NC^ci)&Rp(BcKRuWqFlxtE zn!0cg%Wago;lByZ!(uM}hcMLse@F4$jXG{pj5>$YJpND6{QfuKxnHnaKW|X}*_I#p zOv^!)8~A?ObIctraQ>j>4Imq_<|lF73Ux{6=R&8!M#Wgs3gbgC*&U4q>KX+$skRA~ zb0%!)E^9^CKp?*Wf7C8pSSh~A^5|XPe8U1@UjaG?p=utUu$qX^72~Om8qZ9uY4C{` z&IK^owz>|wjJzyCx=@s<8GnIe0JlHd^t#7l<@(|_l)^qe6;6dm?J-mwWUACd X@2yRejo#2lqer1=6+oD*OxuK j0{Il!S|;M6Ip99}A^H~I1ovFaL)ewVbKobF`M@uYFX4zE{}IP> z7KU<$OReBuVA&!?urMi$!U6bI;~0Z XUw v!0bvM7Wks7v{c$`2K#SLl=+9ojA7hgTwU^EdVZ9KC3)CK}A)Q1y3oQ=_ zohz=n;+g~00rl||^#L%qR@P PMk3Xs3pN_Hqp*4_-YYDfoE3&PBK(%Sub+PUJca`k_-{wE8 zQ`D8if5N|=4=vAp2j(nCCb0{a`|JX9QaQ^;;c=6_ 3LjIoGE=cMJI%C-pM9H9w-@=j@p`$jXrhP>jtLddH+wotjLPUv}ynlHL9 zr1ER`*_5uDHm%uc9eNVlA8QL*kKBM=&SZL?jWM!#jhc`C_Y(KXDV8U&fAtv?t`)E4 z#JvI5pwbGAdGu`Q4dUF-LezB?t!J$;-p8U&^T8IZt7y(Buso);)b!v-O`q=NupVdc z=g;ZVQKVal^OP6L2Pv(0q0(&}Q=YMQQp5L0zeG8tRa*WFkViAMB@|<}ns-VA_rHMg zG~{(J3sKjMD6?v-G~d5P+fd%FVLeRgsp~YPqph>azEs;Po`W&JQd>(mVOuz-wp)od zQ` li#OmdDZowy8fkgJLOM< z>YM7mxZWu~wVtRwDNdBVI8B`!vqk&?z>Kzd4c@@*2qaJwWB?C9=g40G#<~Drn+=5R zyykl?FJPl)=v!Q?iTKl?!aw;V3UJT#KK|!O;|2IZ^ M z%;vp6inC;X>G@W1eurxQ@Fp9LNyTH6<-Tqgi^ZJm2b}pRmH-?54SuHZCTt2c3uM5Z z1u_usId5Wlj&q}U8s>pCtksJ!h81Bwl7_LN2+!%Bp`SfNy=1~puqMFUB3@X-(YnA( zzlwQTHN @!989V%Ol )I}8r*3Eup+;yk96JCTgsY5j&k*Jfg+;g~2$u~%A)qGww9qsX znuX&gAROVk0VDDo0PJzD2R<9>hOj+wukFSALK9HdQ7C5<;15ROcoA$F;Juj$v^8lg zKMdx9rT7ei&XLAJqj2BYjE%#!Ec~|GD9lMy5Km?9%!VQzDnk#|pIOx&JdE|g=bEv| zCzU}>hb=-qA#Hr*MDtcG$``BVF&60~JS)JljAz^hXs2$hKl(xn+OaRULK$4}>_9<# zAl`R`uxMTx?TUCre2Bk?nr1&W%>v}l1vY65s6Ik4wl2nX%G(mO?*qi$9nVmMpatp} zRuM{L2#q} n2sDWl)WjOTru3L~!J2`tC%tpi@e_o@HN-W6 z;zT-u8k7%m-zag8#ydJ!tn>_}hjuO)N)(5$3U?*UiB5QPBpv-}4D4nMG!1>;frsE( zL @PLzqS=lqf#-ftzr}?-o9VlK(*5Uo}HL;rWT>h2&@X zkw3>6?1nyxH4Cnn1@;;?nmR&}j%6Eo1h)eH0a_ol04)LhSl&ou;4cF0(*@)0J&do& z3+78&_YnKRO|Ta{0(Ze>@Edr*U-MvSH-I^V&1BbD8i)h^K|4S;+yg}6x)n&lIad&f ze&Spbw$`#AALtImGqpAt6Jk}OEk_WhKX9Vw{a6)M*65~b7_=E z;<^p+_JQRW9J@guKy5%n zKz=Astw1bj$6pq^@hqBIrs7-#h=e;AOak~#Mm(<;9EWBAIuFQivD>m7Zi)lHOKRx_ zkd_7YU}>V!pRu=;w*?>@kRO8bQx*CEyo8&|ihp=U$8bNvP~W0H5cVy8mGUjh_BH?@ zPbzeNg9gg^2j$^3cm^IKEb8jt)eqXmh;XkFp6akzf5mYn?HJeJwGW)dZp+*E?&5Rr z+Kv1bw;L2|7(6ls_CNtHnw#mK;CI)aFdvWv9Cc>q3}`(jTCq5mEF9Cn379tvVYj#O z+im4pTU{Qg%)06hf~G85cZ)@1E@$k8 #fQLqIsHMER9mPUd5q2yM7K} |uR-v^3cG$r(~5j?|VtS;R2W=ANf2X{Xx z*&t9>K !G6r`i;=h0(~BIj6k7uS7}hYtQP3;+rfAZMMa@HStC$V zp%exv$xzB4P|~239?)-wQW`){@6%8{0>uKQd;tAvD3uc^&QJ;i^pl~~W wEpm5Z$s2nubQ@s#WC!Yzp6ZF1-dqF=J z;0~0r2jDA=8cm>&1z4Ff_O*bgK%ao8@IyBLtpIl|40l!xGa hwaxoND`*UdIt%dYJPhx&3PwR;_XK`vhT+>!f)P+x0gW+u2U+kD)F@zM zp(c$PP_uxIgSu $re?6oC5XM$cCbg3A{wdxUa@iXk`KJ!Wh2Y zA;^LH3D^Q?RgG0pe*wP9#nfN8t_EEV0t9&Xm8rjUT^+g(1PXB1rvBnJ{pvN}0D=X0 zBUb(8Yx?zTz7fFw2)y2hU$EBL1g$NgaTniU5p08oXzYa670{TAPnZO|p!Eba=HgCD zkPju>1vD=6aE;y21_By4c|(mOP_k)2V= @>84#&u|vfW|`J zQR53}w1CDo-bv#-XpDf7pUxT>lW@1JLgOFrs_`7!O`wj0)Q5?efch< e~Q6V$Ja6RfWb;PGbR(Y@q`MG^X-F0?7`V zp~0bp1yWgPrbapF5P{?g9jZZN&oF^R{Wwd5#-8CCZqN||sTy>oh6y@KAXSHs)-XfI z2=KIu@v$0zK*woNeUBI5cheZ3B49V5(*=y`ewIL@cAhQ3Z@V!*N23aKu7K8IJX@fk zPVol23ce%C_yUa@P#QaknqaX2F90(<=@A@&E)z&pXE_=dp{oQmU9qYAD&>b`5Il z9RkS(x>KVzbe{&*^D%)`3wj)&pGj+=mjtwi#Zyp0Tj&)5p58D#T@aA}s{&f !5TujfW}vRXHx~wCDgG)9Y4^wBr5@)&@ri$0N)X0G+q$2mZdR59VgJ9`1DGJ z)_+n(0hNR7kD&FPR7r! s=a0)UgC@ zNNYZI-4_mpeXC QWF8K0i~t_hJGNm5U^FymI8c=$nYeH;prNas4XZ@fX04_;sRu|QYQ_% z9s@dS$6cTV<-e;&U1&D|TfirDOo|iWi7}Jn0mYqEf-!I>gH(|A9-aqxZw<1IbdA1H zsv{^r1nmdt`XDes)1lA|Fc^#gnHr;^Ljc*=SU|^={uJ$)&TRnWz$7pYOxD;4ovNKf zf0W2Rrh^4whQ?y(Oab+KiTqKyKL*(vWD69AY-%M~qCw>)e?$kcOoQrWxdxSc1;_zZ zRtis0Iah;RP1iuz0cxl9fXXxn><}nqYdZx>SLiN*5)R!hP?|yW1q!w2K7rC2x?iBQ zg&q(X3{Yy16S!}+f}REEaNqO>S^x@h-Wgg1ZozE_y)7_s=pBJUhTatzB BE34 P}Cz~Xauzv7#c&%3Jgu54gv$pt}7=nw1Sow7|@P7w2cmBHMECP zIZ-}C7pSkm&=X4K1cqMFDgb3Q#6zi^z>o-~a-w{OBq)^)7 )I5sjjoYkO`&y0R#HG4(&%6vY@d5c{B`%QvQHpB$UFS z|I00)7#9ec%05OQQ(a9G$W%X*1#%nc6b&lVRDs+KIt@$*wZKdbD&K4kYP&fa)OK?< z(xCIeYETKR0UH6; zFFRM`9qA%-C0Mx1Oq(`DR3UN0~a(B zp%*n$poQQPp!T|~kqW&ckefi!XLVNr)$u199iZsPgiLLP{;PudLHDT!wH5lQ3boZ2 z8eO3;HM&E8(Wn7^t -!+Qhej(j#&Jr9nIc6fdz7P+Y`! zU{wiV3o`K> A |eKx<^Tkpf!xxs4S_i=fK|N*yTr6rrGw++ah5(h0gvpio}W_Jl%tIV4cp zL5~R( 0=l&@%?3 zhk#9kdJ5<{fzeCA$Pet3pyvff9|5B{eFgN4!B|;9zmZ^sEfVxx!RRNz=h@6yRlt`( zg9R)X3VSB#`GK*ffUSYTE(v;;V5}{m&vlG-1bh!PL_nYM80!l7UMSk0pwD}Z^#pt$ zG+aQR+ZY=N@HQVaHWbijI7ZkpLC+_Q5d!)=$JkiFk3(U{1fw{c3iuglGXZ^WV{9(q z=b*54f W{23H>Nw5ddt^&I6H+B=ShtTc< z{v))9fPD$=Dc~=lu>$r8+DpKHg2oBh*U)$Ye+5kt(B~?~L;*b;Fs2CTGZtg2fSwZ= z(*^W-i?NS@TcCXfjPig!Oh^)x`T$^*hXDdf2h9-BXC21D0;vLYjDS9iFpd>SX6QHp zr@k^?Ah|;)2)F}uqCoP1P7=^(6voK{$qPDLK%X}l=LjUS<+%d-Y{58BAO%3P1)S2F zFTfi`%t(C+a7t^TKnjK~67Y|qiv{#7#F!&s-$7RjBx=u90@fJ1T0qa9jkyBW1iD7R zqo8XAjBInAfSySk*9#cgX`X VRu0(ur}JS<>o&?5pq1bS4!$kvVtIN8*30lnv9 zJR#uYp(h25!k!ZF3DDC5HWYeBz{&2;3fM5{IRT#pEfC ;sFC6VjIL97K+iRe6b3NzOa1_V0=+L_6z+2Y z{|5R%z$lI{1pF!Vp@30*Ukd2?sPU12J`**5C7@@7#>WEsT+~SU0Q9`jNNEH5T+~SE z0eW6&q%;71Mrx#Z0X;i3J`>RArN-|B^c>OnTtJ_l8ow9NGezSM0&WNWQ9#cZjV}cB zxv23cf#eN+DWK0ejXw*ds?b*gPI>r6Ao)XI3+S^` 0tGzxTvo66c%pj!d$F3_!l_7u>4xT%*wmkW&p@d)b( zO#rEIQyrv%-bia5G#w0pdn0rp7zB4AGy`D#p!;D{CKv+u7f`CZVQ|BCOj%$!+;5;% zk0TMk0v!cL!|ene2gbu~hEm;4h1&~Cbu ^ 13q5A|fwex;}H0fE3 z=^!`+cVFmX0X@Gk9TCXwp+^OBJLoZi90@%xkh?)o2xMw2$}5lqpr-^f`i1GVfSwVU z&I)wjK+g%}+Ry@U9{HiVzW^@6O?6Cd26U8njBA7(4ZSRoW1v?Aau;Y3xC;L-q1OP$ zO?rl5qPhUOSI}Dm-LKHw;114H``iVe!aW`OnLzFYy)TeELq8YDU7-&E`V&0|F=0$I zeFe7!#W+UDw$QHyayjS|fO6CGB-2xX@k*BieJ0Q?hhn@kJxAE?(C-Cu6!e8a4u$?C zkn2FHoItJzrLqCp2&FOuIRg3`pscz@(BHuCaKp|_Zv^yw%Jhdo?g)J=kUKDDHV6y{ zprt@*Jg++lwHN58LdyzNw*%ZjKNE^Fn;qdspD<&rBJ{JMP69n_+FU`PM}IIogNpDo z6zU?-kAPMZ=tn_afgAi}K~YXZKN4yN?r?8~dI0nT{T!%|KtBLlU0^r@4Fo~B#~cq0 z1~uT`0<9%bwn6KHP{cD48Ya;1g4P%4_d>%#1Nd15Z6Z)cLz@fqyP+)v`aRH=0)0NT zl|b4I9VpP>g$@!ZlujlXgZS@5#|jj*sd*fjjq|V}^J;<84+`5N6soJW0;NB6JwTf) zR1X^k3Z+A710@4W IBLjs3OpzoE~-p1@-4qR-m9>JsbqeVrY4RG6q^v zpe%*D2$bDWiVG;4peBKWcJ`
^?zssd#Pv^J;%|9hdZPeNG-jT0!aA&+>0vK*QO zlHmva)Dz_*lwYAJ7hyo2J?#Yw?99_yU_jnHT>CqHOYPj`fcO?i3)w4(ua<%zrz z2IR+k6<7^Fm!T++_hy96hQc-p{R-$VfVh=wP=xnJz3S0!-V`3~pxl5WJ#W;jei0P* zM<{opuoZ8z&zsPr;28WYfgT4ZaQ-&*BshihOQEL)%BRq?0_7?c_CYA0K`#iD*U*as z el;?K)DBfEYQ!x>&&Q6AJ~L)9|{{Fl<%OSpdQ>$p u5(?7sNf9Vdpy{9w&Oc(zw;XVU`vJ59aEALKG)kbr z_I=The36EJG!(W$D9@mX*B5E(QOEwcPB65Yf4qRB4g3=X3}dxF@ cTv~hq3@P_+16m=4SI?+#uBA bgMgwzz;PQX5awinR5A$i>d9QnyZJrGhuDC!_D8E%v-Z@7ToE6f`qkSP9<0(!?V zZ 2wn$@env>B-@F$Bh3fVvfntWf6euVo{%Ws^ z6b(h&5)$ffbE<$od;c9t64G`k2NK4C<4_%taefD0*R==?M;ZUI46s96pNCdgVfsR7 zIv9ZSml%J!QH3eb@mh_83R8Z-Yc(xYnDUD8U!7E#@;#HwqAjF`NEqL$Wz|_-?D4%r zHUi(P8js(fp0559_G0|ba}ItzdMAE8`WSxu`7{1C|Cay2f0nqUmr6-xB(vlx`AT)9 zaH*-(Qp%J@N|U8*X`%G7v{Kq2 B{KJ>B{TOIv<^%&R-X- ztEmgo)z>xDHPyA(b e=q+e|KjHD=I<8Z z7UUM{7UtI2t+iWQw G4xzBfB=>D<$ z2KVdkUwdGd^-w(QJRCgAd$@R*JgRt9^{C^~!Xw@z*;D6f@9FGm@^ts~@vQ2-+Ix%l zLGRPvXT1x(uXx|_e(Y1$r@T*?PlQjLPohtXPaj`LUuWMa{4KvE-*5aA{8Rh~`Hv28 z4)6}B7Z8=_n&+L@KCgRTa^BRukMg$V?atei_i}T`&8ff3Z!H#BDl@Y{7RnmoZSHtB zlC4rLXcm4~ei42 jL-{3ZWIk|it2Msk)sBp+B%sMJVmAw^0< zq|wq;X@RsvS|+WQc1ZiAL(*BPKq``MOAlZ{c*6h| MVfJkXp83mOLtT4P=h3)&0|+G)-=@7FBIse}bZ zx_5N%4hx#=zQBDEET~AeAW5~Lvaq0v9!AxIYQuu!Jd!*m)q-5{S0%k+L94tsdGGQ* z3=29B3%U&pvWEqQ`ZQ22DA_07x14VUSWtIZ&}08N|76XAJOV;h3-ZWom)9*XDQ`F| zXsc>LFJM6_zhk5$3)1WHwS*Jk5Uhz=+P%F?s{X4+d&@vPz5G&~`0L&>^xZjY)m8f4 zG2W_>Ys-;x13Dx9N_#m(t|Qli*1?rpa!WZ#_Yg;kz*Vj!yRaL0OYI!e#N1$+Zo!OU znF&U*zLwFJQI?UGEDJ_+eCpJh-empP|Gpaj bK&M)HV@qN-R9>vVYhs@*QT3LUL)nU>F7--ZaQYuL3qL*|Nh0BE`M+7 z`{!;td(-Lf7Em~1qh~h$#@IVIZ+v#+Yk0n8 7#aqEUFH!RyQ>E#)-Ir-oNG1Pw6g^cZg!i*~z+t2!j?qghxLf;;UAMLiyqMhOf zG4%7u0JKA}XMk|}!_&-QUNAps4i*L{1SbWj1g8a;1xpdKG`Kcc8Gs51zE#+RRWH?B z4NwtP;!?sVp+*5F)okaZYEvQPDwLiI@!``_KIE_FJKq!}KA-;7BG?l?N}Zt2QWvO; z)KzM^x>l`JtJN*)ZgsDESUpPIVCD~gcvsJ=mjNxFGGVDF^`K4nvU*j036+h#bZ?!| zMS2vh6;IN&2Gk_|(QU7-|I8e-9R9!oNj%J>=2`P`C A=|#tJog@|_iiT~g=VDUc6LJ;iO6XT{oJ#C$5;;G*ZD705*it*hClM5deC1g z&(L)Do`Rw3(4^F}b3>J(aW*yOfVu;sj-ffe##}8_9qJ!?jy^`*q}tI7*Qk~HBGsf$ zRtKvUYJqCjSLn<2GS#YHLJ!@fuG7oaGX1l dkj8bpt-s&WMygosnsM=T&D`q92!$z>(*(8SV z%Gn$?mo>7p**VZ_em)<_ZfE!4%ewp6{p w$IpTehV$52{4(f>SO%*`S25ThVVB}dp^G>yO5h8iWgK=SphtWiEW1E=K3@;3 zDz`%C{XOg^eg`yTJcuvTABEohhxilh@BB&FnRtOc#9xHnnU|oM{$2Jq|BSuMzhv*= zw)tlME&G6f$3EgevMsnl{-t2-bKLm;PAK-X2(w>B4*N~yvfo7>`$Kf$Ty*2z#X!ED z*qLw7cNDwvequP!7ZLs&uVquQf*i(&vL(8Sod{b73Fs5JQ*^Km`~zrg>dlMTUVLwM zF~5dA!e8dNz0ZZ{&Lwm?1!7yS1Znu1%xAOX`PuAPekOa2zsiS*5`HsuQ=GzgVz=@K z*hG92vk#vIn+Y4C&1M2LN*oS*8`r{i%q#3;{uBEO7AOXbB6cdj5VyNu<(r}Nt(xu2 z4&n#1o7wlgL{vb-L @Ut1=ZJIlNWH(_Qz!Kd zJzno^jNv9Q!f5@wk!Cx60M?+ _G-^36aq*bFhl%&w-u#7x2znG!R?j5K?hGE-ry z%xE*t9Asvh8dGap%ps=Lw3&9ZC>R%1%S4crg|Y~g-v~KU&I1pzJ2;2gp!{lOqns)y zfEJu2_kjiXedQEcC+Em|*&yczm7os~l5sgBxH#AxTmt&;(%?g^|69O8d=y*}d=e}R zJ`Ju6J_9xQd9XbA5_`he!FAvwt`EKqZV0{$Rs`P%HwHg|R=hd*F}NBW#x=oL!B5yZ zehyXzzkq`LHCPk;7OV|^57q^L1h**M$bw;r^-5re`B)FryXpcxTt{^wR^$?0sweAx z^ wW5BD?P$6bs~{2TTm?pS=ne`cTJ?!*_kC-F7zM0^8FU|MVk zt!DYWo9NHC5d(M+0Uan}81E|zcz+S)14N8pihBc}i33;#-v?SaCbKG>^C$TfHX7&m zWB4>^8{H3@Ca1IUIB&1!GuYnz0BBM;kR8I0f;OL{q0OU%wee$EJI=E^aCW_jAI}cO zne=5if4-bAXOH7t`3e3SEYtjhJ%zL3r*RJa41W`vE8b$S@eg75WeYS}e8k?sdF-3u zRgLJyv&8m1TkODdL?50jcI0`YFYhAy@omLUd zKbK#~FXdPAYx#{lMV<;S wPSN<%2k;{V~!L~uKVEdpqsLejXj`BKrJ^0+4 z cSA${Tj5=hKTp-s36N3q$if04| z1qHz_!EpIeP$U=2!{jmYSb0Y z&@bwjKw({|U)HaH&bnB?u3yy~)FtXt{hI!Vx=dZJ-_URAAN4b)pIWNl)F10l^bh(2 z$O>0NhPR5>2+d1HB_9Dv*(-b#kBCuxm>9u#5xetUVQp*=ULf}5!^K`aD#~~avZmEy zz1~sh>s`bQ$VAqd`^^L3XV)=oQh$7h-?I#|sek@6&%#f#L2M^BnC;Alu%T=i+lB4Q zc4GyQ)I?Ym>EbNG3beMzTF{@1}|+acgD_Zo-UX<8hB=Z#IEV1U<12n~Ys#3Y&^M zgZqKH*dNlK1K5G=Ajl-20I#!})nbPiTynBwqq*TBp2fpFo0IX3Jebeu%DeGxU`MV8 z-xj*Jdh+easvYmmcfjd?J^PLC$osNCV6!Hl_vZunK+q&R@xi#s(SSL-Gv@0MSdSaV zcOhKC{Kjw|;Zf+A!7dB?ctyOJm+(?Pg73~pvL9iXV^6*pAH~afIj`7?vKa>o Pv-mbDSRrQ#`ojX`Tl$cKLDmZ4gxJSi_eC%^*vsTowA-c zfHs=T=kZ1u{Wut_>m0s-H}e+0kRQTZv9CVQUSMn3TuVK5fPOlZFXo5wCH!!H1V54= z#gE47bS_q>wfs2POge#|2wBI;*xyfu% |97c&W9DZ3$a3Pg0;3w z_@$7AIBIMetkhivx!Q7AV!M{T3V!nyP)PG&_2~v!;=2)c-)@GrwN;>!*1(3_I#_+X zm9K~WmD?djxdRs8?xH;$R^#r)s{RS=vpoPx=|NCT55t1nqgdTP;E#iP`iOnTpX5(v zs6PGzf04fg+T|5cCL8!`{2%;v{sw;&a=o|tJA5O57t)#cF}62@;`tCO>3q 83;z{#$#493{)b?Y5enRz zYXS8Y2nBjcdx|qGvN>mmu!XD@^jRCEh E zK(Umt4WNrgh~33Vu?HlTdx=qyHI<7BQ3 x>YK$Gtj$+4%GuW|~CbM)F)|2xs zb#{@s7?QFKeYOm8*Q+d5c8$1JT!$~NJ_W_Lg53p*?j~`wSSePC)$BvD1~TT4+2>-N zxJBFwIqhxYc1YUpfV}oD$lLA~_lSGNed2ydZyyv7iHF4_kik6$Dclp{N%0iqxzC7a z#dDC!y&zr`FNv4ME8 X)87As^WB-BYc zT8@!p oSCLc>n!~_N6rPU+Gyzt+JigO7PK!f zl84$Ic!@k*9wCpkv<2 &sl~>pu`6|fJ zm)rfBs0`YPEv3P(^t8qr$k*4&TjZ^By}V7{F8?O)kax L92bla zsv%vR09tBNun(x7eL*)(1?99~Fda0~3`+|g1c}qEV0KUgNpoFLA2bAWg1L}EH9`t? zaL^PifGny7(x^iqhi(hnah|a#I5b!s92P7I4iAn9jtq_pjt-6qjt!0rj)% m8a4oCBv8)BRatlsS)(5vi2L89;j^Iv6!v7xJ9o!S#8{7w(_yfU% z!9zG*c_erg^6|%mCxRz~r-G-0XM$%TEq@+oE-wZzL2CX=@M^Fjcnv2ouLo}gZw7A# zZwK!L8-sU)_i!e&34GTF!H3|uJ_ CbqRdrL_sP3wV+E(>c+d+D_J>+*g zs6J{()mQaX`KrGfpa!ZzY9}>V?W~5Vp=y}gMeV9~Qw3@`bpysH#YMyFT^C4MkBFU0!f%NGRNS4|ldFrq< z@nX=!OF$7Hp^k)f@Mv|6I#wO0j)$D^M0FBq=u<#JpQcU+Eqx{=hi9vE)VY? I$_CboN!Cp_fCZb*;J%5~~{^(Yg^bteaVP)`M-!da~_UFSb4F&30gY zAbnf~I(!YJRO>*0->TMw_P$;HP2HjHRClSrLoRs_q>%Ti`_%)GG(H4b<0Ft#KBgX5 zPpBu=Q|f8;4CIr~spr)T>P1M)URJL_61jnOV_n#etS{sk0lS6`V9QyUDM+>c#@4gj z*u(4*^_u#JdR@Iiax(R{m37_7Zem^8E$mkHj@qc+RqwHf*vaaBwMlJOAE*!27WI+( zSbd^CRiCNP)fehZR<6EMU#o9eHp^jqvQca%PBph-v)Ep23(IB4u?N{n>=gB_`c8eX zeo#NEpVZIl7xk<9P5rL^AoF98m`WXJr8PTU8+>zeh7Rd09oE@8N9XE1-9>lR-SjqW zpzf}F=xudRy&cn#vThGK>khgPX#T#sAL#!6dVn6N2kD*kV7;>*qKAU}-v#{tZdL*i zfeav~ DjtQ*XlZ5uN(9nJy*}ujo_OO)=hc= zc&HY=P#*$Ls!g}+4!wxDDSa5Ys>8uy9jTAfN9$uOA9g%RDD_GDWPOT0RiCC$*JtQ6 z!E>Fh&(Y`V^DOUmp}q*5*CqN=a9@{$@47-S(^u-NAh9$!Be_Ult(UVCz>!_6uhZA- z8}thBXE#A6x>B#wtHHUg)$8;vkZ9fw-fcb3q#wn-q3_tY?0bE?{u{WuJM~@q@A__i zkG@ymr|;Jf=m+&f`eFSD%fnY4U$Q&&qby%PhAYPX*#+!Ec0SG`&&F9K>`v;(^%MF@ z=s!AMKc%0>9hFPiQvIxcj$Nmp*DnxX$S!4<5no6gA#sD?4c`C<_?CWKzoR$mclCSv zeZ5I<1~>Sj-l9LUyy2(%GyS>#LVu~h(qHRu^tbvu{XICwAN5cAXZ?%*RsW`c*MArW z8JK|dD=^AvNW?-W%Y;p~$uYSm&vY?eO*eL@*#_TIoXK8e@8S;nS?qP(EPso=gL~v} zvyG;^>0!1tJ 7&)OLYPZ8u2O zhMS0qLbeu%bgdBbwPHxvN+Dz09a6SE%$|_6je@ML9MZN*$lH>TxQ#JmA$1#Xs?FYJ zf|+P0nSIP;v#*(ArkZJHKQrCzZ)TVS%z=>1&4g@jww2D+nR?TJvxB*2o@q4m&B3P0 zEHKTG+AU1W?K;dNbEsKt4l_&4;pPZ)q&dnQZH_U=n&Zsz<^*%1Imw)CPBEvN)6D7S z40EPA%bab_G3T1|%=zX5bD_D&Tx>2emzvAW Tx+f~*P9#6 z3Ui~m$=qyKnpI}CS!33kb> 4F_j=x1gRvqE%%P@5a2F@UG1P;U)gP%)1rdt#WR; zPhalSm;3bPMd7m6#^$*-bsg;urmV`jRJmxCjT(u?ZI-Ye8K %-_l-FSJ%+oZllNI i^d!_qg9D)!eS&*9EnFfMoZ(_WBw^8Ukjfu z=1N7U_*%w%t72tYc7T)?71RY|YHM2c*!ISz`UW%Bqit+vyhSULu1_K*W~@V&t9FIY ztipA5w6s`^9hW^WQzu{NGSu1j8%Bdo5{brrJ>wpW@r16ngGg6*YJF-Dq+|O6Q)4S` zCqS&C$l@5T&8@7stTLzuK3y&2zT* 9EB{qLp^MV}!YuW3G9m`4L> 3gcu7hLJvTo}uq*w$3jHZL>RVy=>yTQ+W4al(zUSS+R{&TDD)bEeXlT 8WlEPxYNM)pm}WN-I_F z)W7JWxS5(6&*(DS=WvT{j?v0e@A|c<*mqHt8zV6{R-#o^MQUmW-BrGosSdC5)voer zPkOW$SLyxcw$?0a(EB<3?U%t{)_(Pk4Xq7rjcs~=8z+1JOrS$<(ih{_nP^qgkDFwX zo{=6R(W=r&ct(0@aVblEGfG`EqDj}>SkzWD5-s=5cNNCyveUn;xY(itu0;o2JNw|; zhLshU*oMKi`Ii;Dk%D(y4qV&aSP^}>rA5?_k$7o&L6bvtxt%j*#pP~=izWQKTg}Rf zV~H+q6|9Iv%8RiYR@fCL8joRxiMr=VBJ&(A$vnrZGSAo-)A5Ttr7ev_;;|B2t0-z! zXKMUNs>!T|v6x4Xo4}ahQB&i$5bvh8kTSpJmD%QC1@LQ1nau(37NKzc_$spq#k)m# zw926au1{a?)0Y>AYcjiUO+&i7vHRMnSPA`5c6}0w75XgP-Vv>e6ld3EMpU?Nt098T z+mG2uxvuXtGb6r&5nsWmZ(w<)Y4Dh8u$T%rq%+hF=?s9YLet=J<=qsn$~`X1Jub?9 z5f#3O3g3VVkAn)2!>I3#N?*08O&5tK3$y2D8t4XoEE=Ahsn^_0y`nLjJJ46?wydJe zHXAF7WY7DjoP6m%UCfn=ZPwQ==35i ey*r-^1>?{JR zN=;*CaYDGwG7>8)5smY+=WksjwAUv~_-JvD7w2MJc>Ki+a}J){+R)J4RMTAFSf`up z;L%N;kdf;AbW-0Kw;N;r+VvP?%ytcG {$%v9EdzCrfp+E3!FV zBtrdgP4BiIzlqZ9=9+~qZSAcs3+FY+2EPMGORG$a$6<@bVQ$M`Ebn$50w(RyK Z|B>>S$G^N0HkG@a`+&wgHTdcy`O5ci aEAr(P`P!Ej2kn0M#b7AX9d2-U_>SqY9iuwz z?%VMf-2;^QwZOY>Ex;7;8-*i%@a_qM6aiE0YhUGOTUD{@$RNAQw=vb-RleF)zS>ET z^x~vG)a}2AI_w>q!Cuy(>HYUGxBniN33LNI>5Fl@BlcfknPjnEV)Jv+N~7T=={3iD z`RbSYLGPA2;MtASnA@K*UVW#z{>MIR(E!&i&Xwu?*v7;DY8wXE=8yf?_8Z=9IdI*Q z5OV}Dc2gfOR_J!sBEPE^rFK z-N1|$`Z-!^v5B4E;Ure*>Rj&jEu?cpBIf2mB<8kMxQ>>HxvjOVJWWzM+(k<~PCXSH zb2JI^v$%nqn!l-do>WaunDiRw>zSGpr9QpiXJf8htc4!Or9NLr%Yvdz#kcK@#7a|r z?aOm>3+erPY0}X~^}*lQG(};!(HDt1>JP3hAFeMiHTp_?{$;*gM+~7Stv`CO z*tfjIQ-!e-k2BBQR~CB=lvtd`DjWt-lE r5;mmlZL;qnV*L-N3NkJ zuCJqx(~m?Q2?96e?^{-y!c?k07NZa;xc#xpjqS2xhjF-ta?Y$d3cp#67B=C%-9EL` z$^gE#Dm2zEHw87Jv33zDsL36hS$W9YF0utR*<({HR6$LaXWA*)F1iIZIb+j{4#J6O z1{d$2Vv!O` |$VRq!{qWQ<+Z%?!KT#fd@{%7ZudV8kAX+s&Y-L$~9Y6 zxh7TRnoO0AC18=2r?4p-Uv*#GDqjxhYl@btZThLf#sf9(;(= 4+vbkp5aw4$oO`vF-<;E|Pin&S~ep(zxlo(j``#p$Qg^iz5I zsWSbPOg#ZbJ{O=U^_0#JD5~v@A{)V?sMd`+k0R?&TSGyuOpmT4A+i$%pX!SkdL=YB zHOe#OJo#E0#zl;Pr1w1$al|}&q6v{4y-N>U#g12`3W%o%N<2MK;ut8QCQJLJvM=@X z0_}--KM=wNHJV7^f|_nLsUn#jwV)=LgW^5A8l?>}^Bga99a>shuvnEfEu2>qlsB~3 zsL?eG7Sx!kg>8)>(t;WAl2!1YG7nF|SjbD&_?m?aYalsWP+MOk_U;f9I>huw2&WoJ zW-KN(%E|Lu)V_^#7u3ipH63QE%Suj~*C;FSo7C1w3r{4TEDqap+gqAj+H!n}_9cW8 z?E@AJ|CB>dsi~af3v(%b0rsVfe@Vp*Ph8M2*X5;ZY$I#Y4mFn=sp=b=+G|XMZ|V{R zND6GXO>Ly69&DT1 mFy=_!SV z9A9e};wx)ky7-q=%&@Js4eHi82kX=0Pm!&sr7x2Z)6yJIf`hcKmtZG7Yn_bP{R!cA z|Ag!4$)xA*lU}x-^jv<@OTv?$MNfJ$UeYrYNiPOYIu13O^zyo-=Npnvt^|L(KSz^Z z2A%Xwa?**9qe;gBBiz@|GtbGGuU{;c-clZjXZPJ`GVa?O_wDua&ZOtMl1^HTc)q=! zzfC&nG5mdgo@GsXiEGmHeMu*?jwT&z9Zh=4Them?Nw?o4+~=S0^-cKtdI4b4(ecrw z7YrsngOc?8T+;J%Nk@Ako^O|DXp%+#y~wvS>G72G<$78(>G-#3(#uPeo^MM!+7kXA zZ#X2e ShCFL U`a0?PI}5a8MX8x#=S2m>dT4xa&U}b z>lsVc(}z3C9OK)kcYGS&eYh7gCEYO~{Cz$B2~;xf^NpwS_4RcWKE}Jx*NcRbai4G8 z*UO)_B)$A6=}#z h24(u;nQj-vqn{kV1fC+3UCix;CO z{gF%3iPtgyeSI9y2#H>*J$^hmjs*U`JzmC{bg~%ur_%fOd-+MS%D?;bkEEBvB>g!^ z(o18KRUWVI7z6VrRlXm8juV2vFW(DQl8)Yozc1hOq)EpcV*T*td$DfPaZs3NK7W7M zn)HXQNykwk+~dn}RCxFKJGnaEQ{y!?9(;U%0-5yuPtu=UCjH4}(w_$;OH=XvcyN3X z=B=-9X)0guCVhN=$ei@z?qt&A!=Feb9X}OKdNFv?@$7i_^>>^g-c$Kn7dx(Z{qbYG zxGJlrxuw0KsiCnZJN*PHJ!VlPUTkX(w@|sg(87Yc+|+iO-XRgkkDzkDazK7 CtcY4FJXu~@Q0JbK zRjH?{Wa_CR9a@=w0;TU$RHmQ6*rojNWU-NOYf~iQ)+V^NPvF` &y27^MqT=;BUtOTwlIF zTuFF&QNqy(2>0bXngH* gdd#=FN;Wc8DGM!1(AfCV{m=B zZtsLB!MDR5f8gD>!ySL%-Q&gWfsusUtKj;0Zm+_-kLP6?2`|$~c&awxPMsqOFM3UQ z(QCrr=190TGm>yL30#kFH`gNxx97n1_;z~?-u-xUdko%vf4e;f?|!^F8V>Is-~NO@ z;m;frj%Gu+A8(Fk!@I|~+jAlbx97n1?f1tH34g4g@COYEchG=%zI=Z#A>oft5{{-r zxbJUA)8XBh?@!tjUf!SZa?OO7YbLy0GvVcz3AZOj5^hg|>&KgyXC}OSGT~+Y2`{Hi zcsXUl%PA9%Mnrm#e=ny@c)4W4(H^)a;_>X(e2gpK5B{t-;ns5adwhH8V#3S75^it6 z`10u-jgNPa4@YZZT>1X?C$ CmT-G7#+UCG zNBiR4r%%Q$tBm!_Gu>FZ(oZQ-6;`Q~Uo0Ij;`w@-)2Yyi=lW^>rTkKiJ=&UL>=PAU z0EG5 =^Dh-WyI4pCCP$oQ6e3$FkREabWIC0HBE=&gxaS~ ziM~+3bS@RKRA@X?zl>kHMW~
3-z3qj#hFS7g1PS<6?xh;oe*`+=j-v^V$*E+(-$1ZVN*$*M&aYcAIUx&9>cV z+wQV$H#Xb$1vcMypKrU*x83F2?rPU!vuUx}wD@dVTsCm1b|kS_T+rfkY4N$VxLjIX zE_F7SI-5(K&!x`g0*7*`v$@pyT +(SA*F44Wg*0zRv+VEojPzbKwK;ha2 z4X#~K;M$26EB05as@y^xtBRM0=QPgkXl Xw@2WJ#qKq5?OK7O z7Q5HNb@2 )Vbl+ zVTV_T9bO%Ncy+kp1&4-LhaFxWet32G;nm@WSBGBM)X`SZVHPwtTesnmj+&-|j_ids zt+-y$FsHqsBga0s+L_l8TG-Iq*iw%abuEzj6?C|2)Y@v)+G^DLYSg-Fz@ci?+G^DL zYSj8_)VgZax@y$=Y9Q2Bqqb8uYCBh>HdT#UUyWK Qm*_`||2tdH4(i>rk^Tui2N^?8<{fK0lh>EUyUp)=#b_3Rp3{NUlo2y{6^z92EVcRjl*v| ze%1Kxjo$?PCgL{ }@LN*Q5o&P9 zPk3-=D;-&>t3@5O7(^?*e6G^V=PJD%q0-BdD!u%u(#v@&Q|IxXwu!m*D}oa;$`5V= zZCiwPEJD2(rAu1`d_zu;8qGTlmsRMYp_x`odRX8d^kML?m=IKTw6@sHqNTB1n`{9_ zLwil@VL?-4YmHmP%8K;DhBo;6*V3RKcQxFLt6MDM=zO?tjg9y !2NTM-Jt!8FUL}q$j9vjQ74&1ZA-H;yBinPG&MBW zHRNJvYigO>SXa{ou|Q5^GxoYRY!F!b!Y!@s^XL?;CbdDhoFa}N!LnZ%ruY~-P3;TQ zkG1W#{Fvh&V~FP79k+r@J-)q;YXof)&!VMvK~1~gUg@@XO>1k*p&bidOG;x|_MO&Z z@8fajC~!2% rFzPb_l6h**&mM#PGp5CX0nw8ef;ERL3BFX(9V{n?P$=^5L&n%7X% z+8)$3b<~>r#v05Qtj7y$>Kn4!7BphFsi|wg5LlFcvB>ae? 2-d`pft+ zf1fbsr1NFPj WRR7u|8o$A?AJVbOG0%!kEN61a%t&2aN4 z?UV3vz++IUxF6(>I^m{${4L-}iuRA=>0qC(s9?NL=Wm68i%aF??&-#HnIYv<>QjNj z@u|wZkLM;(e!2Id+r6$v72YSsVc}babXcVigZ$0M_V;okDM?#A>hTu^{#=}>$66Fv z^FAI|QQ*quh$oL@tRc1@(G<57$5SfIV=J1*mY2)Ly<9Ht<#KT^m-FOn#FMXZ-6-_r zD~_Gr9v1g -NAkw_f9dB z>_rFvTu^6^{M}o$QwYXMr;vE35R8dVA&E{Qm{FZViaLd09(4*S?G%D}(J7>&QwT=9 z524%hsao6TtwK_@ws-8)Aw`|i*ypW6QfVk8(^7g%wbVXul_phd3dz)(Zu6(=W}hM5 zcXQai&Gl`txBfeYWJ;xwc&At?jFNu_qx6=-j(two&3-rFbGFavkP4(J_96DUb4WDR zQiRYvcQpVHi1u`Pc3&{Wt-r5jl K0?w!w)`;On2V09UMrc54>IMAi^2lOH_#-UqD;_Gt7G`>3y zu`GOHPTzs&;w#}U_>R0Az6AgC7w`T4V@*r{O(}i;S4!F8f2EXx|8Xe`8J{$Iaz1+D zzrkJpe_Y;wQ_6t i-vG@4OeAaW{$>o6mRSWz6$7TOFE!^>crIh~vaVa!$ zsXfF0f6m-N|EY$w8t|0C^tzh1hM>BxZo$GJQMV`(4SE5_f&efszXVLkHvtRf !1Nw#7yB$mbk@8gW`vOI?#V&cY=YHd|P4;ei%Tv2cQgV=OFh?pV+& zMz+8aMGz@9i^xKH9@d8T@*mq8o9FPa+u9;gz7a6S9|w%{y8#n?HDDpX3b2S@1X#>Z z11#Z30haRiwzg=5&u{CfZ9@*Y*v4nJH?}wN=_H$nR!3TCt1PSl4D6~4MVDB0Idsr5 zXo90Bgz+7*3JYkp-3!ls>~jfpaxhquqZqKSz 0=33;t|yCZxL#Gn*Cv9>GdwVUEK+cD^;gE#VL&}uT(`zBCUAxbIn8g?oD zo~YF*n@fe&oVUMC7qU=TXe=CW;Rp+p7D8JwT9qXGlyFBNPtw>o2KkXT;{Z=($Q`<> zZ76Mq6bq{$>P1?RIkcZpit$!IAH72>G2RC-T3ZP-z%K6&ztmp}v)iOR;HGfg?N5G$ zm9BsCBW!m0liw)#<^9Qz`YHEMe$b#z76;RRRPG+|>!f4d)@3C8sEw&Vibp+{mGXc~ ze!wI&*k=C74;bWx?bILn0dJgoG4)4&G-6cB11|YNH#N6wiT5WzXm{uGPw}Adnp3}~ z{@l2kX7wRXL0FGefOW%`Zs>+lm(q;W*BUSktS-e0Xj7zKMKX549_=GWmcCkgZ|Ty~ zaizUWUM@MS_~GK4h7Q{4mO;-Cx_!{HLCXf7GO%^v^Z`o-g!*6K|AhSBeR_AB(REAL zSG&I2r8TcIFOnC@y(4#exM$Y4SubYYo^@VUbJnD+L{_iRuc3{hheInuXNB5BGoXKB zshI%HEhF_1=*f8$+If~iGf =G*j*cS~67{9|(Qv={JE86^wQokD#NS z<1Go@PHoVi^iro-J%RT#*_G^DXuqtG2k;X08bU+R5qUGTCALFL;Q8W8*r-XD!cO?( z>-3vIk99Hk{k7I2ZAf1cVHWX`9-51`gG)0>q7Nb%*AiiU(c5 DFRl(s_mUX40c~tQIiR|Fs+Z zmDP0iFf^JG{;8g{UjakV7B)!jgm(#TXm (m$P!oytQ&gU>*#=^CReT{=cD^o@;zZn0|k258S-&^|Uk9fMMb@g@*b zwv{i aC?(T=KxVJl{$Y;60?!VB* zhIqMN|J>bH_Z;=jQ&!8|Yr%WzTnGmT NSzT`MleXrWIY%jSDTUl8or3(f zw| duT5!v@@m;RtpAQ zy$4~Ptl>3m2k2BC!}>s*>IAkUw1>XO`a-whZESbw_4}EPB#nJ+57L^(_Of}DL1)=P zz(8gmV2%6N+CKFxNi(bq+xaiG G;cMy`amuC$wubXt8@66xtS8Ex#Wc50^uC^WD%|cLMAl&EZ!; z*Z*|vlcTK8aH6#+cLqJ+v>VfIKyL(H7+&z?c5`OaNYusEiCI~hd(Wgxg;Po>-u3x0 z%bn90al8-%mMNUxJEwKwF0Dezu6Db^B?=1WPrT2tPCl9RnK%eW3d+H?he7+fhF Z4TqcTT@&a!Z9%UQQb5YBL!7`d!c`c?onn!j=;>Lrwxd6VR~U8! 2cLp!iuEC(V zh>Pmn!kyCZnN+E8H%_4761dB<|3uk_FsHhse|q3wvwZw3jB=VCgYYlW+q(f51$Jf; zZ7bNPXzl0x2CVWo@|A$AVQqqA4aVAl5&H|^@1h$Rt?puPz$s!1;53YT4!b0?0OyD~ zfX$*A5Ogl!1>!=$o1vGQY8{|%Jy3(r>&^t!qy)5I4$9AC+B^;V>|}L~dB(cSz3-FW z_o=OXANRgbcwbNkpbZzQR+L2Jf@c0a K7canDnw5(!o@ i`ddl^+g0^_KzO0ed{0G|dD4#(zT}K?N^hoZ29!!m1@FE$4uTh*rSk z#BqQph!X%$hrV(S3o_>cUM7$m^pY #S7C{D3mUvJTA;IgBw(ck9R~f_ zuyYAb%Xo&S 2O$IDOE~Xqah{J6 z^eMtV=M}J50-VDZ0&os%2*5ckA^_*GiU6F$G6HbU3km1Eh;R b4eF*1#3gMhjBb@X72 6a zFX}Tq_W|U=S^vWS&CCo9pTc@(Ey_xSV$jif67+}0bObt=^MXC0wY*i%hW2?4>j%g2 zQS1ZI#WBbmroi&W7}RwnFdo6|9)up~6_kT-YY8yB%(`GC;F_QWuo_n4gjpMm0L%}{ z09OZl0Im#50ms62pfIa~-2n&w%bbf4+7cuH*98&4H37IW r>;$+n=nptH*cotD zfRTxuLtA5kZ6hCt|2heZ(X5f64o$TLU1`>0<{=;X2;fTSdq+O hT{A4e?uXJbBT;q$ zSRFv(hH@c~K&jmUuMWBaE|qft6TvosR|Z`G3xZt0)d8eJs1K+R)FvBnRbT*V^~zy7 z5O}T*B!&J(fBz2uHS%X0hXJmYzXImVKLA(CUjWAjSOLr``5WMW)H;ck#k9!p0Efx1 z0oTdT0oTZn0juSgfNSNafcf$#z^mmCfJ xwJ}<`&YC14V1S= zZUC&7Zvn2A{{YOFZvw8AuK|vgZv(E9uLBN*%;PoKx%ubWbR727MX<{<9~OOPg5Q`7 zjw1 R z_LZO6*N}0)2Tj^9GT0DgcY&k2i7jWaO9<-!U$#?ThdpePT!q@LlQ#mckvGF EYV+a94p2%E;IUvwUzkJ><2h*)X{bFkkKt zn2^^17Rcp*tL0UIE9Dh{W98L=tK^k{L@@?(Df#}zns5pH*T@S1tL0^YYvo0N`SMc0 zmGVNsvGQ`jRq|rMfsnub)3^dXJp`0}A4un^cIN=DlV<>~k*5Gw%d-I2%F_VzWeH$H zo(EWf(*hCfFVDpDN_i^aSa~+!DtS8Ke=`D3Li%;`IKVaXD8OoY0^nMC2VfgPjDTbC zoG(uXTrH0WTq%zR94k)*TqTbM94H|{M^DlYNiOY? EYV+aBX_HHa%RM9 U3g?MylYwiJ$mRit*-3?3?V!eh^OWC!vXCR+j5$!5Scaz0?STnM;U zt^sT#2y8atIbXH|7RWZh)v^U}r92pLtULs8m0SQgP~L8FLo@^7h^Pi~iEbd5C EVKBVLd@L_mll0 $9-3vuVvL+ )IW#+;%NiwR6xDM_}EyJGq_+Y~|}ogfp7Iq6SYSEe*hv3j;13Pczeg)#-Tj@Mj!pZ~lk*#s_M<23$IDWF_R0B;O8e21^BbA=+iR;Q7h0Z 7wOy>Js3rvlB*Paf8wl zMNDOpOKB+{t+qqbWzb46ixY)S@yN}TaS+0efdxaftaFQTGEe>lk7YF4W^tm#DLuKa zoEWf166FwN2-&D%S8D~Q53tq`yX63Ii#uaq8VVYGIJn1R ;rgAq}o0}zO>(b2p=i^wIcg5^|)6UhSKvz{`PwtHx z?25j!`!mZkYf#$(W-Z`OW*y)V3tOyzzV#pYrxYt~3c~hIhA5ID7Pc7j&&P^ID}Wsz zhUk)*xe0I_;n@()@)xwESqA?BhSu$!%+-KHENn4EB@8o50rL$}5+e=uC`k(YV3u@c zVRH%IhZv#*iVV>N`G%;0RQWWr^UZnI$3W`p_kBuhXwMyDXult3&HyYjwEyNCng=7z zX@CWW#s#frVKW%93SiTu1Yx7C#gc0HlVl+T`Pq8(D4mdmQKz1$TR!Yg4?`cOW1!?7 zh(U2E7R95O6c@26zD+@CC{+(ozawD>aXvdAmSrBmn)?g;6;`S=*3T@~ims`~_Ii z&goP_5#}D1KqD+uMvrtUeYYy7z?am^mUQ4&Wo=29HotRu{0Cd2MyoY;fQ!IKPJo9S9rQ^Z5@x4z n}~`Cw*?DZm~1k!*G^ls5n+k{zOyRqx0@+4Ux?-eh5j z> b{BfKGxPpwnOj=q&1Ua{(;>Tmq{ Z2hc& zou5uteozC2HG3zl!#9W)TSq}W5B#sSb<6|gc88(cPSirhVR0H`WLUaQG#hA~Fzg5z z1F)<2rf+R#K2Zop0bqc>eGonK!oP@9VB^eX_wjcAtdDab{M?+Qd VLk@Z-yPRDOuJ;;tJ-dP32p;$jb|-k@$FUE+3+{LmY{Y)dKEcW3 zSKybw!EGcB%fDT48o2}S&j-M&ZUe04He2hsN5QV`Mc$6>a&MV-J#5ncjo(i;XJK)6 z1MI_o3A?c0IBT$&8k{V^;y%-Mu;$uN