commit 607ce08c185af609c00336d6bbad9187142d478c Author: Willem Haffmans Date: Tue Sep 10 00:18:01 2024 +0200 all diff --git a/README.md b/README.md new file mode 100644 index 0000000..39f547f --- /dev/null +++ b/README.md @@ -0,0 +1,118 @@ +# piscine-codam + + +## c00 +ex00: ft_putchar.c +ex01: ft_print_alphabet.c +ex02: ft_print_reverse_alphabet.c +ex03: ft_print_numbers.c +ex04: ft_is_negative.c +ex05: ft_print_comb.c +ex06: ft_print_comb2.c +ex07: ft_putnbr.c + +## c01 +ex00: ft_ft.c +ex01: ft_ultimate_ft.c +ex02: ft_swap.c +ex03: ft_div_mod.c +ex04: ft_ultimate_div_mod.c +ex05: ft_putstr.c +ex06: ft_strlen.c +ex07: ft_rev_int_tab.c +ex08: ft_sort_int_tab.c + +## c02 +ex00: ft_strcpy.c +ex01: ft_strncpy.c +ex02: ft_str_is_alpha.c +ex03: ft_str_is_numeric.c +ex04: ft_str_is_lowercase.c +ex05: ft_str_is_uppercase.c +ex06: ft_str_is_printable.c +ex07: ft_strupcase.c +ex08: ft_strlowcase.c +ex09: ft_strcapitalize.c +ex10: ft_strlcpy.c +ex11: ft_putstr_non_printable.c + +## c03 +ex00: ft_strcmp.c +ex01: ft_strncmp.c +ex02: ft_strcat.c +ex03: ft_strncat.c +ex04: ft_strstr.c +ex05: ft_strlcat.c + +## c04 +ex00: ft_strlen.c +ex01: ft_putstr.c +ex02: ft_putnbr.c +ex03: ft_atoi.c +ex04: ft_putnbr_base.c +ex05: ft_atoi_base.c + +## c05 +ex00: ft_iterative_factorial.c +ex01: ft_recursive_factorial.c +ex02: ft_iterative_power.c +ex03: ft_recursive_power.c +ex04: ft_fibonacci.c +ex05: ft_sqrt.c +ex06: ft_is_prime.c +ex07: ft_find_next_prime.c +ex08: ft_ten_queens_puzzle.c + +## c06 +ex00: ft_print_program_name.c +ex01: ft_print_params.c +ex02: ft_rev_params.c +ex03: ft_sort_params.c + +## c07 +ex00: ft_strdup.c +ex01: ft_range.c +ex02: ft_ultimate_range.c +ex03: ft_strjoin.c +ex04: ft_convert_base.c + ft_convert_base2.c +ex05: ft_split.c + +## c08 +ex00: ft.h +ex01: ft_boolean.h +ex02: ft_abs.h +ex03: ft_point.h +ex04: ft_strs_to_tab.c +ex05: ft_show_tab.c + +## c11 +ex00: ft_foreach.c +ex01: ft_map.c +ex02: ft_any.c +ex03: ft_count_if.c +ex04: ft_is_sort.c +ex05: do-op.c + ops.c + ops.h + +## c12 +ft_list.h +ex00: ft_create_elem.c +ex01: ft_list_push_front.c +ex02: ft_list_size.c +ex03: ft_list_last.c +ex04: ft_list_push_back.c +ex05: ft_list_push_strs.c +ex06: ft_list_clear.c +ex07: ft_list_at.c +ex08: ft_list_reverse.c +ex09: ft_list_foreach.c +ex10: ft_list_foreach_if.c +ex11: ft_list_find.c +ex12: ft_list_remove_if.c +ex13: ft_list_merge.c +ex14: ft_list_sort.c +ex15: ft_reverse_fun.c +ex16: ft_sorted_list_insert.c +ex17: ft_sorted_list_merge.c diff --git a/bsq/BSQ-tester/.gitignore b/bsq/BSQ-tester/.gitignore new file mode 100644 index 0000000..fd5c715 --- /dev/null +++ b/bsq/BSQ-tester/.gitignore @@ -0,0 +1,2 @@ +__pycache__ +*.agree diff --git a/bsq/BSQ-tester/LICENSE b/bsq/BSQ-tester/LICENSE new file mode 100644 index 0000000..1463e44 --- /dev/null +++ b/bsq/BSQ-tester/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 E-Berry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/bsq/BSQ-tester/README.md b/bsq/BSQ-tester/README.md new file mode 100644 index 0000000..efd3cd4 --- /dev/null +++ b/bsq/BSQ-tester/README.md @@ -0,0 +1,62 @@ +# BSQ Test Unit + +This is a simple automated BSQ test unit for 42 piscine. This test suite contains three main files: `map_generator.py`, `map_solver.py`, and `test_bsq.py`. You can run each of these files separately, excluding the `map_parser.py` file, which is a helper module. + +## Disclaimer + +Please note that the tests provided in this test suite may not be entirely accurate, as the author cannot guarantee that they align with the expectations of the moulinette. The tests are based on the author's understanding and are intended to help others. The author takes no responsibility for any discrepancies or issues that may arise from using these tests. + +You are encouraged to contribute and add your own tests to improve the test suite. If you have any ideas or suggestions, feel free to reach out to the author on Discord: julesreixcharat. + +## Overview and Usage + +### map\_generator.py + +`map_generator.py` is a script that generates a random map based on the given parameters. It can be used to create test cases for the BSQ solver. + +To run the `map_generator.py` file, use the following command: + +``` +python3 map_generator.py [-d ] [-s ] [-o ] +``` + +Arguments: + +- ``: Width of the map +- ``: Height of the map +- ``: Density of the map (default: 0.4) +- ``: Random seed +- ``: Output file name + +### map\_solver.py + +`map_solver.py` is a script that solves the generated map and finds the biggest square. It can be used to test the efficiency and correctness of the BSQ solver. + +To run the `map_solver.py` file, use the following command: + +``` +python3 map_solver.py [-d ] [-s ] [-p ] +``` + +Arguments: + +- ``: Width of the map +- ``: Height of the map +- ``: Density of the map (default: 0.4) +- ``: Random seed +- ``: Solved map file name + +### test\_bsq.py + +`test_bsq.py` is a test suite that runs various test cases on the BSQ solver. It uses the `map_generator.py` and `map_solver.py` scripts to create test cases and compare the results with the expected output. + +Before running `test_bsq.py`, make sure to set the relative or absolute path to the `./bsq` binary in the `BSQ_PATH` variable at the beginning of the file. + +To run the `test_bsq.py` file, use the following command: + +``` +python3 test_bsq.py +``` + +This will run the test suite and display the results. + diff --git a/bsq/BSQ-tester/map_generator.py b/bsq/BSQ-tester/map_generator.py new file mode 100644 index 0000000..6885b50 --- /dev/null +++ b/bsq/BSQ-tester/map_generator.py @@ -0,0 +1,59 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# map_generator.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: jreix-ch +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2023/09/26 21:02:44 by jreix-ch #+# #+# # +# Updated: 2023/09/27 18:02:54 by jreix-ch ### ########.fr # +# # +# **************************************************************************** # + +# Internal modules +import sys +import random +import argparse + + +def generate_map(x, y, density = 0.4, chars = ".ox", seed = random.randint(0, 2**32 - 1)): + random.seed(seed) + map_data = [f"{y}{chars[0]}{chars[1]}{chars[2]}"] + for i in range(y): + row = [] + for j in range(x): + if random.random() < density: + row.append(chars[1]) + else: + row.append(chars[0]) + map_data.append("".join(row)) + return map_data + +def main(): + parser = argparse.ArgumentParser(description="Map generator and solver") + parser.add_argument("x", type=int, help="Width of the map") + parser.add_argument("y", type=int, help="Height of the map") + parser.add_argument("-d", "--density", type=float, default=0.4, help="Density of the map (default: 0.4)") + parser.add_argument("-s", "--seed", type=int, default=None, help="Random seed") + parser.add_argument("-o", "--output", type=str, help="Output file name") + + args = parser.parse_args() + + if args.seed is None: + args.seed = random.randint(0, 2**32 - 1) + + map_data = generate_map(args.x, args.y, density=args.density, seed=args.seed) + + print(f"[Map of {args.x} * {args.y} - Density of {args.density}; Random seed is {args.seed}]") + for row in map_data: + print(row) + + if args.output: + with open(args.output, "w") as f: + for row in map_data: + f.write(row + "\n") + + +if __name__ == "__main__": + main() + diff --git a/bsq/BSQ-tester/map_parser.py b/bsq/BSQ-tester/map_parser.py new file mode 100644 index 0000000..9fde874 --- /dev/null +++ b/bsq/BSQ-tester/map_parser.py @@ -0,0 +1,26 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# map_parser.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: jreix-ch +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2023/09/27 17:16:12 by jreix-ch #+# #+# # +# Updated: 2023/09/27 17:46:20 by jreix-ch ### ########.fr # +# # +# **************************************************************************** # + +def parse_map(map_file): + with open(map_file, "r") as f: + header = f.readline().strip() + square_char = header[-1] + obstacle_char = header[-2] + empty_char = header[-3] + num_lines = int(header[:-3]) + + map_data = [] + for _ in range(num_lines): + line = f.readline().strip() + map_data.append(list(line)) + + return map_data, empty_char, obstacle_char, square_char diff --git a/bsq/BSQ-tester/map_solver.py b/bsq/BSQ-tester/map_solver.py new file mode 100644 index 0000000..22e0145 --- /dev/null +++ b/bsq/BSQ-tester/map_solver.py @@ -0,0 +1,101 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# map_solver.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: jreix-ch +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2023/09/27 17:48:24 by jreix-ch #+# #+# # +# Updated: 2023/09/27 18:02:18 by jreix-ch ### ########.fr # +# # +# **************************************************************************** # + +# Internal modules +import argparse +import random + +# Project modules +from map_generator import generate_map +from map_parser import parse_map +from pprint import pprint + +def find_biggest_square(map_data, empty_char, obstacle_char, square_char): + rows = len(map_data) + cols = len(map_data[0]) + + # 2D array of biggest square ending for each cell (allowing fast process of the biggest square) + dp = [[0] * cols for _ in range(rows)] + + # Fill it with zeros + for i in range(rows): + dp[i][0] = 1 if map_data[i][0] == empty_char else 0 + for j in range(cols): + dp[0][j] = 1 if map_data[0][j] == empty_char else 0 + + max_size = 0 + max_i = 0 + max_j = 0 + + # Basically the same algorithm but in a few lines because it's Python :) + for i in range(1, rows): + for j in range(1, cols): + if map_data[i][j] == empty_char: + dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1 + if dp[i][j] > max_size: + max_size = dp[i][j] + max_i = i + max_j = j + + # Fill square characters + for i in range(max_i, max_i - max_size, -1): + for j in range(max_j, max_j - max_size, -1): + map_data[i][j] = square_char + + # Happy blobby now + return map_data + + +def main(): + parser = argparse.ArgumentParser(description="Map generator and solver") + parser.add_argument("x", type=int, help="Width of the map") + parser.add_argument("y", type=int, help="Height of the map") + parser.add_argument("-d", "--density", type=float, default=0.4, help="Density of the map (default: 0.4)") + parser.add_argument("-s", "--seed", type=int, default=None, help="Random seed") + parser.add_argument("-p", "--process", type=str, help="Solved map file name") + + args = parser.parse_args() + + if args.seed is None: + args.seed = random.randint(0, 2**32 - 1) + + map_data = generate_map(args.x, args.y, density=args.density, seed=args.seed) + + print(f"[Map of {args.x} * {args.y} - Density of {args.density}; Random seed is {args.seed}]") + for row in map_data: + print(row) + + if args.process: + map_file = args.process + ".map" + solution_file = args.process + "_solution.map" + + with open(map_file, "w") as f: + f.write(f"{args.y}{map_data[0][-3]}{map_data[0][-2]}{map_data[0][-1]}\n") + for row in map_data[1:]: + f.write("".join(row) + "\n") + + parsed_map_data, empty_char, obstacle_char, square_char = parse_map(map_file) + result = find_biggest_square(parsed_map_data, empty_char, obstacle_char, square_char) + + with open(solution_file, "w") as f: + print(f"{args.y}{map_data[0][-3]}{map_data[0][-2]}{map_data[0][-1]}") + f.write(f"{args.y}{map_data[0][-3]}{map_data[0][-2]}{map_data[0][-1]}\n") + for row in result: + print("".join(row)) + f.write("".join(row) + "\n") + + print(f"Map saved to {map_file}") + print(f"Solution map saved to {solution_file}") + + +if __name__ == "__main__": + main() diff --git a/bsq/BSQ-tester/test_bsq.py b/bsq/BSQ-tester/test_bsq.py new file mode 100644 index 0000000..639f1d2 --- /dev/null +++ b/bsq/BSQ-tester/test_bsq.py @@ -0,0 +1,190 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# test_bsq.py :+: :+: :+: # +# +:+ +:+ +:+ # +# By: jreix-ch +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2023/09/27 16:55:07 by jreix-ch #+# #+# # +# Updated: 2024/06/26 17:12:34 by whaffman ### ########.fr # +# # +# **************************************************************************** # + +# Internal modules +import os +import sys +import subprocess +import unittest +import tempfile +import random +import string +import time + +# Project modules +from map_solver import find_biggest_square +from map_parser import parse_map +from map_generator import generate_map + + +BSQ_PATH = "../BSQ/bsq" # Relative or absolute path to binary +TIMEOUT = 100 # No more than 10 seconds per test +# This line below defines the seed used for random map generation +# The seed is randomized by default, but the used seed always shown at test start +USED_SEED = random.randint(0, 2**32 - 1) +# Uncomment the line below to use a custom seed +#USED_SEED = 123456789 + + +class TestBSQ(unittest.TestCase): + def generate_map_file(self, x, y, density=0.4, chars=".ox", seed=None): + if not seed: + seed = USED_SEED + map_data = generate_map(x, y, density=density, chars=chars, seed=seed) + file = tempfile.NamedTemporaryFile(delete=False) + for row in map_data: + file.write((row + "\n").encode()) + file.close() + return file.name + + def compare_outputs(self, args, expected_output=None, expected_error=None, input_data=None, print_time=False, debug_print=False): + bsq_cmd = [BSQ_PATH] + [arg.replace("\n", os.linesep) for arg in args] # Important to fix \r\n issue + + start_time = time.time() + bsq_output = subprocess.run(bsq_cmd, input=input_data, capture_output=True, text=True, timeout=TIMEOUT) + bsq_time = time.time() - start_time + + if print_time: + print(f"\nExecution time for {print_time}:") + print(f"- bsq: {bsq_time:.6f} seconds\n") + + if expected_output is not None: + try: + self.assertEqual(bsq_output.stdout.strip(), expected_output.strip()) + except Exception as err: + if debug_print: + print(f"\nFAILURE:\nExpected:\n{expected_output}\n\nGot:\n{bsq_output.stdout}") + raise err + + if expected_error is not None: + self.assertEqual(bsq_output.stderr, expected_error) + else: + self.assertEqual(bsq_output.stderr, "") + + return bsq_output + + def solve_map(self, map_data): + parsed_map_data, empty_char, obstacle_char, square_char = parse_map(map_data) + result = find_biggest_square(parsed_map_data, empty_char, obstacle_char, square_char) + return "\n".join("".join(row) for row in result) + + def test_normal_maps(self): + for size, name in [(10, "10x10"), (50, "50x50"), (100, "100x100"), (1000, "1000x1000"), (2000, "2000x2000"), (4000, "4000x4000"), (10000, "10000x10000")]: + map_file = self.generate_map_file(size, size) + expected_stdout = self.solve_map(map_file) + self.compare_outputs([map_file], expected_output=expected_stdout, print_time=name) + os.remove(map_file) + + def test_unsolvable_map(self): + map_file = self.generate_map_file(10, 10, density=1.0) + with open(map_file, "r") as f: + same_map = f.read() + expected_stdout = self.solve_map(map_file) + self.compare_outputs([map_file], expected_output=expected_stdout) + os.remove(map_file) + + def test_empty_obstacles_map(self): + map_file = self.generate_map_file(10, 10, density=0.0) + expected_stdout = self.solve_map(map_file) + self.compare_outputs([map_file], expected_output=expected_stdout) + os.remove(map_file) + + def test_different_chars(self): + map_file = self.generate_map_file(10, 10, chars="abc") + self.compare_outputs([map_file]) + os.remove(map_file) + + def test_stdin(self): + map_file = self.generate_map_file(10, 10) + with open(map_file, "r") as f: + input_data = f.read() + expected_solution = self.solve_map(map_file) + output = self.compare_outputs([], input_data=input_data, expected_output=expected_solution) + os.remove(map_file) + + def test_4x4_maps(self): + maps = [ + ("4.ox\n..oo\n..oo\noooo\noooo\n", "topleft", "xxoo\nxxoo\noooo\noooo\n"), + ("4.ox\noo..\noo..\noooo\noooo\n", "topright", "ooxx\nooxx\noooo\noooo\n"), + ("4.ox\noooo\noooo\n..oo\n..oo\n", "bottomleft", "oooo\noooo\nxxoo\nxxoo\n"), + ("4.ox\noooo\noooo\noo..\noo..\n", "bottomright", "oooo\noooo\nooxx\nooxx\n"), + ("4.ox\noooo\no..o\no..o\noooo\n", "center", "oooo\noxxo\noxxo\noooo\n"), + ] + for map_data, name, expected_solution in maps: + self.compare_outputs([], input_data=map_data, expected_output=expected_solution) + + def test_corrupted_maps(self): + map_file = self.generate_map_file(10, 10) + with open(map_file, "r") as f: + lines = f.readlines() + lines[0] = "9.ox\n" + lines[5] = ".....o....\n" + corrupted_map = "".join(lines) + self.compare_outputs([], input_data=corrupted_map, expected_output="", expected_error="map error\n") + + def test_wrong_char_map(self): + map_file = self.generate_map_file(10, 10) + with open(map_file, "r") as f: + lines = f.readlines() + lines[5] = ".....z....\n" + corrupted_map = "".join(lines) + output = self.compare_outputs([], input_data=corrupted_map, expected_output="", expected_error="map error\n") + + def test_nonexistent_file(self): + output = self.compare_outputs(["nofile"], expected_output="", expected_error="map error\n") + + def test_two_solvable_maps(self): + map1 = self.generate_map_file(10, 10) + map2 = self.generate_map_file(10, 10) + map1_solution = self.solve_map(map1) + map2_solution = self.solve_map(map2) + expected_solutions = f"{map1_solution}\n\n{map2_solution}" + self.compare_outputs([map1, map2], expected_output=expected_solutions) + os.remove(map1) + os.remove(map2) + + def test_two_solvable_maps_with_nonexistent_file(self): + map1 = self.generate_map_file(10, 10) + map2 = self.generate_map_file(10, 10) + map1_solution = self.solve_map(map1) + map2_solution = self.solve_map(map2) + expected_solutions = f"{map1_solution}\n\n\n{map2_solution}" + self.compare_outputs([map1, "nofile", map2], expected_output=expected_solutions, expected_error="map error\n") + os.remove(map1) + os.remove(map2) + +if __name__ == '__main__': + AGREEMENT_FILE = ".agree" + AGREEMENT_TEXT = "Blobfishes are the most amazing creatures in the world." + + if not os.path.exists(AGREEMENT_FILE): + print("Blobfishes are the most amazing creatures in the world. You are agreeing to this by using this test. If you do not, you may not use it. (y/n)") + answer = input().lower() + if answer == 'y': + with open(AGREEMENT_FILE, "w") as f: + f.write(AGREEMENT_TEXT) + else: + print("You did not agree. Exiting.") + sys.exit(1) + else: + with open(AGREEMENT_FILE, "r") as f: + content = f.read().strip() + if content != AGREEMENT_TEXT: + print("Invalid agreement file. Exiting.") + os.remove(AGREEMENT_FILE) + sys.exit(1) + else: + print("Blobfishes are the most amazing creatures in the world.\n") + print("==============================================") + print(f"> Running BSQ Test Suite with seed {USED_SEED}") + print("==============================================\n") + unittest.main(verbosity=2) diff --git a/bsq/Makefile b/bsq/Makefile new file mode 100644 index 0000000..aaafc77 --- /dev/null +++ b/bsq/Makefile @@ -0,0 +1,60 @@ +# **************************************************************************** # +# # +# ::: :::::::: # +# Makefile :+: :+: :+: # +# +:+ +:+ +:+ # +# By: whaffman +#+ +:+ +#+ # +# +#+#+#+#+#+ +#+ # +# Created: 2024/06/24 12:05:19 by whaffman #+# #+# # +# Updated: 2024/06/24 12:47:17 by whaffman ### ########.fr # +# # +# **************************************************************************** # + +NAME = bsq + +SRC = src/ft_strlen.c \ + src/check_invalid_map.c \ + src/draw_biggest_square.c \ + src/ft_findmax.c \ + src/ft_min.c \ + src/ft_puterror.c \ + src/ft_putstr.c \ + src/ft_strcat.c \ + src/free_willy.c\ + src/get_map_ptr.c \ + src/handle_filedescriptor.c \ + src/handle_first_line.c \ + src/main.c \ + src/make_charmap_and_metadata.c \ + src/make_intmap.c \ + src/read_file.c \ + src/solve.c + +OUT = $(SRC:.c=.o) + +INCLUDE = include/ + +CFLAGS = -Wall -Wextra -Werror -O3 + +CC = cc + +all: $(NAME) + +$(NAME) : $(OUT) + $(CC) $^ -o $@ + +%.o: %.c + $(CC) -c $(CFLAGS) -I $(INCLUDE) $< -o $@ + +clean: + rm -f $(OUT) + +fclean: clean + rm -f $(NAME) + +re: fclean all + + + + + diff --git a/bsq/include/bsq.h b/bsq/include/bsq.h new file mode 100644 index 0000000..d986496 --- /dev/null +++ b/bsq/include/bsq.h @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* bsq.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lyvan-de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 11:57:06 by whaffman #+# #+# */ +/* Updated: 2024/06/24 16:22:05 by lyvan-de ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef BSQ_H +# define BSQ_H +# include +# include +# include +# define BUFFERSIZE 1000000 + +typedef struct s_map +{ + char *charmap; + char *filename; + char empty; + char fill; + char obstacle; + char *filecontents; + int readlines; + int height; + int line_len; + int solution; + int *intmap; + int bsq; + size_t capacity; + ssize_t length; +} t_map; + +char *ft_strcat(char *dest, char *src); +int check_invalid_map(t_map *map, int i); +int draw_biggest_square(t_map *map); +int ft_findmax(t_map *map); +int ft_min(int a, int b); +int ft_strlen(char *str); +int handle_filedescriptor(int fd); +int handle_first_line(t_map *map, char *str); +int make_charmap_and_metadata(t_map *map); +int make_intmap(t_map *map); +int read_file(int fd, t_map *map); +int solve(t_map *map); +t_map *get_map_ptr(void); +void free_willy(t_map *map); +void ft_puterror(t_map *map); +void ft_putstr(char *str); + +#endif diff --git a/bsq/src/check_invalid_map.c b/bsq/src/check_invalid_map.c new file mode 100644 index 0000000..7dd9702 --- /dev/null +++ b/bsq/src/check_invalid_map.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* check_invalid_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/26 17:15:20 by whaffman #+# #+# */ +/* Updated: 2024/06/26 17:15:20 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int check_invalid_map(t_map *map, int i) +{ + if (((i + 1) % map->line_len != 0) \ + && !((map->charmap[i] == map->empty) \ + || (map->charmap[i] == map->obstacle))) + return (1); + if ((i + 1) % map->line_len == 0 && map->charmap[i] != '\n') + return (1); + return (0); +} diff --git a/bsq/src/draw_biggest_square.c b/bsq/src/draw_biggest_square.c new file mode 100644 index 0000000..bcd1f2d --- /dev/null +++ b/bsq/src/draw_biggest_square.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* draw_biggest_square.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 20:57:40 by whaffman #+# #+# */ +/* Updated: 2024/06/24 21:04:34 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int draw_biggest_square(t_map *map) +{ + int x; + int y; + + y = 0; + while (y < map->bsq) + { + x = 0; + while (x < map->bsq) + { + map->charmap[map->solution - x - y * map->line_len] = map->fill; + x++; + } + y++; + } + return (1); +} diff --git a/bsq/src/free_willy.c b/bsq/src/free_willy.c new file mode 100644 index 0000000..6c13a68 --- /dev/null +++ b/bsq/src/free_willy.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* free_willy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/26 17:14:24 by whaffman #+# #+# */ +/* Updated: 2024/06/26 17:14:24 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +void free_willy(t_map *map) +{ + if (map->filecontents) + free(map->filecontents); + if (map->intmap) + free(map->intmap); + if (map) + free(map); +} diff --git a/bsq/src/ft_findmax.c b/bsq/src/ft_findmax.c new file mode 100644 index 0000000..b28174b --- /dev/null +++ b/bsq/src/ft_findmax.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_findmax.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/25 20:06:46 by whaffman #+# #+# */ +/* Updated: 2024/06/25 20:06:50 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int ft_findmax(t_map *map) +{ + int i; + int max; + + i = 0; + max = 0; + while (i < map->line_len * map->height) + { + if (map->intmap[i] > max) + { + max = map->intmap[i]; + map->solution = i; + } + i++; + } + map->bsq = max; + return (1); +} diff --git a/bsq/src/ft_min.c b/bsq/src/ft_min.c new file mode 100644 index 0000000..681b8a4 --- /dev/null +++ b/bsq/src/ft_min.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_min.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/25 20:06:38 by whaffman #+# #+# */ +/* Updated: 2024/06/25 20:06:41 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int ft_min(int a, int b) +{ + if (a < b) + return (a); + else + return (b); +} diff --git a/bsq/src/ft_puterror.c b/bsq/src/ft_puterror.c new file mode 100644 index 0000000..fbc1e14 --- /dev/null +++ b/bsq/src/ft_puterror.c @@ -0,0 +1,19 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_puterror.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/25 22:07:46 by whaffman #+# #+# */ +/* Updated: 2024/06/25 22:07:46 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +void ft_puterror(t_map *map) +{ + free_willy(map); + write(2, "map error\n", 10); +} diff --git a/bsq/src/ft_putstr.c b/bsq/src/ft_putstr.c new file mode 100644 index 0000000..e3ed2b8 --- /dev/null +++ b/bsq/src/ft_putstr.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/25 20:06:28 by whaffman #+# #+# */ +/* Updated: 2024/06/25 20:06:30 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +void ft_putstr(char *str) +{ + int i; + + i = 0; + while (str[i]) + i++; + write(1, str, i); +} diff --git a/bsq/src/ft_strcat.c b/bsq/src/ft_strcat.c new file mode 100644 index 0000000..fb5f0bd --- /dev/null +++ b/bsq/src/ft_strcat.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/25 20:06:18 by whaffman #+# #+# */ +/* Updated: 2024/06/25 20:06:23 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +char *ft_strcat(char *dest, char *src) +{ + char *odest; + + odest = dest; + while (*dest) + dest++; + while (*src) + *dest++ = *src++; + *dest = '\0'; + return (odest); +} diff --git a/bsq/src/ft_strlen.c b/bsq/src/ft_strlen.c new file mode 100644 index 0000000..a082b97 --- /dev/null +++ b/bsq/src/ft_strlen.c @@ -0,0 +1,21 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lyvan-de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 15:42:15 by lyvan-de #+# #+# */ +/* Updated: 2024/06/24 16:02:24 by lyvan-de ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_strlen(char *str) +{ + int i; + + i = 0; + while (str[i]) + i++; + return (i); +} diff --git a/bsq/src/get_map_ptr.c b/bsq/src/get_map_ptr.c new file mode 100644 index 0000000..e6621fc --- /dev/null +++ b/bsq/src/get_map_ptr.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_map_ptr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/25 22:10:56 by whaffman #+# #+# */ +/* Updated: 2024/06/25 22:10:56 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +t_map *get_map_ptr(void) +{ + t_map *ptr_map; + + ptr_map = malloc(sizeof(t_map)); + if (ptr_map == NULL) + exit(1); + ptr_map->charmap = NULL; + ptr_map->filename = NULL; + ptr_map->empty = '\0'; + ptr_map->fill = '\0'; + ptr_map->obstacle = '\0'; + ptr_map->readlines = 0; + ptr_map->height = 0; + ptr_map->line_len = 0; + ptr_map->solution = 0; + ptr_map->intmap = NULL; + ptr_map->bsq = 0; + ptr_map->capacity = 0; + ptr_map->length = 0; + ptr_map->filecontents = malloc(10); + if (ptr_map->filecontents == NULL) + exit(1); + *ptr_map->filecontents = '\0'; + return (ptr_map); +} diff --git a/bsq/src/handle_filedescriptor.c b/bsq/src/handle_filedescriptor.c new file mode 100644 index 0000000..4c66c12 --- /dev/null +++ b/bsq/src/handle_filedescriptor.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* handle_filedescriptor.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 14:21:23 by whaffman #+# #+# */ +/* Updated: 2024/06/24 14:21:41 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int handle_filedescriptor(int fd) +{ + t_map *map; + + map = get_map_ptr(); + read_file(fd, map); + if (!make_charmap_and_metadata(map) + || map->readlines - 1 != map->height) + { + ft_puterror(map); + return (0); + } + if (!make_intmap(map)) + { + ft_puterror(map); + return (0); + } + solve(map); + ft_findmax(map); + draw_biggest_square(map); + ft_putstr(map->charmap); + free_willy(map); + return (1); +} diff --git a/bsq/src/handle_first_line.c b/bsq/src/handle_first_line.c new file mode 100644 index 0000000..4893fcf --- /dev/null +++ b/bsq/src/handle_first_line.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* handle_first_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lyvan-de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 12:42:50 by lyvan-de #+# #+# */ +/* Updated: 2024/06/24 17:13:33 by lyvan-de ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int handle_first_line(t_map *map, char *str) +{ + int i; + int number; + int n; + int lenght; + + lenght = ft_strlen(str)-1; + i = lenght; + number = 0; + n = 0; + if (str[i] >= 32 && str[i] <= 126) + map->fill = str[i--]; + if (str[i] >= 32 && str[i] <= 126) + map->obstacle = str[i--]; + if (str[i] >= 32 && str[i] <= 126) + map->empty = str[i--]; + if (str[i] < '0' || str[i] > '9') + return (0); + while (str[n] && str[n] >= '0' && str[n] <= '9' && n <= i) + number = number * 10 + str[n++] - '0'; + map->height = number; + if (map->empty != map->obstacle && map->empty != map->fill + && map->fill != map->obstacle && n + 2 == lenght) + return (1); + return (0); +} diff --git a/bsq/src/main.c b/bsq/src/main.c new file mode 100644 index 0000000..957d4fb --- /dev/null +++ b/bsq/src/main.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: lyvan-de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 11:57:46 by lyvan-de #+# #+# */ +/* Updated: 2024/06/24 12:36:12 by lyvan-de ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int main(int argc, char *argv[]) +{ + int i; + int fd; + + i = 1; + if (argc < 2) + { + fd = STDIN_FILENO; + handle_filedescriptor(fd); + } + while (i < argc) + { + fd = open(argv[i], O_RDONLY); + if (fd > 0) + { + handle_filedescriptor(fd); + close(fd); + } + else + write(2, "map error\n", 10); + if (argc > 2) + write(1, "\n", 1); + i++; + } + return (0); +} diff --git a/bsq/src/make_charmap_and_metadata.c b/bsq/src/make_charmap_and_metadata.c new file mode 100644 index 0000000..e93d577 --- /dev/null +++ b/bsq/src/make_charmap_and_metadata.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* read_first_line.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 14:33:51 by whaffman #+# #+# */ +/* Updated: 2024/06/24 14:33:51 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int make_charmap_and_metadata(t_map *map) +{ + int i; + + i = 0; + map->readlines = 0; + while (map->filecontents[i]) + { + if (map->filecontents[i] == '\n') + map->readlines++; + i++; + } + i = 0; + while (map->filecontents[i] != '\n') + i++; + map->filecontents[i++] = '\0'; + map->charmap = &map->filecontents[i]; + i = 0; + while (map->charmap[i] != '\n') + i++; + map->line_len = i + 1; + if (!handle_first_line(map, map->filecontents)) + { + return (0); + } + return (1); +} diff --git a/bsq/src/make_intmap.c b/bsq/src/make_intmap.c new file mode 100644 index 0000000..827f863 --- /dev/null +++ b/bsq/src/make_intmap.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* make_intmap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 18:20:04 by whaffman #+# #+# */ +/* Updated: 2024/06/24 18:20:04 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int make_intmap(t_map *map) +{ + int i; + size_t size; + + size = map->height * map->line_len; + map->intmap = malloc(size * sizeof(int)); + if (map->intmap == NULL) + exit(1); + i = 0; + while (i < map->line_len * map->height) + { + if (check_invalid_map(map, i)) + return (0); + if (map->charmap[i] == '\n') + map->intmap[i] = -1; + else if (map->charmap[i] == map->empty) + map->intmap[i] = 1; + else if (map->charmap[i] == map->obstacle) + map->intmap[i] = 0; + else + return (0); + i++; + } + if (map->charmap[i] != '\0') + return (0); + return (1); +} diff --git a/bsq/src/read_file.c b/bsq/src/read_file.c new file mode 100644 index 0000000..8998449 --- /dev/null +++ b/bsq/src/read_file.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* read_file.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 18:01:23 by whaffman #+# #+# */ +/* Updated: 2024/06/24 18:01:23 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int read_file(int fd, t_map *map) +{ + char buffer[BUFFERSIZE]; + char *new_space; + size_t content_length = 0; + + map->capacity = BUFFERSIZE; + map->filecontents = malloc(map->capacity); + if (map->filecontents == NULL) + exit(1); + map->filecontents[0] = '\0'; + + while (1) + { + map->length = read(fd, buffer, sizeof(buffer) - 1); + if (map->length <= 0) + break ; + buffer[map->length] = '\0'; + content_length += map->length; + + while (map->capacity <= content_length + 1) + { + map->capacity *= 2; + new_space = malloc(map->capacity); + if (new_space == NULL) + exit(1); + new_space[0] = '\0'; + ft_strcat(new_space, map->filecontents); + free(map->filecontents); + map->filecontents = new_space; + } + + ft_strcat(map->filecontents, buffer); + } + return (1); +} \ No newline at end of file diff --git a/bsq/src/solve.c b/bsq/src/solve.c new file mode 100644 index 0000000..0fcf861 --- /dev/null +++ b/bsq/src/solve.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* solve.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/24 19:58:13 by whaffman #+# #+# */ +/* Updated: 2024/06/24 19:58:13 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "bsq.h" + +int solve(t_map *map) +{ + int i; + + i = 0; + while (i < map->line_len * map->height) + { + if ((i < map->line_len) \ + || (i % map->line_len == 0) \ + || (i % map->line_len == map->line_len - 1)) + { + i++; + continue ; + } + if (map->intmap[i] != 0) + map->intmap[i] = ft_min(map->intmap[i - 1], + ft_min(map->intmap[i - map->line_len], + map->intmap[i - map->line_len - 1])) + 1; + i++; + } + return (1); +} diff --git a/bsq/test_grids/grid_0 b/bsq/test_grids/grid_0 new file mode 100644 index 0000000..78a3ff3 --- /dev/null +++ b/bsq/test_grids/grid_0 @@ -0,0 +1,11 @@ +10.0x +000000000000 +000000000000 +00.000000000 +000000000000 +000000000000 +000000000000 +000000000000 +000000000000 +000000000000 +000000000000 diff --git a/bsq/test_grids/grid_1 b/bsq/test_grids/grid_1 new file mode 100644 index 0000000..bff9b92 --- /dev/null +++ b/bsq/test_grids/grid_1 @@ -0,0 +1,26 @@ +25.ox +.o...............o....... +......................... +............o............ +........o.......o........ +............o.....o...... +o...................oo... +......................... +.........o..............o +..oo..oooo...o.....o..... +......................... +..............o.o........ +...............o......... +......................... +..........o.............. +...o..................... +....o.......o...o.....o.. +......................... +....o.................... +..o......o..........oo... +............o..o......... +................o......o. +.............oo..o....... +.............o........... +.......o.......o......... +...o........o............ diff --git a/bsq/test_grids/grid_2 b/bsq/test_grids/grid_2 new file mode 100644 index 0000000..db6f94e --- /dev/null +++ b/bsq/test_grids/grid_2 @@ -0,0 +1,251 @@ +250.ox +...................o.................................................................o.............. +...............................................................................o.................... +...........o................................................o................................o...... +................................o....................................o.............................. +....................o....................o...................o...................................... +................................................o....................o.............................. +............................................o....................................................... +................................................................o................................... +..................................o................................................................. +...........o.....................................................o.................................. +.................................................................................................... +................................................o.................................................o. +.................................................................................................... +.............................................................................o...................... +.................o.................................................................................o +...........o.........................................................o.............................. +..................o.....................................o........................................... +.........o.............o............o.................................o............................. +.......o..............................................o....................o........................ +.................................................................................................... +..................................................................o................................. +.................................................................................................... +o..................o................................................................................ +.......................................................................................o............ +...............................................................o.................................... +.....................o.............................................o................................ +.................o....o............................................................................. +.......................................o............................................................ +...........................o.....o...........................................o...................... +.................................................................................................... +.............................o...........................o.........................o.............o.. +...........................................o.....................................o.................. +......................................................o........................o.................... +.o.o..........................................................................o..................... +...o.....................o...............................................................o........o. +..............o...........................o.....................o........o.......................... +.....................o.........o....................................................o............... +.................................................o.................................................. +...............................o..............................o......................o.............. +............................................................o....................................... +..........................................................................o......................... +.o..........o...o..................................................................................o +.................................................................................................... +..............o...................................................................o.......o......... +.......................................o.......................................................o.... +........................................o........................................................... +........................................................................................o........... +.................................................................................................... +............o....................................................................................... +........o...............................................................o........................... +..................................................................................o...o............. +......................o..............................................................o.............. +.................................................................................................... +.................................................................................................... +.......................o............................................................................ +....................................o........o.................................o.................... +.....................o.............................................................................. +.............................................................................o...................... +.................................................................................................... +............................o..........o.........................o.................................. +........................................o.............o............................................. +.......................o.......oo..........o........................................................ +........o........................................................................................... +.........................................................................o.......................... +.................................................o....................o........o.................... +.................................................................................................... +.................................................................................................... +...........................................o.........o.........................o.....o.............. +................................................................................................o... +..........................................o.............o.........................o......o.......... +.................................................................................................... +o.......o...........................o............................................................... +.o...o..................................................o.....o..................................... +............................................................................................o....... +.............................................o....................................o................. +........o.....................o..................................................................... +o....................................................................................o...o.......... +.................................................................................................... +................................................o................................................... +..........o.................................................o...................o................o.. +..........................................o....................................o..o....o............ +.....................................................o.............................................. +.....................................o..............o............................................... +...................................o...................................o............................ +...............................................................................o.................... +.................................................................................................... +...................................................oo............................................... +.........o.....o.................................................................o.................. +.................................................................................................... +...o.....................o.......o.................................................................. +.................................................................................................... +..................................o................................................................. +............................................................................o..........o............ +..............oo.......................o.......................................................o.... +................o.....o..................................o.........o................................ +...o.........................................................................................o...... +...................o................................................................................ +....................o.........o...............................................o..................... +......o....o.................................................................o...................... +...o...........................................o.................................................... +...................................................................................o................ +........................o.o.....................................................o............o...... +.................................................................................................... +................................................o.....o............................o................ +.............................o..........o........................................................... +.................................................................................................... +......................................................o...............o............................. +...........................o.........................o...o..........o............................... +..................................................o...........o..................................... +...........o...........................o.................o.......................................... +..................o..........................................................................o...... +.o................................................................o.............o................... +................................................................o................................... +.................................................................................................... +.....................................................................o........................o..... +...................................................................................o................ +...................o..............................................o................................. +............o....................................................................................... +...............................................................................................o.... +.......................................................................................o............ +.................................................................................................... +.............................................o......................................o............... +.................................................................................................... +o.........................o.........................o................................o.............. +............................o......o........................................................o....... +...o.....o.............................................o............................................ +...........................................................................................o........ +................................................................................o................... +.......o......................o..........................................................o.......... +............o....................................................................................... +.............................o...................................................................... +.................................................................................................... +...................................o...o.................................o.......................... +.....................................o....................................o...........o............. +....................................................................................o............... +...............o.................................................................................... +..................o...........................................................o..............o...... +...............o............................................o..............................oo....... +...........o..........................o............................o.............................o.. +.................................................o.............................o.................... +..............................o.....................o............................................... +.................................................................................................... +......................o..............................................o.............................. +.................................................................................................... +.................................................................................................... +...............................................................................o.................... +.................................................................................................... +...................................................................................................o +.............................................o...................................................... +........................................................................o..................o.....o.. +........................................o...............................................o.....o..... +...............................................................................o.................... +....................................................................o............................... +.....................................................o.........................o...o................ +.............................................o...................................................... +.................................................................................................... +..............................................................o..................................o.. +.........................................................o.......................................... +.......................................................o............................................ +.................................................................................................... +...............................................................................o.................... +.....o.............................................................................................. +................................o...........................................................o....... +....................................................o.............................o................. +................................................................................................o..o +.................................................................................................... +......o...........................................o......................o.......................... +.........................o.......o...................o.............................................. +..............................................o..........o.......................................... +..............................................o..................................................... +...............................o..............o..................................o.................. +..o...............o.................o......o.............................o....................o..... +......................................................................o............................. +.................................................................................................... +..............................o....................................................o................ +.................................................................................................... +.....o.............................................................................................. +..............o..........................o...............................................o.......... +....................................o.........................................o..................... +.................................................................................................... +..................o......o.......................o.................................................. +.................................................................................................... +.................................................................................................... +...........o........................................................................................ +.........................................................o.....o.................................... +.................................................................................................... +..............................................................................................o..... +.................................................................o.............................o.... +................................o..........................................................o........ +.....................................................................o.............................. +.................................................................................................... +...................................o................................................................ +.................................................................................................... +...........................................o........................................................ +.................................................................................................... +...........................o........................................................................ +........o................................o.......................................................... +......................o..................................................................o.......... +...........................o..............................o......................................... +.................................................................................................... +.................................................................................................... +....................o...........................o......o............................................ +.....................o.............................................................................. +.........................o........o................................................................. +.........................................................o......o................................... +.......................................................................o............................ +.................................................o.....o............o.............o................. +.........o.......................................................................................... +.....................................................o.............................................. +......................o............................................................................. +.................................................................................................... +............o........o...........................................................................o.. +................................................................o..............o.......o............ +..............o..................................................................................... +.o................................................o..........o...................................... +..................................................o................................................. +........................................o........................................................... +.......................................o...............o...o........................o............... +..........................................................o......................................... +....................................................................o............................... +..o..............o...........................o..........................o........................... +........................................................................o........................... +...........o....o.................o........o........................................................ +.................................o.............o.................................................... +................o...o................................................................o.............. +..............................................................o..................................... +.............................................................o...................................... +....................................................................o....o.......................... +.o......................................................................................o........... +.................................................................................................... +.............o.......o.........................................o.................................... +.................................................................................................... +.......................................................o........................o................... +....................o........o...................................................................... +.......................................................................o............................ +.................................................................................................... +............o.......................................................o...........o................... +.................................................................................................... +......o..................................................................................o.......... +........o............................................................oo............................. +.................................................................................................... +............................................................o............................o.......... +.................................................................................................... +.............................o...........o.......................................................... +.......................................o.................................o........................o. +.....................o.............................................................................. +...................o.............o...................o...............o.............................. +......o..........................................................................................o.. +............o....................................................o.........o........................ +.................................................................................................... diff --git a/bsq/test_grids/grid_3 b/bsq/test_grids/grid_3 new file mode 100644 index 0000000..708b35b --- /dev/null +++ b/bsq/test_grids/grid_3 @@ -0,0 +1,26 @@ +25pwx +pppppwpppp +pppppppppp +wpppppwppp +pppppppppp +pppppppppp +pppppppppp +pppppppppp +pppppppppp +pppppppppp +pppppppppp +pppppwpppp +pppppppppp +pppppppppp +pppppppppp +pppppppppp +pppppwpppp +ppwppppppp +pppppppppp +pppppppppp +ppwppppppp +ppwppppppp +pppppppppp +pppppppppp +pppppppppp +pppppppppp diff --git a/bsq/test_grids/grid_4 b/bsq/test_grids/grid_4 new file mode 100644 index 0000000..25b2bd2 --- /dev/null +++ b/bsq/test_grids/grid_4 @@ -0,0 +1,76 @@ +75.+# ++.......................................................................... +........................................................................... +.......................................................+..............+.... +...........................+..........+.................................... +...................+....................................................... +.....................................+..................................... +........................................................................... +.......................................+................................... +........................................................................... +......+.....................+...........+.................................. +........................................................................... +........................................................................... +........................................................................... +..............+.............................+.............................. +...................................+....................................... +........................+...........................+...................... +.................................................+......................... +...................+................................................+...... +........................................................................... +......+.................................................................... +...........................................+..+............................ +........................................................................... +................................+.......................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +...............................................+........................... +....................................................................+...... +........................................................................... +........................................................................... +........................................................................... +...................+....................................................... +............................+.............................................. +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +..................................................................+........ +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +......................+.........+.......................................... +...................................+....................................... +........................................................................... +........................................................................... +........................................................................... +................+..+....................................................... +........................................................................... +........................................................................... +............................................................+.............. +........................................................................... +........................................................................... +........................................................................... +.....+..................................................................... +........................................................................... +........................................................................... +........................................................................... +........................................................................... +..........+................................................................ +.............................+............................................. +........................................................................... +.................................................+......................... +........................................................................... +........................................................................... +..................+........................................................ diff --git a/bsq/test_grids/grid_5 b/bsq/test_grids/grid_5 new file mode 100644 index 0000000..e498c0b --- /dev/null +++ b/bsq/test_grids/grid_5 @@ -0,0 +1,1001 @@ +1000.+# +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +....................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.................................................................................................................................................................................................................................................................+...............................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................+...................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................... +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................. +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.. +...........................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................... +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................+..........................................................................................................+...........................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..... +............................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................+.......................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................+........................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................... +................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................+.................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................. +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................+...................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................... +..............................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ ++.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................... +..........+...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................+........................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................... +..............................................................................................................................................................................................................................................................................................................................+...............................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................. +...............................................................................................................................................................................................................................................................................................................................................+...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................+............................................................................................................................................................................................+..............................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................+................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................+................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.....+............................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................... +.........................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................. +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................+.....................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................+...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................................................+................................................... +....................................................................................................................................................................................+................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................. +........................................................+..................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................+..............................................................................................................................................................................................................................................................................................................................................................................................................................................+........................+................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.....................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.....................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................. +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................................................................................................................................+.................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................+.......................................................................+............................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................+...............................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................... +.............+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................+.................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................. +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................+.................................. +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...............................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....+..............................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................. +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..............................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...........................................................................................................................................................................................................................................................+............ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................. +.......................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................+..................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................+..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................. +...........................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................... +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................+..............................................................................+...................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................. +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +......................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.....................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................. +......................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................+..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................+..... +................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................+................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....+..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................. +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..............................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................+.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................+.............................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................+.............................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.............................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................+............................................................................................................+.......................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................+........................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................+...................................................................................................... +............................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................+.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................... +..........+.................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +......................................................................+.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................... +..........................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................+.................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................+....................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................... +..............+.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................... +.................................................................................................................................................................................................................................................................................................................................................................................................................+..........................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +......................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................. +...........................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................+..............................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................+.............................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................. +.................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................+.................................................................................................................................................. +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.+.....................................................................................................................................................................................+..............................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................+.......................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................+..........................................................................................................................................................................................................................+........................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................... +.......................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................... +.................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................+............................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................. +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................+..................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................ +.......................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................... diff --git a/bsq/test_grids/grid_6 b/bsq/test_grids/grid_6 new file mode 100644 index 0000000..89091fc --- /dev/null +++ b/bsq/test_grids/grid_6 @@ -0,0 +1,1001 @@ +1000.+# +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................+.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................... +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................... +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................... +...............................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.........................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...............................................................+................................................................................................................................................................................................+........................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +............................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...............................................................................+....................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................+.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................. +.................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................................................................................................................+......................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................+...................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...........................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................. +......................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................+................+................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................................................................................................................................................................+.. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................. +.............................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................... +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...............................................................................................................................................................................................................................................................................................................................+................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.........................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................. +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................. +................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................+....................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................. +.........................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................... +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................... +..............................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................+.............+...........................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................. +................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...............................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................+..........................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................. +.........................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............+....................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................+.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.... +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...........................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................+............................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.....................................................................................................................................................................................................+.................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................. +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................. +............................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................+............................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................. +.........................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +............................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.....................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..........+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................+...................................................................................................................................................................................................................................................................................+.............................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...........................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................... +........................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................+.......................... +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................. +............................................+.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................. +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...............................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.........................................................................................................................................................................................................................+............................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................+....................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.............................................................................................................................................................................+...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................. +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................+....................................................... +.........................................................+...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................+...................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................. +.....................................................................................................................................................................+.......................................................................................................................................................................................................................................................................+...................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................+.........................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................ +................................................................................................+...........................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...............................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................... +..............................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................. +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................... +...................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.........................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +..................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..........................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +......................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................+...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.+..................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................+.............................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.........................................................................................................................................................................................................................+............................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...............................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..............................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................+...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................. +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................... +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................+..................................................................................................................................................................+............................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................+.........................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..............+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................... +.....................................................................................................................................................................+................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................+...........................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................. +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...+....................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..............................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................+......................................................+............................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.........................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +....................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +................................................................................................................................................................................................................................................................................+...........................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................+........................................................................................................................................................................................................ +................................................................................................................................................................................................................................+.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................. +.........................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................... +..............................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................+.....................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................+................................................................................................................................................................................................................ +..........................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................+...............................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................................................................+.....................................................................................................................................................................................................................+..................................................................................................................................................................................+.......................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................... +.............................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.......................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................... +.............................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................+.................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.......................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................. +....................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................................................................................................................................................. +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........+.................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......................................................................................................................................................................................................................................................................................... +........+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +.......................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +......................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................... +......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +......................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................+.........................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......+.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................+.....................................................................................................................................+..........................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................+........................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................+.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................... +.+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...............................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+......... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................+....................................................................................................+................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................... +....................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..................................................... +.................................................................................+...................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................+..............................................................+..................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+..............................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................... +...................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................+........................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................+.............................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................... +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.......................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...........................................+..............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..................................................................................................................................................................................................................................................................................+..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.......................................................................................................................................................................................................................................................................................................................................................................+..............................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................................................................................................................................................................................................................... +................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +......................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +...................+................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................... +...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..........................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +......................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +...........................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +..............................................................................................................................................................................................................................................................................................................................................................................................................................................................+.....................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................... +..........+............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................. +................................................................................................................................................................................................................................................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +............................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +............................................................................................................................................................................................................................................................................................................................................................................................................+........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+................................................................................................................................................................................................................................................................................................................................................................................................................................................................... +..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+............................................................................................................................................................................................................................................................................................................................................................................. +...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+.............................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................... +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ +.................................+...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... diff --git a/bsq/test_grids/grid_7 b/bsq/test_grids/grid_7 new file mode 100644 index 0000000..5c372ae --- /dev/null +++ b/bsq/test_grids/grid_7 @@ -0,0 +1,101 @@ +100.+# +.........................................+.............................+............................ +.................................................................................................... +.................................................................................................... +.................................................................................+.............+.... +.................................................................................................... +.................................................................................................... +....................................................+............................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.............................................................+..............................+....... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +..................................................................................+................. +.................................................................................................... +...................+................................................................................ +.................................................................................................... +.........................................................................+.......................... +.................................................................................................... +.................................................................................................... +.................................................................................................... ++................................................................................................... +.................................................................................................... +.................................................................................................... +.+.............................................................+....+............................... +..................................................................+................................. +.........................+.......................................................................... +.......................+............................................................................ +..............................................................................................+..... +..........................+......................................................................... +..................................................+..........................................+...... +.................................................................................................... +......................+............................................................................. +...............................................................................................+.... +...........................................................................+........................ +.................................................................................................... +.................................................................................................... +.................................................................................................... +.......................................+............+............................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.......................+............................................................................ +....................................+............................................................... +.................................................................................................... +.....+...................................................................+...............+.......... +.................................................................................................... +.................................................................................................... +..............................................................................+..................... +..................................................................................+................. +.................................................................................................... +.................................................................................................... +.................+.................................................................................. +.................................................................................................... +.................................................................................................... +..................................................................................+................. +.................................................................................................... +................+.................................................+................................. +..............................................+..................................................... +.................................................................................................... +.................................................................................................... +....................................................+............................................... +.................................................................................................... +.................................................................................................... +.........+.........................................................+................................ +.................................................................................................... +.........+.......................................................................................... +.................................................................................................... +.................................................................................................... +.......................................................+............................................ +.................................................................................................... +..........................+......................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.............................................................+...................................... +...........................................................................+........................ +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... +.................................................................................................... diff --git a/bsq/test_grids/grid_generator.pl b/bsq/test_grids/grid_generator.pl new file mode 100755 index 0000000..0b126ee --- /dev/null +++ b/bsq/test_grids/grid_generator.pl @@ -0,0 +1,17 @@ +#!/usr/bin/perl +use warnings; +use strict; +die "program x y density" unless (scalar(@ARGV) == 3); +my ($x, $y, $density) = @ARGV; +print "$y.+#\n"; +for (my $i = 0; $i < $y; $i++) { +for (my $j = 0; $j < $x; $j++) { +if (int(rand($y) * 2) < $density) { +print "+"; +} +else { +print "."; +} +} +print "\n"; +} diff --git a/c00/ex00/ft_putchar.c b/c00/ex00/ft_putchar.c new file mode 100644 index 0000000..5930c55 --- /dev/null +++ b/c00/ex00/ft_putchar.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/04 13:53:36 by whaffman #+# #+# */ +/* Updated: 2024/06/05 11:09:09 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putchar(char c) +{ + write(1, &c, 1); +} diff --git a/c00/ex01/ft_print_alphabet.c b/c00/ex01/ft_print_alphabet.c new file mode 100644 index 0000000..cd35982 --- /dev/null +++ b/c00/ex01/ft_print_alphabet.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_alphabet.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/04 13:54:05 by whaffman #+# #+# */ +/* Updated: 2024/06/04 14:37:12 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_print_alphabet(void) +{ + char c; + + c = 'a'; + while (c <= 'z') + { + write(1, &c, 1); + c++; + } +} diff --git a/c00/ex02/ft_print_reverse_alphabet.c b/c00/ex02/ft_print_reverse_alphabet.c new file mode 100644 index 0000000..f2eea0f --- /dev/null +++ b/c00/ex02/ft_print_reverse_alphabet.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_reverse_alphabet.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/04 13:54:53 by whaffman #+# #+# */ +/* Updated: 2024/06/05 11:09:43 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_print_reverse_alphabet(void) +{ + char c; + + c = 'z'; + while (c >= 'a') + { + write(1, &c, 1); + c--; + } +} diff --git a/c00/ex03/ft_print_numbers.c b/c00/ex03/ft_print_numbers.c new file mode 100644 index 0000000..5bf2342 --- /dev/null +++ b/c00/ex03/ft_print_numbers.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_numbers.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/04 13:55:41 by whaffman #+# #+# */ +/* Updated: 2024/06/05 11:15:13 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_print_numbers(void) +{ + int n; + char c; + + n = 0; + while (n <= 9) + { + c = n + 48; + write(1, &c, 1); + n++; + } +} +/* +int main(void) +{ + ft_print_numbers(); + return (0); +} +*/ diff --git a/c00/ex04/ft_is_negative.c b/c00/ex04/ft_is_negative.c new file mode 100644 index 0000000..e72514b --- /dev/null +++ b/c00/ex04/ft_is_negative.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_is_negative.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/04 14:16:23 by whaffman #+# #+# */ +/* Updated: 2024/06/05 11:46:39 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include + +void ft_is_negative(int n) +{ + if (n < 0) + { + write(1, "N", 1); + } + else + { + write(1, "P", 1); + } +} +/* +int main(void) +{ + ft_is_negative(-3); + ft_is_negative(2); + return (0); +} +*/ diff --git a/c00/ex05/ft_print_comb.c b/c00/ex05/ft_print_comb.c new file mode 100644 index 0000000..da37f88 --- /dev/null +++ b/c00/ex05/ft_print_comb.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_comb.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/04 14:57:05 by whaffman #+# #+# */ +/* Updated: 2024/06/04 16:50:34 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void write_number(int n) +{ + char c; + + if (n >= 0 && n <= 9) + { + c = n + 48; + write(1, &c, 1); + } +} + +void write_numbers(int a, int b, int c) +{ + write_number(a); + write_number(b); + write_number(c); + if (a != 7 || b != 8 || c != 9) + { + write(1, ", ", 2); + } +} + +void ft_print_comb(void) +{ + int a; + int b; + int c; + + a = 0; + b = 0; + c = 0; + while (a <= 7) + { + b = a + 1; + while (b <= 8) + { + c = b + 1; + while (c <= 9) + { + write_numbers(a, b, c); + c++; + } + b++; + } + a++; + } +} +/* +int main(void) +{ + ft_print_comb(); + return (0); +} +*/ diff --git a/c00/ex06/ft_print_comb2.c b/c00/ex06/ft_print_comb2.c new file mode 100644 index 0000000..b28972d --- /dev/null +++ b/c00/ex06/ft_print_comb2.c @@ -0,0 +1,79 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_comb2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/04 16:13:19 by whaffman #+# #+# */ +/* Updated: 2024/06/05 10:40:14 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void write_number(int n) +{ + char c; + + if (n >= 0 && n <= 9) + { + c = n + 48; + write(1, &c, 1); + } + else if (n < 0) + { + write(1, "-", 1); + write_number(-n); + } + else if (n > 9) + { + write_number(n / 10); + write_number(n % 10); + } +} + +void write_numbers(int a, int b) +{ + if (a <= 9) + { + write(1, "0", 1); + } + write_number(a); + write(1, " ", 1); + if (b <= 9) + { + write(1, "0", 1); + } + write_number(b); + if (a != 98 || b != 99) + { + write(1, ", ", 2); + } +} + +void ft_print_comb2(void) +{ + int a; + int b; + + a = 0; + b = 0; + while (a <= 99) + { + b = a + 1; + while (b <= 99) + { + write_numbers(a, b); + b++; + } + a++; + } +} +/* +int main(void) +{ + ft_print_comb2(); + return (0); +} +*/ diff --git a/c00/ex07/ft_putnbr.c b/c00/ex07/ft_putnbr.c new file mode 100644 index 0000000..fee7831 --- /dev/null +++ b/c00/ex07/ft_putnbr.c @@ -0,0 +1,49 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 10:06:02 by whaffman #+# #+# */ +/* Updated: 2024/06/10 19:31:37 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putnbr(int nb) +{ + char c; + + if (-2147483648 == nb) + { + write(1, "-2147483648", 11); + } + else if (nb >= 0 && nb <= 9) + { + c = nb + '0'; + write(1, &c, 1); + } + else if (nb < 0) + { + write(1, "-", 1); + ft_putnbr(-nb); + } + else if (nb > 9) + { + ft_putnbr(nb / 10); + ft_putnbr(nb % 10); + } +} + +int main(void) +{ + ft_putnbr(0); + ft_putnbr(-10); + ft_putnbr(42); + ft_putnbr(-2147483648); + ft_putnbr(2147483647); + return (0); +} + diff --git a/c01/ex00/ft_ft.c b/c01/ex00/ft_ft.c new file mode 100644 index 0000000..f4daa17 --- /dev/null +++ b/c01/ex00/ft_ft.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ft.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 12:20:20 by whaffman #+# #+# */ +/* Updated: 2024/06/06 14:37:28 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void ft_ft(int *nbr) +{ + *nbr = 42; +} +/* +#include + +int main(void) +{ + int c = 20; + int *nbr = &c; + ft_ft(nbr); + printf("%d", *nbr); + return (0); +} +*/ diff --git a/c01/ex01/ft_ultimate_ft.c b/c01/ex01/ft_ultimate_ft.c new file mode 100644 index 0000000..c3ae049 --- /dev/null +++ b/c01/ex01/ft_ultimate_ft.c @@ -0,0 +1,16 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ultimate_ft.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 15:53:38 by whaffman #+# #+# */ +/* Updated: 2024/06/05 16:07:57 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void ft_ultimate_ft(int *********nbr) +{ + *********nbr = 42; +} diff --git a/c01/ex02/ft_swap.c b/c01/ex02/ft_swap.c new file mode 100644 index 0000000..1b62d0e --- /dev/null +++ b/c01/ex02/ft_swap.c @@ -0,0 +1,33 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_swap.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 16:09:20 by whaffman #+# #+# */ +/* Updated: 2024/06/05 16:24:04 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void ft_swap(int *a, int *b) +{ + int temp; + + temp = *a; + *a = *b; + *b = temp; +} +/* +#include +int main(void) +{ + int a = 2; + int b = 4; + + ft_swap(&a, &b); + + printf("%d",a); + printf("%d",b); +} +*/ diff --git a/c01/ex03/ft_div_mod.c b/c01/ex03/ft_div_mod.c new file mode 100644 index 0000000..77fe685 --- /dev/null +++ b/c01/ex03/ft_div_mod.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_div_mod.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 16:25:25 by whaffman #+# #+# */ +/* Updated: 2024/06/05 16:38:01 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void ft_div_mod(int a, int b, int *div, int *mod) +{ + *div = a / b; + *mod = a % b; +} +/* +#include +int main(void) +{ + int a = 12; + int b = 10; + int div = 0; + int mod = 0; + + ft_div_mod(a, b, &div, &mod); + printf("from %d and %d the div is %d and the mod is %d", a, b, div, mod); + return (0); +} +*/ diff --git a/c01/ex04/ft_ultimate_div_mod.c b/c01/ex04/ft_ultimate_div_mod.c new file mode 100644 index 0000000..518304e --- /dev/null +++ b/c01/ex04/ft_ultimate_div_mod.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ultimate_div_mod.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 16:40:47 by whaffman #+# #+# */ +/* Updated: 2024/06/05 16:47:24 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void ft_ultimate_div_mod(int *a, int *b) +{ + int div; + int mod; + + div = *a / *b; + mod = *a % *b; + *a = div; + *b = mod; +} +/* +#include +int main(void) +{ + int a = 15; + int b = 10; + + printf("a = %d, b = %d", a, b); + ft_ultimate_div_mod(&a ,&b); + printf("a = %d, b = %d", a, b); + return (0); +} +*/ diff --git a/c01/ex05/ft_putstr.c b/c01/ex05/ft_putstr.c new file mode 100644 index 0000000..fe7026e --- /dev/null +++ b/c01/ex05/ft_putstr.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 17:09:49 by whaffman #+# #+# */ +/* Updated: 2024/06/05 17:19:32 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putstr(char *str) +{ + while (*str != '\0') + { + write(1, str, 1); + str++; + } +} +/* +#include +int main(void) +{ + char *string = "Hello World!\n"; + ft_putstr(string); + return (0); +} +*/ diff --git a/c01/ex06/ft_strlen.c b/c01/ex06/ft_strlen.c new file mode 100644 index 0000000..5efe474 --- /dev/null +++ b/c01/ex06/ft_strlen.c @@ -0,0 +1,34 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 17:21:22 by whaffman #+# #+# */ +/* Updated: 2024/06/05 17:47:50 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_strlen(char *str) +{ + int result; + + result = 0; + while (*str != '\0') + { + result++; + str++; + } + return (result); +} +/* +#include +int main(void) +{ + char *str = "Hello World!"; //12 characters + printf("the string \"Hello World\" \ + contains %d characters,\n", ft_strlen(str)); + return (0); +} +*/ diff --git a/c01/ex07/ft_rev_int_tab.c b/c01/ex07/ft_rev_int_tab.c new file mode 100644 index 0000000..40db773 --- /dev/null +++ b/c01/ex07/ft_rev_int_tab.c @@ -0,0 +1,45 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_rev_int_tab.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 17:48:46 by whaffman #+# #+# */ +/* Updated: 2024/06/10 11:52:30 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void ft_rev_int_tab(int *tab, int size) +{ + int temp; + int *back_tab; + + back_tab = tab + size - 1; + while (back_tab > tab) + { + temp = *tab; + *tab = *back_tab; + *back_tab = temp; + tab++; + back_tab--; + } +} + +#include + +int main(void) +{ + int arr[] = {1}; + int arr2[] = {}; + ft_rev_int_tab(arr, 1); + ft_rev_int_tab(arr2, 0); + for (int i = 0; i < 1; i++) + printf("%d ", arr[i]); + printf("\n"); + + for (int i = 0; i < 0; i++) + printf("%d ", arr2[i]); + return (0); +} + diff --git a/c01/ex08/ft_sort_int_tab.c b/c01/ex08/ft_sort_int_tab.c new file mode 100644 index 0000000..2876162 --- /dev/null +++ b/c01/ex08/ft_sort_int_tab.c @@ -0,0 +1,52 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sort_int_tab.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/05 18:49:17 by whaffman #+# #+# */ +/* Updated: 2024/06/05 19:16:50 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ +void ft_swap(int *a, int *b) +{ + int temp; + + temp = *a; + *a = *b; + *b = temp; +} + +void ft_sort_int_tab(int *tab, int size) +{ + int i; + int swapped; + + swapped = 1; + while (swapped == 1) + { + swapped = 0; + i = 1; + while (i < size) + { + if (*(tab + i - 1) > *(tab + i)) + { + swapped = 1; + ft_swap(tab + i - 1, tab + i); + } + i++; + } + } +} +/* +#include +int main(void) +{ + int arr[] = {4, 1, 3, 6, 2, 5}; + ft_sort_int_tab(arr, 6); + for (int i = 0; i < 6; i++) + printf("%d ", arr[i]); + return (0); +} +*/ diff --git a/c02/ex00/ft_strcpy.c b/c02/ex00/ft_strcpy.c new file mode 100644 index 0000000..e0acc57 --- /dev/null +++ b/c02/ex00/ft_strcpy.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 09:55:08 by whaffman #+# #+# */ +/* Updated: 2024/06/09 17:14:50 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +char *ft_strcpy(char *dest, char *src) +{ + int i; + + i = 0; + while (src[i]) + { + dest[i] = src[i]; + i++; + } + dest[i] = src[i]; + return (dest); +} +/* +#include +int main(void) +{ + char src[] = "Hello, World!"; + char dest[] = "World, Hello!"; + printf("%s",&dest[0]); + ft_strcpy(&dest[0],&src[0]); + printf("%s",&dest[0]); + + return (0); +} +*/ diff --git a/c02/ex01/ft_strncpy.c b/c02/ex01/ft_strncpy.c new file mode 100644 index 0000000..27c427f --- /dev/null +++ b/c02/ex01/ft_strncpy.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 12:11:53 by whaffman #+# #+# */ +/* Updated: 2024/06/06 18:14:49 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +char *ft_strncpy(char *dest, char *src, unsigned int n) +{ + unsigned int i; + + i = 0; + while (src[i] != '\0' && i < n) + { + dest[i] = src[i]; + i++; + } + while (i < n) + { + dest[i] = '\0'; + i++; + } + return (dest); +} +/* +#include +int main(void) +{ + char src[] = "Held!"; + char dest[] = "World, Hello!"; + printf("%s",&dest[0]); + ft_strncpy(&dest[0], &src[0], 6); + printf("%s",&dest[0]); + + return (0); +} +*/ diff --git a/c02/ex02/ft_str_is_alpha.c b/c02/ex02/ft_str_is_alpha.c new file mode 100644 index 0000000..c483659 --- /dev/null +++ b/c02/ex02/ft_str_is_alpha.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_alpha.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 14:06:00 by whaffman #+# #+# */ +/* Updated: 2024/06/06 14:35:19 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_str_is_alpha(char *str) +{ + int is_alpha; + + is_alpha = 1; + while (*str != '\0') + { + if (*str < 'A' \ + || (*str > 'Z' && *str < 'a') \ + || *str > 'z') + { + is_alpha = 0; + } + str++; + } + return (is_alpha); +} +/* +#include +int main(void) +{ + char *s1 = ""; + char *s2 = "adsf"; + char *s3 = "asdfgr3asdf"; + printf("%d, %d, %d", \ + ft_str_is_alpha(s1), + ft_str_is_alpha(s2), + ft_str_is_alpha(s3)); + + return (0); +} +*/ diff --git a/c02/ex03/ft_str_is_numeric.c b/c02/ex03/ft_str_is_numeric.c new file mode 100644 index 0000000..993c782 --- /dev/null +++ b/c02/ex03/ft_str_is_numeric.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_numeric.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 14:38:19 by whaffman #+# #+# */ +/* Updated: 2024/06/06 15:14:48 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_str_is_numeric(char *str) +{ + int is_numeric; + + is_numeric = 1; + while (*str != '\0') + { + if (*str < '0' || *str > '9') + { + is_numeric = 0; + } + str++; + } + return (is_numeric); +} +/* +#include +int main(void) +{ + char *s1 = ""; + char *s2 = "123"; + char *s3 = "123f"; + printf("%d, %d, %d", \ + ft_str_is_numeric(s1), + ft_str_is_numeric(s2), + ft_str_is_numeric(s3)); + return (0); +} +*/ diff --git a/c02/ex04/ft_str_is_lowercase.c b/c02/ex04/ft_str_is_lowercase.c new file mode 100644 index 0000000..33d6983 --- /dev/null +++ b/c02/ex04/ft_str_is_lowercase.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_lowercase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 14:51:35 by whaffman #+# #+# */ +/* Updated: 2024/06/06 14:58:04 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_str_is_lowercase(char *str) +{ + int is_lowercase; + + is_lowercase = 1; + while (*str != '\0') + { + if (*str < 'a' || *str > 'z') + { + is_lowercase = 0; + } + str++; + } + return (is_lowercase); +} +/* +#include +int main(void) +{ + char *s1 = ""; + char *s2 = "adsf"; + char *s3 = "asdfgrAasdf"; + printf("%d, %d, %d", \ + ft_str_is_lowercase(s1), + ft_str_is_lowercase(s2), + ft_str_is_lowercase(s3)); + + return (0); +} +*/ diff --git a/c02/ex05/ft_str_is_uppercase.c b/c02/ex05/ft_str_is_uppercase.c new file mode 100644 index 0000000..e596d41 --- /dev/null +++ b/c02/ex05/ft_str_is_uppercase.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_uppercase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 14:51:35 by whaffman #+# #+# */ +/* Updated: 2024/06/06 15:01:30 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_str_is_uppercase(char *str) +{ + int is_uppercase; + + is_uppercase = 1; + while (*str != '\0') + { + if (*str < 'A' || *str > 'Z') + { + is_uppercase = 0; + } + str++; + } + return (is_uppercase); +} +/* +#include +int main(void) +{ + char *s1 = ""; + char *s2 = "ASDF"; + char *s3 = "asdfgrAasdf"; + printf("%d, %d, %d", \ + ft_str_is_uppercase(s1), + ft_str_is_uppercase(s2), + ft_str_is_uppercase(s3)); + + return (0); +} +*/ diff --git a/c02/ex06/ft_str_is_printable.c b/c02/ex06/ft_str_is_printable.c new file mode 100644 index 0000000..eda91df --- /dev/null +++ b/c02/ex06/ft_str_is_printable.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_str_is_printable.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 14:51:35 by whaffman #+# #+# */ +/* Updated: 2024/06/12 16:40:15 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_str_is_printable(char *str) +{ + int is_printable; + + is_printable = 1; + while (*str != '\0') + { + if (*str < 32 || *str > 126) + { + is_printable = 0; + } + str++; + } + return (is_printable); +} +/* +#include +int main(void) +{ + char *s1 = ""; + char *s2 = "ASDF"; + char *s3 = "asdfgrAasi\ndf"; + printf("%d, %d, %d", \ + ft_str_is_printable(s1), + ft_str_is_printable(s2), + ft_str_is_printable(s3)); + + return (0); +} +*/ diff --git a/c02/ex07/ft_strupcase.c b/c02/ex07/ft_strupcase.c new file mode 100644 index 0000000..cc09b34 --- /dev/null +++ b/c02/ex07/ft_strupcase.c @@ -0,0 +1,37 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strupcase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 15:57:01 by whaffman #+# #+# */ +/* Updated: 2024/06/10 10:20:08 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +char *ft_strupcase(char *str) +{ + char *org_str; + + org_str = str; + while (*str) + { + if (*str >= 'a' && *str <= 'z') + { + *str = *str - 'a' + 'A'; + } + str++; + } + return (org_str); +} +/* +#include +int main(void) +{ + char str[] = "Hello, World!"; + ft_strupcase(&str[0]); + printf("%s", str); + return (0); +} +*/ diff --git a/c02/ex08/ft_strlowcase.c b/c02/ex08/ft_strlowcase.c new file mode 100644 index 0000000..3f51235 --- /dev/null +++ b/c02/ex08/ft_strlowcase.c @@ -0,0 +1,35 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlowcase.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 15:57:01 by whaffman #+# #+# */ +/* Updated: 2024/06/09 17:25:15 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +char *ft_strlowcase(char *str) +{ + char *org_str; + + org_str = str; + while (*str) + { + if (*str >= 'A' && *str <= 'Z') + *str = *str - 'A' + 'a'; + str++; + } + return (org_str); +} +/* +#include +int main(void) +{ + char str[] = "Hello, World!"; + ft_strlowcase(&str[0]); + printf("%s", str); + return (0); +} +*/ diff --git a/c02/ex09/ft_strcapitalize.c b/c02/ex09/ft_strcapitalize.c new file mode 100644 index 0000000..169ff19 --- /dev/null +++ b/c02/ex09/ft_strcapitalize.c @@ -0,0 +1,63 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcapitalize.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 15:57:01 by whaffman #+# #+# */ +/* Updated: 2024/06/09 17:29:10 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_is_num(char c) +{ + return (c >= '0' && c <= '9'); +} + +int ft_is_upper(char c) +{ + return (c >= 'A' && c <= 'Z'); +} + +int ft_is_lower(char c) +{ + return (c >= 'a' && c <= 'z'); +} + +int ft_is_alphanumeric(char c) +{ + return (ft_is_num(c) || ft_is_upper(c) || ft_is_lower(c)); +} + +char *ft_strcapitalize(char *str) +{ + int first_letter; + char *org_str; + + org_str = str; + first_letter = 1; + while (*str) + { + if (first_letter && ft_is_lower(*str)) + *str = *str - 'a' + 'A'; + if (!first_letter && ft_is_upper(*str)) + *str = *str - 'A' + 'a'; + if (ft_is_alphanumeric(*str)) + first_letter = 0; + else + first_letter = 1; + str++; + } + return (org_str); +} +/* +#include +int main(void) +{ + char str[] = "salut, comment tu vas ? 42mots quaRante-deux; cinquante+et+un"; + ft_strcapitalize(&str[0]); + printf("%s", str); + return (0); +} +*/ diff --git a/c02/ex10/ft_strlcpy.c b/c02/ex10/ft_strlcpy.c new file mode 100644 index 0000000..41445cf --- /dev/null +++ b/c02/ex10/ft_strlcpy.c @@ -0,0 +1,58 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcpy.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 12:11:53 by whaffman #+# #+# */ +/* Updated: 2024/06/10 11:13:34 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_strlen(char *str) +{ + int result; + + result = 0; + while (str[result]) + { + result++; + } + return (result); +} + +unsigned int ft_strlcpy(char *dest, char *src, unsigned int size) +{ + unsigned int i; + unsigned int result; + + i = 0; + while (src[i] && i < size - 1) + { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; + result = ft_strlen(src); + return (result); +} + +#ifdef DEBUG + +int main(void) +{ + char src[13]; + char dest[13]; + int result; + + ft_strlcpy(&src[0], "hello, world!", 13); + result = ft_strlcpy(&dest[0], "HELLO, WORLD!", 13); + printf("%d: %s\n", result, &dest[0]); + result = ft_strlcpy(&dest[0], &src[0], 13); + printf("%d: %s\n", result, &dest[0]); + return (0); +} +#endif diff --git a/c02/ex11/ft_putstr_non_printable.c b/c02/ex11/ft_putstr_non_printable.c new file mode 100644 index 0000000..2c6034f --- /dev/null +++ b/c02/ex11/ft_putstr_non_printable.c @@ -0,0 +1,67 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr_non_printable.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/06 18:24:39 by whaffman #+# #+# */ +/* Updated: 2024/06/10 12:06:13 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include + +void ft_putchar(char c) +{ + write(1, &c, 1); +} + +void ft_puthex(int c) +{ + if (c < 10) + ft_putchar(c + '0'); + else if (c > 9 && c < 16) + { + ft_putchar(c - 10 + 'a'); + } +} + +void ft_putstr_non_printable(char *str) +{ + while (*str != '\0') + { + if (*str >= 32 && *str <= 126) + write(1, str, 1); + else + { + ft_putchar('\\'); + ft_puthex(*str / 16); + ft_puthex(*str % 16); + } + str++; + } +} + +#ifdef DEBUG + +int main(void) +{ + char str[15]; + int i; + + strcpy(&str[0], "Hello, \n World!"); + ft_putstr_non_printable(str); + printf("\n"); + i = 0; + while (i <= 127) + { + strcpy(&str[0], (char [2]){(char) i, '\0'}); + ft_putstr_non_printable(str); + i++; + } + return (0); +} +#endif diff --git a/c03/ex00/ft_strcmp.c b/c03/ex00/ft_strcmp.c new file mode 100644 index 0000000..5ee2ccb --- /dev/null +++ b/c03/ex00/ft_strcmp.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/07 14:39:41 by whaffman #+# #+# */ +/* Updated: 2024/06/10 15:50:16 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int ft_strcmp(char *s1, char *s2) +{ + while (*s1 && *s1 == *s2) + { + s1++; + s2++; + } + return (*s1 - *s2); +} + +#ifdef DEBUG + +void test(char *s1, char *s2) +{ + printf("s1: \"%s\"\ns2: \"%s\"\nft_strcmp: %d\nstrcmp: %d\n", \ + s1, s2, ft_strcmp(s1, s2), strcmp(s1, s2)); +} + +int main(void) +{ + test("abc", "abc"); + test("ab", "abc"); + test("abc", "ab"); + test("abd", "abc"); + test("abc", "abd"); + return (0); +} +#endif diff --git a/c03/ex01/ft_strncmp.c b/c03/ex01/ft_strncmp.c new file mode 100644 index 0000000..88d1da5 --- /dev/null +++ b/c03/ex01/ft_strncmp.c @@ -0,0 +1,51 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncmp.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/07 14:39:41 by whaffman #+# #+# */ +/* Updated: 2024/06/18 16:26:53 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int ft_strncmp(char *s1, char *s2, unsigned int n) +{ + unsigned int i; + + i = 0; +// if (n == 0) +// return (0); + while (*s1 && *s1 == *s2 && i < n - 1) + { + s1++; + s2++; + i++; + } + return (*s1 - *s2); +} + +#ifdef DEBUG + +void test(char *s1, char *s2, unsigned int n) +{ + printf("s1: \"%s\"\ns2: \"%s\"\nstrncmp: %d\nft_strncmp: %d\n\n", \ + s1, s2, strncmp(s1, s2, n), ft_strncmp(s1, s2, n)); +} + +int main(void) +{ + test("abc", "abc", 3); + test("ab", "abc", 3); + test("abc", "ab", 3); + test("abd", "abc", 3); + test("abd", "abc", 2); + test("abd", "zbc", 0); + test("abd", "zbc", 1); + return (0); +} +#endif diff --git a/c03/ex02/ft_strcat.c b/c03/ex02/ft_strcat.c new file mode 100644 index 0000000..3e9c734 --- /dev/null +++ b/c03/ex02/ft_strcat.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 14:58:48 by whaffman #+# #+# */ +/* Updated: 2024/06/11 15:00:16 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +char *ft_strcat(char *dest, char *src) +{ + char *odest; + + odest = dest; + while (*dest) + dest++; + while (*src) + *dest++ = *src++; + *dest = '\0'; + return (odest); +} + +#ifdef DEBUG + +void test(char *s1, char *s2, char *s3) +{ + printf("s1: \"%s\"\n", s1); + printf("s2: \"%s\"\n", s2); + printf("s3: \"%s\"\n", s3); + printf("strcat(s1, s3): \"%s\"\nft_strcat(s2, s3): \"%s\"\n\n", \ + strcat(s1, s3), ft_strcat(s2, s3)); +} + +int main(void) +{ + char s1[20]; + char s2[20]; + + s1[0] = '\0'; + test(&s1[0], &s2[0], "Hello!"); + test(&s1[0], &s2[0], "Hello!"); + test(&s1[0], &s2[0], "Hello!"); + test(&s1[0], &s2[0], "Hello!"); + test(&s1[0], &s2[0], "Hello!"); + test(&s1[0], &s2[0], "Hello!"); + return (0); +} +#endif diff --git a/c03/ex03/ft_strncat.c b/c03/ex03/ft_strncat.c new file mode 100644 index 0000000..b9ddad3 --- /dev/null +++ b/c03/ex03/ft_strncat.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strncat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 14:58:31 by whaffman #+# #+# */ +/* Updated: 2024/06/11 16:42:32 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +char *ft_strncat(char *dest, char *src, unsigned int nb) +{ + char *odest; + unsigned int i; + + odest = dest; + while (*dest) + dest++; + i = 0; + while (*src && i++ < nb) + *dest++ = *src++; + *dest = '\0'; + return (odest); +} + +#ifdef DEBUG + +void test(char *dest0, char *dest1, char *src, int n) +{ + printf("dest0: \"%s\"\n", dest0); + printf("dest1: \"%s\"\n", dest1); + printf("src: \"%s\"\n", src); + printf("strncat: \"%s\"\n", strncat(dest0, src, n)); + printf("ft_strncat: \"%s\"\n", ft_strncat(dest1, src, n)); +} + +int main(void) +{ + char dest0[20]; + char dest1[20]; + + dest0[0] = 0; + dest1[0] = 0; + test(&dest0[0], &dest1[0], "0123456789", 10); + test(&dest0[0], &dest1[0], "0123456789", 5); + test(&dest0[0], &dest1[0], "0123456789", 5); + return (0); +} +#endif diff --git a/c03/ex04/ft_strstr.c b/c03/ex04/ft_strstr.c new file mode 100644 index 0000000..7b9a9a3 --- /dev/null +++ b/c03/ex04/ft_strstr.c @@ -0,0 +1,73 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 14:58:08 by whaffman #+# #+# */ +/* Updated: 2024/06/11 14:58:17 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int compare(char *str, char *to_find) +{ + int found; + + found = 0; + while (*to_find) + { + if (*str != *to_find) + { + found = 0; + break ; + } + else + { + str++; + to_find++; + found = 1; + } + } + return (found); +} + +char *ft_strstr(char *str, char *to_find) +{ + int found; + + if (!*to_find) + return (str); + found = 0; + while (*str) + { + if (compare(str, to_find)) + return (str); + str++; + } + return (NULL); +} + +#ifdef DEBUG + +void test(char *str, char *to_find) +{ + printf("haystack: \"%s\"\nneedle: \"%s\"\n", \ + str, to_find); + printf("index(ft_strstr): %ld\nindex(strstr): %ld\n", \ + ft_strstr(str, to_find) - str, strstr(str, to_find) - str); +} + +int main(void) +{ + test("Hello, World!", "o, "); + test("Hello, World!", "o"); + test("Hello, World!", ""); + test("Hello, World!", "H"); + test("Hello, World!", "Z"); + return (0); +} +#endif diff --git a/c03/ex05/ft_strlcat.c b/c03/ex05/ft_strlcat.c new file mode 100644 index 0000000..154d147 --- /dev/null +++ b/c03/ex05/ft_strlcat.c @@ -0,0 +1,74 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlcat.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/09 14:28:08 by whaffman #+# #+# */ +/* Updated: 2024/06/12 16:17:01 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +unsigned int ft_strlen(char *str) +{ + int i; + + i = 0; + while (str[i]) + i++; + return (i); +} + +unsigned int ft_strlcat(char *dest, char *src, unsigned int size) +{ + unsigned int src_len; + unsigned int dest_len; + unsigned int i; + + src_len = ft_strlen(src); + dest_len = ft_strlen(dest); + if (dest_len >= (long int) size) + return (size + src_len); + i = 0; + while (src[i] && i < size - dest_len - 1) + { + dest[dest_len + i] = src[i]; + i++; + } + dest[dest_len + i] = '\0'; + return (src_len + dest_len); +} + +#ifdef DEBUG + +void test(char *dest1, char *dest2, char *src, int size) +{ + int result_ft; + int result_bsd; + + printf("=====================================\n"); + printf("dest1(len = %d): \"%s\"\n", ft_strlen(dest1), dest1); + printf("dest2(len = %d): \"%s\"\n", ft_strlen(dest2), dest2); + printf("src(len = %d): \"%s\"\n", ft_strlen(src), src); + result_ft = ft_strlcat(dest1, src, size); + result_bsd = strlcat(dest2, src, size); + printf("ft: %d\n", result_ft); + printf("bsd: %d\n", result_bsd); + printf("dest1(ft) : \"%s\"\n", dest1); + printf("dest2(bsd): \"%s\"\n", dest2); +} + +int main(void) +{ + char dest1[5]; + char dest2[5]; + + strcpy(dest1, "Ha"); + strcpy(dest2, "Ha"); + test(dest1, dest2, "ai", 4); +} +#endif diff --git a/c04/ex00/ft_strlen.c b/c04/ex00/ft_strlen.c new file mode 100644 index 0000000..5256c5b --- /dev/null +++ b/c04/ex00/ft_strlen.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strlen.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 15:01:31 by whaffman #+# #+# */ +/* Updated: 2024/06/12 11:10:18 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int ft_strlen(char *str) +{ + int i; + + i = 0; + while (*str++) + i++; + return (i); +} + +#ifdef DEBUG + +void test(char *str) +{ + printf("str: \"%s\"\n", str); + printf("strlen: %ld\n", strlen(str)); + printf("ft_strlen: %d\n\n", ft_strlen(str)); +} + +int main(void) +{ + test("Vogon"); + test(""); + test("Zaphod Beeblebrox"); + return (0); +} + +#endif diff --git a/c04/ex01/ft_putstr.c b/c04/ex01/ft_putstr.c new file mode 100644 index 0000000..94c8544 --- /dev/null +++ b/c04/ex01/ft_putstr.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putstr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 15:02:05 by whaffman #+# #+# */ +/* Updated: 2024/06/12 11:13:48 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putstr(char *str) +{ + while (*str) + { + write(1, str, 1); + str++; + } +} + +#ifdef DEBUG + +int main(void) +{ + ft_putstr("Hello\n"); + ft_putstr(""); + ft_putstr("Don't "); + ft_putstr("Panic!!\n"); + ft_putstr("And don't forget your towel\n"); + return (0); +} + +#endif diff --git a/c04/ex02/ft_putnbr.c b/c04/ex02/ft_putnbr.c new file mode 100644 index 0000000..0a26b1f --- /dev/null +++ b/c04/ex02/ft_putnbr.c @@ -0,0 +1,57 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 15:01:50 by whaffman #+# #+# */ +/* Updated: 2024/06/12 11:16:22 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putnbr(int nb) +{ + char c; + + if (-2147483648 == nb) + { + write(1, "-2147483648", 11); + } + else if (nb >= 0 && nb <= 9) + { + c = nb + '0'; + write(1, &c, 1); + } + else if (nb < 0) + { + write(1, "-", 1); + ft_putnbr(-nb); + } + else if (nb > 9) + { + ft_putnbr(nb / 10); + ft_putnbr(nb % 10); + } +} + +#ifdef DEBUG + +int main(void) +{ + ft_putnbr(0); + write(1, "\n", 1); + ft_putnbr(-10); + write(1, "\n", 1); + ft_putnbr(42); + write(1, "\n", 1); + ft_putnbr(-2147483648); + write(1, "\n", 1); + ft_putnbr(2147483647); + write(1, "\n", 1); + return (0); +} + +#endif diff --git a/c04/ex03/ft_atoi.c b/c04/ex03/ft_atoi.c new file mode 100644 index 0000000..daf3dda --- /dev/null +++ b/c04/ex03/ft_atoi.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 15:22:52 by whaffman #+# #+# */ +/* Updated: 2024/06/12 20:21:53 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int ft_isdigit(char c) +{ + return (c >= '0' && c <= '9'); +} + +int ft_isspace(char c) +{ + return (' ' == c || '\f' == c || \ + '\n' == c || '\r' == c || \ + '\t' == c || '\v' == c); +} + +int ft_atoi(char *str) +{ + int sign; + int res; + + while (ft_isspace(*str)) + str++; + res = 0; + sign = 1; + while (*str == '-' || *str == '+') + { + if (*str == '-') + sign *= -1; + str++; + } + while (ft_isdigit(*str)) + res = 10 * res + sign * (*str++ - '0'); + return (res); +} + +#ifdef DEBUG + +void test(char *str) +{ + printf("string: \"%s\"\n", str); + printf("int: %d\n", ft_atoi(str)); +} + +int main(void) +{ + test(""); + test("123"); + test("-123"); + test("-2147483648"); + test("2147483647"); + test(" ----+++-1234"); + test("12345a1234"); + test("123.34"); + return (0); +} + +#endif diff --git a/c04/ex04/ft_putnbr_base.c b/c04/ex04/ft_putnbr_base.c new file mode 100644 index 0000000..5c05a63 --- /dev/null +++ b/c04/ex04/ft_putnbr_base.c @@ -0,0 +1,90 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putnbr_base.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/11 17:49:33 by whaffman #+# #+# */ +/* Updated: 2024/06/12 18:50:38 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_strlen(char *str) +{ + int n; + + n = 0; + while (str[n]) + n++; + return (n); +} + +int ft_isrepeating(char *str) +{ + int i; + + while (*str) + { + i = 1; + while (str[i]) + { + if (str[0] == str[i]) + return (1); + i++; + } + str++; + } + return (0); +} + +int ft_contains_illegal_char(char *str) +{ + while (*str) + { + if (*str == '-' || *str == '+') + return (1); + str++; + } + return (0); +} + +void ft_putnbr_base(int nbr, char *base) +{ + int b; + + b = ft_strlen(base); + if (ft_isrepeating(base) || b < 2 || ft_contains_illegal_char(base)) + return ; + if (nbr >= 0 && nbr < b) + { + write(1, &base[nbr], 1); + } + else if (nbr < 0) + { + write(1, "-", 1); + if (nbr > -b) + ft_putnbr_base(-nbr, base); + else + { + ft_putnbr_base(nbr / (-b), base); + ft_putnbr_base(-(nbr % b), base); + } + } + else if (nbr >= b) + { + ft_putnbr_base(nbr / b, base); + ft_putnbr_base(nbr % b, base); + } +} + +#ifdef DEBUG + +int main(void) +{ + ft_putnbr_base(123, "012345678"); +} + +#endif diff --git a/c04/ex05/ft_atoi_base.c b/c04/ex05/ft_atoi_base.c new file mode 100644 index 0000000..290247f --- /dev/null +++ b/c04/ex05/ft_atoi_base.c @@ -0,0 +1,88 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atoi_base.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/12 09:17:21 by whaffman #+# #+# */ +/* Updated: 2024/06/12 18:55:08 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_strlen(char *str) +{ + int i; + + i = 0; + while (*str++) + i++; + return (i); +} + +int ft_isrepeating(char *str) +{ + int i; + + while (*str) + { + i = 1; + while (str[i]) + { + if (str[0] == str[i]) + return (1); + i++; + } + str++; + } + return (0); +} + +int ft_indexof(char c, char *str) +{ + int result; + + result = 0; + while (str[result]) + { + if (str[result] == c) + return (result); + result++; + } + return (-1); +} + +int ft_atoi_base(char *str, char *base) +{ + int sign; + int res; + + while (ft_indexof(*str, " \f\n\r\t\v") >= 0) + str++; + res = 0; + sign = 1; + while (*str == '-' || *str == '+') + { + if (*str == '-') + sign *= -1; + str++; + } + while (ft_indexof(*str, base) >= 0) + res = ft_strlen(base) * res + ft_indexof(*str++, base); + return (sign * res); +} + +#ifdef DEBUG + +int main(void) +{ + int r; + + r = ft_atoi_base("-2147483648", "0123456789"); + printf("%d", r); + return (0); +} + +#endif diff --git a/c05/ex00/ft_iterative_factorial.c b/c05/ex00/ft_iterative_factorial.c new file mode 100644 index 0000000..8bf4ecc --- /dev/null +++ b/c05/ex00/ft_iterative_factorial.c @@ -0,0 +1,44 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_iterative_factorial.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 10:52:17 by whaffman #+# #+# */ +/* Updated: 2024/06/13 11:06:44 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_iterative_factorial(int nb) +{ + int result; + + result = 1; + if (nb >= 0) + { + while (nb > 1) + result *= nb--; + return (result); + } + return (0); +} + +#ifdef DEBUG + +int main(void) +{ + int i; + + i = -3; + while (i < 10) + { + printf("%d! = %d\n", i, ft_iterative_factorial(i)); + i++; + } + return (0); +} + +#endif diff --git a/c05/ex01/ft_recursive_factorial.c b/c05/ex01/ft_recursive_factorial.c new file mode 100644 index 0000000..c3f2274 --- /dev/null +++ b/c05/ex01/ft_recursive_factorial.c @@ -0,0 +1,39 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_recursive_factorial.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 11:07:32 by whaffman #+# #+# */ +/* Updated: 2024/06/14 12:17:33 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_recursive_factorial(int nb) +{ + if (nb < 0) + return (0); + if (nb <= 1) + return (1); + return (nb * ft_recursive_factorial(nb - 1)); +} + +#ifdef DEBUG + +int main(void) +{ + int i; + + i = -3; + while (i < 10) + { + printf("%d! = %d\n", i, ft_recursive_factorial(i)); + i++; + } + return (0); +} + +#endif diff --git a/c05/ex02/ft_iterative_power.c b/c05/ex02/ft_iterative_power.c new file mode 100644 index 0000000..95a8afd --- /dev/null +++ b/c05/ex02/ft_iterative_power.c @@ -0,0 +1,54 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_iterative_power.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 11:12:36 by whaffman #+# #+# */ +/* Updated: 2024/06/14 12:18:06 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_iterative_power(int nb, int power) +{ + int result; + + result = 1; + if (power < 0) + return (0); + if (power == 0) + return (1); + while (power > 0) + { + result *= nb; + power--; + } + return (result); +} + +#ifdef DEBUG + +int main(void) +{ + int i; + int j; + + i = -3; + j = -3; + while (i < 5) + { + while (j < 5) + { + printf("%d^%d = %d\n", i, j, ft_iterative_power(i, j)); + j++; + } + j = -3; + i++; + } + return (0); +} + +#endif diff --git a/c05/ex03/ft_recursive_power.c b/c05/ex03/ft_recursive_power.c new file mode 100644 index 0000000..70c936b --- /dev/null +++ b/c05/ex03/ft_recursive_power.c @@ -0,0 +1,50 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_recursive_power.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 11:28:27 by whaffman #+# #+# */ +/* Updated: 2024/06/13 11:32:29 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_recursive_power(int nb, int power) +{ + int result; + + result = 1; + if (power < 0) + return (0); + else if (power == 0) + return (1); + else + return (nb * ft_recursive_power(nb, power - 1)); +} + +#ifdef DEBUG + +int main(void) +{ + int i; + int j; + + i = -2; + j = -2; + while (i < 3) + { + while (j < 3) + { + printf("%d^%d = %d\n", i, j, ft_recursive_power(i, j)); + j++; + } + j = -2; + i++; + } + return (0); +} + +#endif diff --git a/c05/ex04/ft_fibonacci.c b/c05/ex04/ft_fibonacci.c new file mode 100644 index 0000000..24a65d8 --- /dev/null +++ b/c05/ex04/ft_fibonacci.c @@ -0,0 +1,40 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_fibonacci.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 11:34:54 by whaffman #+# #+# */ +/* Updated: 2024/06/13 11:40:20 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_fibonacci(int index) +{ + if (index < 0) + return (-1); + else if (index < 2) + return (index); + else + return (ft_fibonacci(index - 1) + ft_fibonacci(index - 2)); +} + +#ifdef DEBUG + +int main(void) +{ + int i; + + i = -3; + while (i < 10) + { + printf("fib(%d) = %d\n", i, ft_fibonacci(i)); + i++; + } + return (0); +} + +#endif diff --git a/c05/ex05/ft_sqrt.c b/c05/ex05/ft_sqrt.c new file mode 100644 index 0000000..30e673e --- /dev/null +++ b/c05/ex05/ft_sqrt.c @@ -0,0 +1,46 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sqrt.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 12:07:01 by whaffman #+# #+# */ +/* Updated: 2024/06/13 12:18:19 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_sqrt(int nb) +{ + int i; + + if (nb <= 0) + return (0); + i = 1; + while (i * i <= nb) + { + if (i * i == nb) + return (i); + i++; + } + return (0); +} + +#ifdef DEBUG + +int main(void) +{ + int i; + + i = -3; + while (i < 10) + { + printf("sqrt(%d) = %d\n", i, ft_sqrt(i)); + i++; + } + return (0); +} + +#endif diff --git a/c05/ex06/ft_is_prime.c b/c05/ex06/ft_is_prime.c new file mode 100644 index 0000000..80f84ab --- /dev/null +++ b/c05/ex06/ft_is_prime.c @@ -0,0 +1,47 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_is_prime.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 12:20:04 by whaffman #+# #+# */ +/* Updated: 2024/06/13 12:39:01 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_is_prime(int nb) +{ + int i; + + if (nb < 2) + return (0); + i = 2; + while (i * i <= nb) + { + if (nb % i == 0) + return (0); + i++; + } + return (1); +} + +#ifdef DEBUG + +int main(void) +{ + int i; + + i = -3; + while (i < 100) + { + if (ft_is_prime(i)) + printf("ft_is_prime(%d) = %d\n", i, ft_is_prime(i)); + i++; + } + return (0); +} + +#endif diff --git a/c05/ex07/ft_find_next_prime.c b/c05/ex07/ft_find_next_prime.c new file mode 100644 index 0000000..4b5536d --- /dev/null +++ b/c05/ex07/ft_find_next_prime.c @@ -0,0 +1,62 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_find_next_prime.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 12:40:48 by whaffman #+# #+# */ +/* Updated: 2024/06/13 13:09:20 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_is_prime(int nb) +{ + int i; + + if (nb < 2) + return (0); + i = 2; + while (i * i <= nb) + { + if (nb % i == 0) + return (0); + i++; + } + return (1); +} + +int ft_find_next_prime(int nb) +{ + nb++; + while (1) + { + if (ft_is_prime(nb)) + return (nb); + nb++; + } + return (0); +} + +#ifdef DEBUG + +void test(int nb) +{ + printf("After %d the next prime is %d.\n", nb, ft_find_next_prime(nb)); +} + +int main(void) +{ + test(3); + test(31); + test(4); + test(29); + test(103); + test(256); + test(123456783); + return (0); +} + +#endif diff --git a/c05/ex08/ft_ten_queens_puzzle.c b/c05/ex08/ft_ten_queens_puzzle.c new file mode 100644 index 0000000..468c03b --- /dev/null +++ b/c05/ex08/ft_ten_queens_puzzle.c @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ten_queens_puzzle.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 13:11:27 by whaffman #+# #+# */ +/* Updated: 2024/06/15 11:24:16 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#define SIZE 10 + +void ft_put_board(int board[SIZE]) +{ + int i; + char c; + + i = 0; + while (i < SIZE) + { + c = board[i] + '0'; + write(1, &c, 1); + i++; + } + write(1, "\n", 1); +} + +int ft_test_queens(int board[SIZE], int x, int y) +{ + int i; + + i = 0; + if (x == 0) + return (1); + while (i <= x) + { + if (board[i] == y || i + board[i] == x + y || i - board[i] == x - y) + return (0); + i++; + } + return (1); +} + +void ft_add_queen(int board[SIZE], int *res, int x) +{ + int y; + + if (x == SIZE) + { + *res += 1; + ft_put_board(&board[0]); + } + else + { + y = 0; + while (y < SIZE) + { + ft_put_board(&board[0]); + if (ft_test_queens(board, x, y)) + { + board[x] = y; + ft_add_queen(board, res, x + 1); + board[x] = -3; + } + y++; + } + } +} + +int ft_ten_queens_puzzle(void) +{ + int res; + int board[SIZE]; + int i; + + i = 0; + res = 0; + while (i < SIZE) + { + board[i] = -3; + i++; + } + ft_add_queen(board, &res, 0); + return (res); +} + +#ifdef DEBUG + +int main(void) +{ + printf("result = %d", ft_ten_queens_puzzle()); +} + +#endif diff --git a/c06/ex00/ft_print_program_name.c b/c06/ex00/ft_print_program_name.c new file mode 100644 index 0000000..e884068 --- /dev/null +++ b/c06/ex00/ft_print_program_name.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_program_name.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/12 16:42:13 by whaffman #+# #+# */ +/* Updated: 2024/06/16 16:56:36 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putstr(char *str) +{ + while (*str != '\0') + { + write(1, str, 1); + str++; + } +} + +int main(int argc, char **argv) +{ + if (argc >= 1) + ft_putstr(argv[0]); + write(1, "\n", 1); + return (0); +} diff --git a/c06/ex01/ft_print_params.c b/c06/ex01/ft_print_params.c new file mode 100644 index 0000000..ea2f18a --- /dev/null +++ b/c06/ex01/ft_print_params.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_print_params.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/12 16:42:13 by whaffman #+# #+# */ +/* Updated: 2024/06/12 19:38:55 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putstr(char *str) +{ + while (*str != '\0') + { + write(1, str, 1); + str++; + } +} + +int main(int argc, char **argv) +{ + int i; + + i = 1; + if (argc > 1) + { + while (i < argc) + { + ft_putstr(argv[i++]); + ft_putstr("\n"); + } + } + return (0); +} diff --git a/c06/ex02/ft_rev_params.c b/c06/ex02/ft_rev_params.c new file mode 100644 index 0000000..b7cc4c0 --- /dev/null +++ b/c06/ex02/ft_rev_params.c @@ -0,0 +1,38 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_rev_params.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/12 16:42:13 by whaffman #+# #+# */ +/* Updated: 2024/06/12 19:38:27 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putstr(char *str) +{ + while (*str != '\0') + { + write(1, str, 1); + str++; + } +} + +int main(int argc, char **argv) +{ + int i; + + if (argc > 1) + { + i = argc - 1; + while (i > 0) + { + ft_putstr(argv[i--]); + ft_putstr("\n"); + } + } + return (0); +} diff --git a/c06/ex03/ft_sort_params.c b/c06/ex03/ft_sort_params.c new file mode 100644 index 0000000..13e3b84 --- /dev/null +++ b/c06/ex03/ft_sort_params.c @@ -0,0 +1,80 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sort_params.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/12 19:04:43 by whaffman #+# #+# */ +/* Updated: 2024/06/16 16:58:42 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putstr(char *str) +{ + while (*str != '\0') + { + write(1, str, 1); + str++; + } +} + +void ft_swap(char **a, char **b) +{ + char *temp; + + temp = *a; + *a = *b; + *b = temp; +} + +int ft_strcmp(char *s1, char *s2) +{ + while (*s1 && *s1 == *s2) + { + s1++; + s2++; + } + return (*s1 - *s2); +} + +void ft_sort_strings(char **strings, int size) +{ + int i; + int swapped; + + swapped = 1; + while (swapped == 1) + { + swapped = 0; + i = 2; + while (i < size) + { + if (ft_strcmp(strings[i - 1], strings[i]) > 0) + { + swapped = 1; + ft_swap(&strings[i - 1], &strings[i]); + } + i++; + } + } +} + +int main(int argc, char **argv) +{ + int i; + + if (argc > 1) + { + ft_sort_strings(argv, argc); + i = 1; + while (i < argc) + { + ft_putstr(argv[i++]); + ft_putstr("\n"); + } + } + return (0); +} diff --git a/c07/ex00/ft_strdup.c b/c07/ex00/ft_strdup.c new file mode 100644 index 0000000..eb2e2da --- /dev/null +++ b/c07/ex00/ft_strdup.c @@ -0,0 +1,69 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strdup.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/13 16:46:42 by whaffman #+# #+# */ +/* Updated: 2024/06/17 09:55:19 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include + +int ft_strlen(char *str) +{ + int i; + + i = 0; + while (*str++) + i++; + return (i); +} + +char *ft_strncpy(char *dest, char *src, unsigned int n) +{ + unsigned int i; + + i = 0; + while (src[i] != '\0' && i < n) + { + dest[i] = src[i]; + i++; + } + while (i < n) + { + dest[i] = '\0'; + i++; + } + return (dest); +} + +char *ft_strdup(char *src) +{ + int str_size; + char *dest; + + str_size = ft_strlen(src) + 1; + dest = (char *) malloc(str_size * sizeof(char)); + if (dest) + ft_strncpy(dest, src, str_size); + return (dest); +} + +#ifdef DEBUG + +int main(void) +{ + char src[7]; + char *dest; + + ft_strncpy(&src[0], "hallo", 7); + dest = ft_strdup(&src[0]); + printf("%s: %s", &src[0], dest); +} + +#endif diff --git a/c07/ex01/ft_range.c b/c07/ex01/ft_range.c new file mode 100644 index 0000000..e72ca0c --- /dev/null +++ b/c07/ex01/ft_range.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_range.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/16 15:57:44 by whaffman #+# #+# */ +/* Updated: 2024/06/17 10:13:54 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int *ft_range(int min, int max) +{ + int *res; + int *ores; + + if (min >= max) + return ((void *) 0); + res = (int *) malloc((max - min) * sizeof(int)); + ores = res; + while (min < max) + { + *res = min; + res++; + min++; + } + return (ores); +} + +#ifdef DEBUG + +void test(int min, int max) +{ + int *range; + + range = ft_range(min, max); + if (!range) + { + printf("NULL POINTER\n"); + return ; + } + while (min < max) + { + printf("%d ", *range++); + min++; + } + printf("\n"); +} + +int main(void) +{ + test(-3, 3); + test(0, 10); + test(-10, 2); + test(3, -3); + test(3, 3); + return (0); +} + +#endif diff --git a/c07/ex02/ft_ultimate_range.c b/c07/ex02/ft_ultimate_range.c new file mode 100644 index 0000000..9bd6a3f --- /dev/null +++ b/c07/ex02/ft_ultimate_range.c @@ -0,0 +1,70 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_ultimate_range.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/16 16:26:42 by whaffman #+# #+# */ +/* Updated: 2024/06/19 11:56:32 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int ft_ultimate_range(int **range, int min, int max) +{ + int i; + + i = 0; + if (min >= max) + { + *range = (void *) 0; + return (0); + } + *range = (int *) malloc((max - min) * sizeof(int)); + if (!*range) + return (-1); + while (min < max) + { + (*range)[i] = min; + i++; + min++; + } + return (i); +} + +#ifdef DEBUG + +void test(int min, int max) +{ + int *range; + + range = 0; + ft_ultimate_range(&range, min, max); + if (!range) + { + printf("NULL POINTER\n"); + return ; + } + while (min < max) + { + printf("%d ", *range); + range++; + min++; + } + printf("\n"); +} + +int main(void) +{ + test(-3, 3); + test(0, 10); + test(-10, 2); + test(3, -3); + test(3, 3); + return (0); +} + +#endif diff --git a/c07/ex03/ft_strjoin.c b/c07/ex03/ft_strjoin.c new file mode 100644 index 0000000..20f01fd --- /dev/null +++ b/c07/ex03/ft_strjoin.c @@ -0,0 +1,94 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strjoin.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/17 10:17:32 by whaffman #+# #+# */ +/* Updated: 2024/06/20 13:57:12 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include + +char *ft_strcat(char *dest, char *src) +{ + char *odest; + + odest = dest; + while (*dest) + dest++; + while (*src) + *dest++ = *src++; + *dest = '\0'; + return (odest); +} + +int ft_strlen(char *str) +{ + int i; + + i = 0; + while (str[i]) + i++; + return (i); +} + +int ft_strjoin_len(int size, char **strs, char *sep) +{ + int result; + int i; + + i = 0; + result = 0; + if (size <= 0) + return (0); + while (i < size) + { + result += ft_strlen(strs[i]); + i++; + } + result += (size - 1) * ft_strlen(sep); + return (result); +} + +char *ft_strjoin(int size, char **strs, char *sep) +{ + char *result; + int length; + int i; + + i = 0; + length = ft_strjoin_len(size, strs, sep) + 1; + result = (char *) malloc(length * sizeof(char)); + if (!result) + return ((void *) 0); + *result = '\0'; + while (i < size) + { + ft_strcat(result, strs[i]); + if (i != size - 1 && ft_strlen(sep) > 0) + ft_strcat(result, sep); + i++; + } + return (result); +} +/* +int main(void) +{ + char *strs[3]; + char str1[] = "HAllo"; + char str2[] = ""; + char str3[] = "mwaah"; + char sep[] = ", "; + + strs[0] = &str1[0]; + strs[1] = &str2[0]; + strs[2] = &str3[0]; + printf("%s", ft_strjoin(0, strs, sep)); + printf("DONE!"); +} +*/ diff --git a/c07/ex04/ft_convert_base.c b/c07/ex04/ft_convert_base.c new file mode 100644 index 0000000..7c65a8b --- /dev/null +++ b/c07/ex04/ft_convert_base.c @@ -0,0 +1,53 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_convert_base.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/17 13:54:50 by whaffman #+# #+# */ +/* Updated: 2024/06/19 20:36:11 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ +#include +#include + +void ft_putnbr_base(int nbr, char *base, char *result); +int ft_atoi_base(char *str, char *base); +int ft_isbase(char *base); + +char *ft_convert_base(char *nbr, char *base_from, char *base_to) +{ + int i; + char *result; + + if (ft_isbase(base_from) > 1 && ft_isbase(base_to) > 1) + { + result = (char *) malloc(33 * sizeof(char)); + if (result) + { + *result = '\0'; + i = ft_atoi_base(nbr, base_from); + ft_putnbr_base(i, base_to, result); + } + } + else + { + result = (void *) 0; + } + return (result); +} + +#ifdef DEBUG + +int main(void) +{ + char *result; + + result = (void *) 0; + result = ft_convert_base("-21474836489", "0123456789", "0123456789ABCDEF"); + printf("%s", result); + free(result); +} + +#endif diff --git a/c07/ex04/ft_convert_base2.c b/c07/ex04/ft_convert_base2.c new file mode 100644 index 0000000..c90007e --- /dev/null +++ b/c07/ex04/ft_convert_base2.c @@ -0,0 +1,115 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_convert_base2.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/17 17:26:04 by whaffman #+# #+# */ +/* Updated: 2024/06/19 18:51:15 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include +#include + +int ft_isbase(char *str) +{ + int i; + int n; + + n = 0; + while (str[n]) + { + i = 1; + if (str[n] == '-' || str[n] == '+') + return (0); + while (str[n + i]) + { + if (str[n] == str[n + i]) + return (0); + i++; + } + n++; + } + return (n); +} + +int ft_indexof(char c, char *str) +{ + int result; + + result = 0; + while (str[result]) + { + if (str[result] == c) + return (result); + result++; + } + return (-1); +} + +int ft_atoi_base(char *str, char *base) +{ + int sign; + int res; + int b; + + b = ft_isbase(base); + while (ft_indexof(*str, " \f\n\r\t\v") >= 0) + str++; + res = 0; + sign = 1; + while (*str == '-' || *str == '+') + { + if (*str == '-') + sign *= -1; + str++; + } + while (ft_indexof(*str, base) >= 0) + res = b * res + ft_indexof(*str++, base); + return (sign * res); +} + +void ft_write_str(char c, char *str) +{ + int i; + + i = 0; + while (str[i]) + { + i++; + } + str[i++] = c; + str[i] = '\0'; +} + +void ft_putnbr_base(int nbr, char *base, char *result) +{ + int b; + + b = ft_isbase(base); + if (b < 2) + return ; + if (nbr >= 0 && nbr < b) + { + ft_write_str(base[nbr], result); + } + else if (nbr < 0) + { + ft_write_str('-', result); + if (nbr > -b) + ft_putnbr_base(-nbr, base, result); + else + { + ft_putnbr_base(nbr / (-b), base, result); + ft_putnbr_base(-(nbr % b), base, result); + } + } + else if (nbr >= b) + { + ft_putnbr_base(nbr / b, base, result); + ft_putnbr_base(nbr % b, base, result); + } +} diff --git a/c07/ex05/ft_split.c b/c07/ex05/ft_split.c new file mode 100644 index 0000000..4d59093 --- /dev/null +++ b/c07/ex05/ft_split.c @@ -0,0 +1,126 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_split.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/18 10:44:32 by whaffman #+# #+# */ +/* Updated: 2024/06/19 14:46:27 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +/* +...Halooo dit is een zin, met woorden erin. +^ ^ ^ +f->f---->b + ^^ ^ + ff->b +*/ + +#define WORD 1 +#define SEP 0 +#include +#include + +char **ft_split(char *str, char *charset); +char *ptr_skip(int word, char *str, char *sep); +int count_words(char *str, char *sep); +int is_sep(char c, char *sep); + +int is_sep(char c, char *sep) +{ + while (*sep) + { + if (c == *sep) + return (1); + sep++; + } + return (0); +} + +int count_words(char *str, char *sep) +{ + int i; + int count; + + i = 0; + count = 0; + str = ptr_skip(SEP, str, sep); + while (str[i]) + { + if (!is_sep(str[i], sep) \ + && (is_sep(str[i + 1], sep) \ + || str[i + 1] == '\0')) + count++; + i++; + } + return (count); +} + +char *ptr_skip(int word, char *str, char *sep) +{ + while (*str && word ^ is_sep(*str, sep)) + str++; + return (str); +} + +unsigned int ft_strlcpy(char *dest, char *src, unsigned int n) +{ + unsigned int i; + + i = 0; + while (src[i] && i + 1 < n) + { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; + return (i); +} + +char **ft_split(char *str, char *charset) +{ + int n_words; + char **result; + char *end; + char *word; + int i; + + str = ptr_skip(SEP, str, charset); + n_words = count_words(str, charset); + result = (char **) malloc((n_words + 1) * sizeof(char *)); + i = 0; + result[0] = 0; + if (!*str) + return (result); + while (i < n_words) + { + end = ptr_skip(WORD, str, charset); + word = (char *) malloc((end - str + 1) * sizeof(char)); + ft_strlcpy(word, str, (end - str + 1)); + word[end - str] = '\0'; + result[i] = word; + str = ptr_skip(SEP, end, charset); + i++; + } + result[i] = 0; + return (result); +} +/* +#ifdef DEBUG + +int main(void) +{ + char **segments; + segments = ft_split("", ""); + while (*segments) + { + printf("%s\n", *segments); + segments++; + } + printf("%p",*segments); +} + +#endif +*/ diff --git a/c08/ex00/ft.h b/c08/ex00/ft.h new file mode 100644 index 0000000..1ce20c3 --- /dev/null +++ b/c08/ex00/ft.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/17 17:54:33 by whaffman #+# #+# */ +/* Updated: 2024/06/17 17:56:53 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_H +# define FT_H + +void ft_putchar(char c); +void ft_swap(int *a, int *b); +void ft_putstr(char *str); +int ft_strlen(char *str); +int ft_strcmp(char *s1, char *s2); + +#endif diff --git a/c08/ex01/ft_boolean.h b/c08/ex01/ft_boolean.h new file mode 100644 index 0000000..4007dd9 --- /dev/null +++ b/c08/ex01/ft_boolean.h @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_boolean.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/17 17:58:03 by whaffman #+# #+# */ +/* Updated: 2024/06/22 11:41:28 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_BOOLEAN_H +# define FT_BOOLEAN_H + +# include +# define TRUE 1 +# define FALSE 0 +# define EVEN(nbr) ((nbr) % 2 == 0) +# define EVEN_MSG "I have an even number of arguments.\n" +# define ODD_MSG "I have an odd number of arguments.\n" +# define SUCCESS 0 + +typedef char t_bool; + +#endif diff --git a/c08/ex02/ft_abs.h b/c08/ex02/ft_abs.h new file mode 100644 index 0000000..4bce307 --- /dev/null +++ b/c08/ex02/ft_abs.h @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_abs.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/17 18:06:09 by whaffman #+# #+# */ +/* Updated: 2024/06/20 14:05:34 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_ABS_H +# define FT_ABS_H + +# define ABS(value) (((value) >= 0) * (value) - ((value) < 0) * (value)) + +#endif diff --git a/c08/ex03/ft_point.h b/c08/ex03/ft_point.h new file mode 100644 index 0000000..8dc11f2 --- /dev/null +++ b/c08/ex03/ft_point.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_point.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/17 18:11:18 by whaffman #+# #+# */ +/* Updated: 2024/06/22 11:43:35 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_POINT_H +# define FT_POINT_H + +typedef struct s_point +{ + int x; + int y; +} t_point; + +#endif diff --git a/c08/ex04/ft_strs_to_tab.c b/c08/ex04/ft_strs_to_tab.c new file mode 100644 index 0000000..d59852f --- /dev/null +++ b/c08/ex04/ft_strs_to_tab.c @@ -0,0 +1,85 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_strs_to_tab.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/19 15:04:35 by whaffman #+# #+# */ +/* Updated: 2024/06/22 14:43:23 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include "ft_stock_str.h" + +int ft_strlen(char *str) +{ + int i; + + i = 0; + while (*str++) + i++; + return (i); +} + +char *ft_strncpy(char *dest, char *src, unsigned int n) +{ + unsigned int i; + + i = 0; + while (src[i] != '\0' && i < n) + { + dest[i] = src[i]; + i++; + } + while (i < n) + { + dest[i] = '\0'; + i++; + } + return (dest); +} + +char *ft_strdup(char *src) +{ + int str_size; + char *dest; + + str_size = ft_strlen(src) + 1; + dest = (char *) malloc(str_size * sizeof(char)); + if (dest) + ft_strncpy(dest, src, str_size); + return (dest); +} + +struct s_stock_str *ft_strs_to_tab(int ac, char **av) +{ + int i; + t_stock_str *result; + + result = (t_stock_str *) malloc ((ac + 1) * sizeof(t_stock_str)); + if (!result) + return ((void *) 0); + i = 0; + while (i < ac) + { + result[i].size = ft_strlen(av[i]); + result[i].str = av[i]; + result[i].copy = ft_strdup(av[i]); + i++; + } + result[i].str = 0; + return (result); +} + +#ifdef DEBUG + +int main(int argc, char **argv) +{ + struct s_stock_str *a; + + a = ft_strs_to_tab(argc, argv); +} + +#endif diff --git a/c08/ex05/ft_show_tab.c b/c08/ex05/ft_show_tab.c new file mode 100644 index 0000000..4681308 --- /dev/null +++ b/c08/ex05/ft_show_tab.c @@ -0,0 +1,64 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_show_tab.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/20 17:02:05 by whaffman #+# #+# */ +/* Updated: 2024/06/22 11:47:30 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include "ft_stock_str.h" + +void ft_putnbr(int nb) +{ + char c; + + if (-2147483648 == nb) + { + write(1, "-2147483648", 11); + } + else if (nb >= 0 && nb <= 9) + { + c = nb + '0'; + write(1, &c, 1); + } + else if (nb < 0) + { + write(1, "-", 1); + ft_putnbr(-nb); + } + else if (nb > 9) + { + ft_putnbr(nb / 10); + ft_putnbr(nb % 10); + } +} + +void ft_putstr(char *str) +{ + int i; + + i = 0; + while (str[i]) + { + i++; + } + write(1, str, i); + write(1, "\n", 1); +} + +void ft_show_tab(struct s_stock_str *par) +{ + while (par->str) + { + ft_putstr(par->str); + ft_putnbr(par->size); + write(1, "\n", 1); + ft_putstr(par->copy); + par++; + } +} diff --git a/c11/ex00/ft_foreach.c b/c11/ex00/ft_foreach.c new file mode 100644 index 0000000..26dac15 --- /dev/null +++ b/c11/ex00/ft_foreach.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_foreach.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 10:34:34 by whaffman #+# #+# */ +/* Updated: 2024/06/23 10:39:33 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void ft_foreach(int *tab, int length, void(*f)(int)) +{ + int i; + + i = 0; + while (i < n) + { + tab[i] = f(tab[i]); + i++; + } +} diff --git a/c11/ex01/ft_map.c b/c11/ex01/ft_map.c new file mode 100644 index 0000000..8b26c95 --- /dev/null +++ b/c11/ex01/ft_map.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_map.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 10:39:56 by whaffman #+# #+# */ +/* Updated: 2024/06/23 10:49:46 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int *ft_map(int *tab, int length, int(*f)(int)) +{ + int i; + int *result; + + i = 0; + result = (int *) malloc(length * sizeof(int *)); + if(result) + { + while (i < n) + { + result[i] = f(tab[i]); + } + } + return (result); +} diff --git a/c11/ex02/ft_any.c b/c11/ex02/ft_any.c new file mode 100644 index 0000000..c67b14c --- /dev/null +++ b/c11/ex02/ft_any.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_any.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 10:51:03 by whaffman #+# #+# */ +/* Updated: 2024/06/23 12:27:02 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int ft_any(char **tab, int(*f)(char*)) +{ + while (*tab) + { + if (f(*tab) + return (1); + tab++; + } + return (0); +} diff --git a/c11/ex03/ft_count_if.c b/c11/ex03/ft_count_if.c new file mode 100644 index 0000000..4fdb7a0 --- /dev/null +++ b/c11/ex03/ft_count_if.c @@ -0,0 +1,27 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_count_if.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 12:27:41 by whaffman #+# #+# */ +/* Updated: 2024/06/23 12:34:51 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_count_if(char **tab, int length, int(*f)(char*)) +{ + int count; + int i; + + count = 0; + i = 0; + while (i < n) + { + if (f(tab[i])) + count++; + i++; + } + return (count); +} diff --git a/c11/ex04/ft_is_sort.c b/c11/ex04/ft_is_sort.c new file mode 100644 index 0000000..5bb62d1 --- /dev/null +++ b/c11/ex04/ft_is_sort.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_is_sort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 12:37:52 by whaffman #+# #+# */ +/* Updated: 2024/06/23 12:41:03 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int ft_is_sort(int *tab, int length, int(*f)(int, int)) +{ + int i; + + i = 0; + while (i < n - 1) + { + if (f(tab[i], tab[i + 1]) > 0) + return (0); + i++; + } + return (1); +} diff --git a/c11/ex05/do-op.c b/c11/ex05/do-op.c new file mode 100644 index 0000000..b037d9d --- /dev/null +++ b/c11/ex05/do-op.c @@ -0,0 +1,16 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* do-op.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 14:03:17 by whaffman #+# #+# */ +/* Updated: 2024/06/23 14:28:46 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ops.h" +#include + + diff --git a/c11/ex05/ops.c b/c11/ex05/ops.c new file mode 100644 index 0000000..ecf15ad --- /dev/null +++ b/c11/ex05/ops.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ops.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 13:50:51 by whaffman #+# #+# */ +/* Updated: 2024/06/23 14:01:09 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +int add(int a, int b) +{ + return (a + b); +} + +int sub(int a, int b) +{ + return (a - b); +} + +int mul(int a, int b) +{ + return (a * b); +} + +int div(int a, int b) +{ + return (a / b); +} + +int mod(int a, int b) +{ + return (a % b); +} diff --git a/c11/ex05/ops.h b/c11/ex05/ops.h new file mode 100644 index 0000000..78a3d76 --- /dev/null +++ b/c11/ex05/ops.h @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ops.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/23 13:50:51 by whaffman #+# #+# */ +/* Updated: 2024/06/23 14:03:11 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef OPS_H +# define OPS_H + +int add(int a, int b); +int sub(int a, int b); +int mul(int a, int b); +int div(int a, int b); +int mod(int a, int b); + +#endif diff --git a/c12/ex00/ft_create_elem.c b/c12/ex00/ft_create_elem.c new file mode 100644 index 0000000..8e7c954 --- /dev/null +++ b/c12/ex00/ft_create_elem.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_create_elem.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 14:00:22 by whaffman #+# #+# */ +/* Updated: 2024/07/03 14:29:34 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +t_list *ft_create_elem(void *data) +{ + t_list *node; + + node = malloc(sizeof(t_list)); + if (node) + { + node->data = data; + node->next = NULL; + } + return (node); +} diff --git a/c12/ex01/ft_list_push_front.c b/c12/ex01/ft_list_push_front.c new file mode 100644 index 0000000..d6840c4 --- /dev/null +++ b/c12/ex01/ft_list_push_front.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_push_front.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 14:01:08 by whaffman #+# #+# */ +/* Updated: 2024/07/03 14:47:44 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_push_front(t_list **begin_list, void *data) +{ + t_list *new_node; + + new_node = ft_create_elem(data); + if (new_node) + { + new_node->next = *begin_list; + *begin_list = new_node; + } +} diff --git a/c12/ex02/ft_list_size.c b/c12/ex02/ft_list_size.c new file mode 100644 index 0000000..1f34582 --- /dev/null +++ b/c12/ex02/ft_list_size.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_size.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 14:01:33 by whaffman #+# #+# */ +/* Updated: 2024/07/03 14:49:28 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +int ft_list_size(t_list *begin_list) +{ + int count; + + count = 1; + if (!begin_list) + return (0); + while (begin_list->next) + { + begin_list = begin_list->next; + count++; + } + return (count); +} diff --git a/c12/ex03/ft_list_last.c b/c12/ex03/ft_list_last.c new file mode 100644 index 0000000..7814a33 --- /dev/null +++ b/c12/ex03/ft_list_last.c @@ -0,0 +1,20 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_last.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 14:00:40 by whaffman #+# #+# */ +/* Updated: 2024/07/03 14:00:47 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +t_list *ft_list_last(t_list *begin_list) +{ + while (begin_list->next) + begin_list = begin_list->next; + return (begin_list); +} diff --git a/c12/ex04/ft_list_push_back.c b/c12/ex04/ft_list_push_back.c new file mode 100644 index 0000000..2bc04e1 --- /dev/null +++ b/c12/ex04/ft_list_push_back.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_push_back.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 14:00:51 by whaffman #+# #+# */ +/* Updated: 2024/07/03 14:04:30 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_push_back(t_list **begin_list, void *data) +{ + t_list *new_node; + t_list *last_node; + + last_node = *begin_list; + while (last_node->next) + last_node = last_node->next; + new_node = ft_create_elem(data); + if (new_node) + last_node->next = new_node; +} diff --git a/c12/ex05/ft_list_push_strs.c b/c12/ex05/ft_list_push_strs.c new file mode 100644 index 0000000..7ae769b --- /dev/null +++ b/c12/ex05/ft_list_push_strs.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_push_strs.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 14:01:25 by whaffman #+# #+# */ +/* Updated: 2024/07/03 14:49:10 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +t_list *ft_list_push_strs(int size, char **strs) +{ + int i; + t_list *prev; + t_list *node; + + i = 0; + prev = NULL; + while (i < size) + { + node = ft_create_elem(strs[i]); + node->next = prev; + prev = node; + i++; + } + return (node); +} diff --git a/c12/ex06/ft_list_clear.c b/c12/ex06/ft_list_clear.c new file mode 100644 index 0000000..6215cc0 --- /dev/null +++ b/c12/ex06/ft_list_clear.c @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_clear.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 15:08:22 by whaffman #+# #+# */ +/* Updated: 2024/07/03 15:14:59 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_clear(t_list *begin_list, void (*free_fct)(void *)) +{ + t_list *next; + + while (begin_list) + { + free_fct(begin_list->data); + next = begin_list->next; + free(begin_list); + begin_list = next; + } +} diff --git a/c12/ex07/ft_list_at.c b/c12/ex07/ft_list_at.c new file mode 100644 index 0000000..d3ab2d3 --- /dev/null +++ b/c12/ex07/ft_list_at.c @@ -0,0 +1,25 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_at.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 15:15:29 by whaffman #+# #+# */ +/* Updated: 2024/07/03 17:46:26 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +t_list *ft_list_at(t_list *begin_list, unsigned int nbr) +{ + while (nbr > 0) + { + begin_list = begin_list->next; + if (!begin_list) + return (NULL); + nbr--; + } + return (begin_list); +} diff --git a/c12/ex08/ft_list_reverse.c b/c12/ex08/ft_list_reverse.c new file mode 100644 index 0000000..6d4e6f8 --- /dev/null +++ b/c12/ex08/ft_list_reverse.c @@ -0,0 +1,31 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_reverse.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 15:22:55 by whaffman #+# #+# */ +/* Updated: 2024/07/03 17:38:50 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_reverse(t_list **begin_list) +{ + t_list *prev; + t_list *curr; + t_list *next; + + curr = *begin_list; + prev = NULL; + while (curr) + { + next = curr->next; + curr->next = prev; + prev = curr; + curr = next; + } + *begin_list = prev; +} diff --git a/c12/ex09/ft_list_foreach.c b/c12/ex09/ft_list_foreach.c new file mode 100644 index 0000000..d5c6902 --- /dev/null +++ b/c12/ex09/ft_list_foreach.c @@ -0,0 +1,22 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_foreach.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 15:39:22 by whaffman #+# #+# */ +/* Updated: 2024/07/03 15:43:05 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_foreach(t_list *begin_list, void (*f)(void *)) +{ + while (begin_list) + { + (*f)(begin_list->data); + begin_list = begin_list->next; + } +} diff --git a/c12/ex10/ft_list_foreach_if.c b/c12/ex10/ft_list_foreach_if.c new file mode 100644 index 0000000..c765a88 --- /dev/null +++ b/c12/ex10/ft_list_foreach_if.c @@ -0,0 +1,28 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_foreach_if.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 18:11:50 by whaffman #+# #+# */ +/* Updated: 2024/07/03 18:25:07 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_foreach_if( + t_list *begin_list, + void (*f)(void *), + void *data_ref, + int (*cmp)() + ) +{ + while (begin_list) + { + if (!cmp(begin_list->data, data_ref)) + f(begin_list->data); + begin_list = begin_list->next; + } +} diff --git a/c12/ex11/ft_list_find.c b/c12/ex11/ft_list_find.c new file mode 100644 index 0000000..7e52254 --- /dev/null +++ b/c12/ex11/ft_list_find.c @@ -0,0 +1,24 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_find.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 18:26:03 by whaffman #+# #+# */ +/* Updated: 2024/07/03 18:30:38 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +t_list *ft_list_find(t_list *begin_list, void *data_ref, int (*cmp)()) +{ + while (begin_list) + { + if (!cmp(begin_list->data, data_ref)) + return (begin_list); + begin_list = begin_list->next; + } + return (begin_list); +} diff --git a/c12/ex12/ft_list_remove_if.c b/c12/ex12/ft_list_remove_if.c new file mode 100644 index 0000000..ba2799c --- /dev/null +++ b/c12/ex12/ft_list_remove_if.c @@ -0,0 +1,43 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_remove_if.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 18:31:10 by whaffman #+# #+# */ +/* Updated: 2024/07/03 18:56:38 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_remove_if( + t_list **begin_list, + void *data_ref, + int (*cmp)(), + void (*free_fct)(void *) + ) +{ + t_list *prev; + t_list *curr; + t_list *next; + + curr = *begin_list; + while (curr) + { + next = curr->next; + if (!cmp(curr->data, data_ref)) + { + if (curr == *begin_list) + *begin_list = next; + else + prev->next = next; + free_fct(curr->data); + free(curr); + } + else + prev = curr; + curr = next; + } +} diff --git a/c12/ex13/ft_list_merge.c b/c12/ex13/ft_list_merge.c new file mode 100644 index 0000000..7cfc393 --- /dev/null +++ b/c12/ex13/ft_list_merge.c @@ -0,0 +1,30 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_merge.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 18:57:03 by whaffman #+# #+# */ +/* Updated: 2024/07/03 19:11:03 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_list_merge(t_list **begin_list1, t_list *begin_list2) +{ + t_list *curr; + + if (!begin_list2) + return ; + if (!*begin_list1) + { + *begin_list1 = begin_list2; + return ; + } + curr = *begin_list1; + while (curr->next) + curr = curr->next; + curr->next = begin_list2; +} diff --git a/c12/ex14/ft_list_sort.c b/c12/ex14/ft_list_sort.c new file mode 100644 index 0000000..79821e4 --- /dev/null +++ b/c12/ex14/ft_list_sort.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list_sort.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 19:27:13 by whaffman #+# #+# */ +/* Updated: 2024/07/04 18:15:21 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +t_list *ft_recursive_merge(t_list *l1, t_list *l2, int (*cmp)()) +{ + t_list *result; + + if (l1 == NULL) + return (l2); + else if (l2 == NULL) + return (l1); + if (cmp(l1->data, l2->data) <= 0) + { + result = l1; + result->next = ft_recursive_merge(l1->next, l2, cmp); + } + else + { + result = l2; + result->next = ft_recursive_merge(l1, l2->next, cmp); + } + return (result); +} + +void ft_split_list(t_list *list, t_list **first, t_list **second) +{ + t_list *slow; + t_list *fast; + + slow = list; + fast = list->next; + while (fast) + { + fast = fast->next; + if (fast) + { + fast = fast->next; + slow = slow->next; + } + } + *first = list; + *second = slow->next; + slow->next = NULL; +} + +void ft_list_sort(t_list **begin_list, int (*cmp)()) +{ + t_list *l1; + t_list *l2; + + if (!*begin_list || !(*begin_list)->next) + return ; + ft_split_list(*begin_list, &l1, &l2); + ft_list_sort(&l1, cmp); + ft_list_sort(&l2, cmp); + *begin_list = ft_recursive_merge(l1, l2, cmp); +} diff --git a/c12/ex15/ft_reverse_fun.c b/c12/ex15/ft_reverse_fun.c new file mode 100644 index 0000000..313f34f --- /dev/null +++ b/c12/ex15/ft_reverse_fun.c @@ -0,0 +1,68 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_reverse_fun.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/05 17:46:12 by whaffman #+# #+# */ +/* Updated: 2024/07/05 18:00:33 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +void ft_swap_ptr(void **ptr1, void **ptr2) +{ + void *temp; + + temp = *ptr1; + *ptr1 = *ptr2; + *ptr2 = temp; +} + +int ft_list_size(t_list *begin_list) +{ + int count; + + count = 1; + if (!begin_list) + return (0); + while (begin_list->next) + { + begin_list = begin_list->next; + count++; + } + return (count); +} + +t_list *ft_list_at(t_list *begin_list, unsigned int nbr) +{ + while (nbr > 0) + { + begin_list = begin_list->next; + if (!begin_list) + return (NULL); + nbr--; + } + return (begin_list); +} + +void ft_list_reverse_fun(t_list *begin_list) +{ + int front; + int back; + t_list *front_elem; + t_list *back_elem; + + front = 0; + back = ft_list_size(begin_list) - 1; + while (front < back) + { + front_elem = ft_list_at(begin_list, front); + back_elem = ft_list_at(begin_list, back); + ft_swap_ptr(&front_elem->data, &back_elem->data); + front++; + back--; + } +} diff --git a/c12/ex16/ft_sorted_list_insert.c b/c12/ex16/ft_sorted_list_insert.c new file mode 100644 index 0000000..94279de --- /dev/null +++ b/c12/ex16/ft_sorted_list_insert.c @@ -0,0 +1,55 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sorted_list_insert.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/05 01:08:15 by whaffman #+# #+# */ +/* Updated: 2024/07/05 01:18:06 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +/* + * I dont think it is a good idea to use a recursive function in a library, + * since it probably polutes the stack too much. + */ + +#include "ft_list.h" + +t_list *ft_recursive_merge(t_list *l1, t_list *l2, int (*cmp)()) +{ + t_list *result; + + if (l1 == NULL) + return (l2); + else if (l2 == NULL) + return (l1); + if (cmp(l1->data, l2->data) <= 0) + { + result = l1; + result->next = ft_recursive_merge(l1->next, l2, cmp); + } + else + { + result = l2; + result->next = ft_recursive_merge(l1, l2->next, cmp); + } + return (result); +} + +void ft_sorted_list_merge( + t_list **begin_list1, + t_list *begin_list2, + int (*cmp)()) +{ + *begin_list1 = ft_recursive_merge(*begin_list1, begin_list2, cmp); +} + +void ft_sorted_list_insert(t_list **begin_list, void *data, int (*cmp)()) +{ + t_list *new_node; + + new_node = ft_create_elem(data); + ft_sorted_list_merge(begin_list, new_node, cmp); +} diff --git a/c12/ex17/ft_sorted_list_merge.c b/c12/ex17/ft_sorted_list_merge.c new file mode 100644 index 0000000..fc24610 --- /dev/null +++ b/c12/ex17/ft_sorted_list_merge.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_sorted_list_merge.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/04 18:14:36 by whaffman #+# #+# */ +/* Updated: 2024/07/04 18:14:52 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "ft_list.h" + +t_list *ft_recursive_merge(t_list *l1, t_list *l2, int (*cmp)()) +{ + t_list *result; + + if (l1 == NULL) + return (l2); + else if (l2 == NULL) + return (l1); + if (cmp(l1->data, l2->data) <= 0) + { + result = l1; + result->next = ft_recursive_merge(l1->next, l2, cmp); + } + else + { + result = l2; + result->next = ft_recursive_merge(l1, l2->next, cmp); + } + return (result); +} + +void ft_sorted_list_merge( + t_list **begin_list1, + t_list *begin_list2, + int (*cmp)()) +{ + *begin_list1 = ft_recursive_merge(*begin_list1, begin_list2, cmp); +} diff --git a/c12/ft_list.h b/c12/ft_list.h new file mode 100644 index 0000000..f9c5ac4 --- /dev/null +++ b/c12/ft_list.h @@ -0,0 +1,26 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_list.h :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/07/03 14:00:34 by whaffman #+# #+# */ +/* Updated: 2024/07/03 14:26:57 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#ifndef FT_LIST_H +# define FT_LIST_H + +# include + +typedef struct s_list +{ + struct s_list *next; + void *data; +} t_list; + +t_list *ft_create_elem(void *data); + +#endif diff --git a/r00/ex00/ft_putchar.c b/r00/ex00/ft_putchar.c new file mode 100644 index 0000000..ca4c99c --- /dev/null +++ b/r00/ex00/ft_putchar.c @@ -0,0 +1,18 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_putchar.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/08 11:49:29 by whaffman #+# #+# */ +/* Updated: 2024/06/08 12:56:01 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void ft_putchar(char c) +{ + write(1, &c, 1); +} diff --git a/r00/ex00/main.c b/r00/ex00/main.c new file mode 100644 index 0000000..08a6d0a --- /dev/null +++ b/r00/ex00/main.c @@ -0,0 +1,23 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/08 11:54:25 by whaffman #+# #+# */ +/* Updated: 2024/06/09 11:39:00 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +void rush(int x, int y); + +int main(void) +{ + rush(5, 3); + rush(5, 1); + rush(1, 1); + rush(1, 5); + rush(4, 4); + return (0); +} diff --git a/r00/ex00/rush00.c b/r00/ex00/rush00.c new file mode 100644 index 0000000..2bd2a81 --- /dev/null +++ b/r00/ex00/rush00.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rush00.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/08 11:57:11 by whaffman #+# #+# */ +/* Updated: 2024/06/09 11:36:23 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#define UL 'o' +#define UR 'o' +#define LL 'o' +#define LR 'o' +#define VW '|' +#define HW '-' + +void ft_putchar(char c); + +void rush_char(int x, int y, \ + int x_max, int y_max) +{ + if (x == 1 && y == 1) + ft_putchar(UL); + else if ((y == 1 || y == y_max) && x != 1 && x != x_max) + ft_putchar(HW); + else if (y == 1 && x == x_max) + ft_putchar(UR); + else if ((x == 1 || x == x_max) && y != 1 && y != y_max) + ft_putchar(VW); + else if (x == 1 && y == y_max) + ft_putchar(LL); + else if (x == x_max && y == y_max) + ft_putchar(LR); + else + ft_putchar(' '); +} + +void rush(int x_max, int y_max) +{ + int x; + int y; + + if (x_max > 0 && y_max > 0) + { + y = 1; + while (y <= y_max) + { + x = 1; + while (x <= x_max) + { + rush_char(x, y, x_max, y_max); + x++; + } + y++; + ft_putchar('\n'); + } + } +} diff --git a/r00/ex00/rush01.c b/r00/ex00/rush01.c new file mode 100644 index 0000000..c42db2e --- /dev/null +++ b/r00/ex00/rush01.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rush01.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/08 11:57:11 by whaffman #+# #+# */ +/* Updated: 2024/06/09 11:37:21 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#define UL '/' +#define UR '\\' +#define LL '\\' +#define LR '/' +#define VW '*' +#define HW '*' + +void ft_putchar(char c); + +void rush_char(int x, int y, \ + int x_max, int y_max) +{ + if (x == 1 && y == 1) + ft_putchar(UL); + else if ((y == 1 || y == y_max) && x != 1 && x != x_max) + ft_putchar(HW); + else if (y == 1 && x == x_max) + ft_putchar(UR); + else if ((x == 1 || x == x_max) && y != 1 && y != y_max) + ft_putchar(VW); + else if (x == 1 && y == y_max) + ft_putchar(LL); + else if (x == x_max && y == y_max) + ft_putchar(LR); + else + ft_putchar(' '); +} + +void rush(int x_max, int y_max) +{ + int x; + int y; + + if (x_max > 0 && y_max > 0) + { + y = 1; + while (y <= y_max) + { + x = 1; + while (x <= x_max) + { + rush_char(x, y, x_max, y_max); + x++; + } + y++; + ft_putchar('\n'); + } + } +} diff --git a/r00/ex00/rush02.c b/r00/ex00/rush02.c new file mode 100644 index 0000000..50dc596 --- /dev/null +++ b/r00/ex00/rush02.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rush02.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/08 11:57:11 by whaffman #+# #+# */ +/* Updated: 2024/06/09 11:37:35 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#define UL 'A' +#define UR 'A' +#define LL 'C' +#define LR 'C' +#define VW 'B' +#define HW 'B' + +void ft_putchar(char c); + +void rush_char(int x, int y, \ + int x_max, int y_max) +{ + if (x == 1 && y == 1) + ft_putchar(UL); + else if ((y == 1 || y == y_max) && x != 1 && x != x_max) + ft_putchar(HW); + else if (y == 1 && x == x_max) + ft_putchar(UR); + else if ((x == 1 || x == x_max) && y != 1 && y != y_max) + ft_putchar(VW); + else if (x == 1 && y == y_max) + ft_putchar(LL); + else if (x == x_max && y == y_max) + ft_putchar(LR); + else + ft_putchar(' '); +} + +void rush(int x_max, int y_max) +{ + int x; + int y; + + if (x_max > 0 && y_max > 0) + { + y = 1; + while (y <= y_max) + { + x = 1; + while (x <= x_max) + { + rush_char(x, y, x_max, y_max); + x++; + } + y++; + ft_putchar('\n'); + } + } +} diff --git a/r00/ex00/rush03.c b/r00/ex00/rush03.c new file mode 100644 index 0000000..56e52e0 --- /dev/null +++ b/r00/ex00/rush03.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rush03.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/08 11:57:11 by whaffman #+# #+# */ +/* Updated: 2024/06/09 11:37:48 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#define UL 'A' +#define UR 'C' +#define LL 'A' +#define LR 'C' +#define VW 'B' +#define HW 'B' + +void ft_putchar(char c); + +void rush_char(int x, int y, \ + int x_max, int y_max) +{ + if (x == 1 && y == 1) + ft_putchar(UL); + else if ((y == 1 || y == y_max) && x != 1 && x != x_max) + ft_putchar(HW); + else if (y == 1 && x == x_max) + ft_putchar(UR); + else if ((x == 1 || x == x_max) && y != 1 && y != y_max) + ft_putchar(VW); + else if (x == 1 && y == y_max) + ft_putchar(LL); + else if (x == x_max && y == y_max) + ft_putchar(LR); + else + ft_putchar(' '); +} + +void rush(int x_max, int y_max) +{ + int x; + int y; + + if (x_max > 0 && y_max > 0) + { + y = 1; + while (y <= y_max) + { + x = 1; + while (x <= x_max) + { + rush_char(x, y, x_max, y_max); + x++; + } + y++; + ft_putchar('\n'); + } + } +} diff --git a/r00/ex00/rush04.c b/r00/ex00/rush04.c new file mode 100644 index 0000000..b048943 --- /dev/null +++ b/r00/ex00/rush04.c @@ -0,0 +1,61 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* rush04.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/08 11:57:11 by whaffman #+# #+# */ +/* Updated: 2024/06/09 11:37:59 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#define UL 'A' +#define UR 'C' +#define LL 'C' +#define LR 'A' +#define VW 'B' +#define HW 'B' + +void ft_putchar(char c); + +void rush_char(int x, int y, \ + int x_max, int y_max) +{ + if (x == 1 && y == 1) + ft_putchar(UL); + else if ((y == 1 || y == y_max) && x != 1 && x != x_max) + ft_putchar(HW); + else if (y == 1 && x == x_max) + ft_putchar(UR); + else if ((x == 1 || x == x_max) && y != 1 && y != y_max) + ft_putchar(VW); + else if (x == 1 && y == y_max) + ft_putchar(LL); + else if (x == x_max && y == y_max) + ft_putchar(LR); + else + ft_putchar(' '); +} + +void rush(int x_max, int y_max) +{ + int x; + int y; + + if (x_max > 0 && y_max > 0) + { + y = 1; + while (y <= y_max) + { + x = 1; + while (x <= x_max) + { + rush_char(x, y, x_max, y_max); + x++; + } + y++; + ft_putchar('\n'); + } + } +} diff --git a/r01/ex00/main.c b/r01/ex00/main.c new file mode 100644 index 0000000..d41d36b --- /dev/null +++ b/r01/ex00/main.c @@ -0,0 +1,72 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* main.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/15 16:56:20 by whaffman #+# #+# */ +/* Updated: 2024/06/16 14:09:57 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include + +int **allocate_array(int r, int c); +int solve(int *cond, int **grid, int row); + +int char_to_int(char c) +{ + return (c - '0'); +} + +int ft_split_string(char *str, int *arguments, int n) +{ + int count; + + count = 0; + while (count < n) + { + if (*str >= '1' && *str <= '4') + { + arguments[count] = char_to_int(*str); + str ++; + count ++; + } + else + return (0); + if (count == n && *str == '\0') + return (1); + if (count == n && *str == ' ') + return (0); + if (*str == ' ') + str ++; + else + return (0); + } + return (1); +} + +//int cond[] = {3, 2, 1, 2, 1, 2, 2, 3, 3, 2, 2, 1, 2, 1, 2, 3}; +int main(int argc, char *argv[]) +{ + int **grid; + int conditions[16]; + + if (argc != 2) + { + write(1, "Error\n", 6); + return (0); + } + if (!ft_split_string(argv[1], &conditions[0], 16)) + { + write(1, "Error\n", 6); + return (0); + } + grid = allocate_array(4, 4); + if (!solve(&conditions[0], grid, 0)) + write(1, "Error\n", 6); + free(grid); + return (0); +} diff --git a/r01/ex00/solver.c b/r01/ex00/solver.c new file mode 100644 index 0000000..0742c6b --- /dev/null +++ b/r01/ex00/solver.c @@ -0,0 +1,98 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* solver.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/16 12:44:08 by whaffman #+# #+# */ +/* Updated: 2024/06/16 13:52:11 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +int **make_the_array(void); +int exists_in_array(int *row); +void display_grid(int **grid); +int find_candidate(int front_view, int reverse_view, int index); + +void add_to_grid(int **grid, int solution_id, int row) +{ + int column; + int **the_array; + + column = 0; + the_array = make_the_array(); + while (column < 4) + { + grid[row][column] = the_array[solution_id][column + 2]; + column++; + } + free(the_array); +} + +void remove_from_grid(int **grid, int row) +{ + int column; + + column = 0; + while (column < 4) + { + grid[row][column] = 0; + column++; + } +} + +int check_grid(int *cond, int **grid) +{ + int column_index; + int column[6]; + int row; + + column_index = 0; + while (column_index < 4) + { + column[0] = cond[column_index]; + column[1] = cond[column_index + 4]; + row = 0; + while (row < 4) + { + column[2 + row] = grid[row][column_index]; + row++; + } + if (!exists_in_array(&column[0])) + return (0); + column_index++; + } + return (1); +} + +int solve(int *cond, int **grid, int row) +{ + int f_view; + int r_view; + int i; + int solved; + + solved = 0; + if (row == 4 && check_grid(cond, grid)) + { + display_grid(grid); + return (1); + } + else + { + f_view = cond[8 + row]; + r_view = cond[12 + row]; + i = 0; + while (find_candidate(f_view, r_view, i) >= 0 && !solved) + { + add_to_grid(grid, find_candidate(f_view, r_view, i), row); + solved = solve(cond, grid, row + 1); + remove_from_grid(grid, row); + i++; + } + return (solved); + } +} diff --git a/r01/ex00/the_array.c b/r01/ex00/the_array.c new file mode 100644 index 0000000..6444b84 --- /dev/null +++ b/r01/ex00/the_array.c @@ -0,0 +1,122 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* the_array.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/15 16:37:33 by whaffman #+# #+# */ +/* Updated: 2024/06/16 13:53:41 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +/* +“Vogon poetry is of course, the third worst in the universe. +The second worst is that of the Azgoths of Kria. During a recitation by their +poet master Grunthos the Flatulent of his poem "Ode to a Small Lump of Green +Putty I Found in My Armpit One Midsummer Morning" four of his audience died +of internal haemorrhaging and the president of the Mid-Galactic Arts Nobbling +Council survived by gnawing one of his own legs off. Grunthos was reported +to have been "disappointed" by the poem's reception, and was about to embark +on a reading of his 12-book epic entitled "My Favourite Bathtime Gurgles" +when his own major intestine, in a desperate attempt to save humanity, leapt +straight up through his neck and throttled his brain. +The very worst poetry of all perished along with its creator, +Paul Neil Milne Johnstone of Redbridge, in the destruction of the planet Earth. +Vogon poetry is mild by comparison.” + +*/ +#include + +int **allocate_array(int r, int c) +{ + int **arr; + int i; + + i = 0; + arr = (int **) malloc(r * sizeof(int *)); + while (i < r) + { + arr[i] = (int *) malloc(c * sizeof(int)); + i++; + } + return (arr); +} + +int **make_the_array(void) +{ + int **the_array; + int i; + int j; + const int the_ugly_one[144] = {4, 1, 1, 2, 3, 4, 3, 1, 2, 1, 3, 4, 2, 1, \ + 3, 1, 2, 4, 3, 1, 1, 3, 2, 4, 3, 1, 2, 3, 1, 4, 2, 1, 3, 2, 1, 4, 2, 2, 3, \ + 2, 4, 1, 3, 2, 2, 3, 4, 1, 1, 4, 4, 3, 2, 1, 2, 3, 3, 4, 2, 1, 2, 3, 2, 4, \ + 3, 1, 1, 3, 4, 2, 3, 1, 1, 3, 4, 1, 3, 2, 2, 3, 1, 4, 3, 2, 2, 2, 3, 4, 1, \ + 2, 1, 3, 4, 3, 1, 2, 3, 2, 1, 3, 4, 2, 2, 2, 3, 1, 4, 2, 2, 2, 2, 1, 4, 3, \ + 3, 2, 1, 2, 4, 3, 1, 2, 4, 2, 1, 3, 2, 2, 2, 4, 1, 3, 2, 2, 1, 4, 2, 3, 1, \ + 2, 4, 1, 2, 3}; + + the_array = allocate_array(24, 6); + i = 0; + while (i < 24) + { + j = 0; + while (j < 6) + { + the_array[i][j] = the_ugly_one[6 * i + j]; + j++; + } + i++; + } + return (the_array); +} + +int find_candidate(int front_view, int reverse_view, int index) +{ + int i; + int **the_array; + + i = 0; + the_array = make_the_array(); + while (i < 24) + { + if (the_array[i][0] == front_view && the_array[i][1] == reverse_view) + { + if (index == 0) + { + free(the_array); + return (i); + } + index--; + } + i++; + } + free(the_array); + return (-1); +} + +int exists_in_array(int *row) +{ + int y; + int x; + int **the_array; + + the_array = make_the_array(); + y = 0; + while (y < 24) + { + x = 0; + while (the_array[y][x] == row[x] && x < 6) + { + if (x == 5) + { + free(the_array); + return (1); + } + x++; + } + y++; + } + free(the_array); + return (0); +} diff --git a/r01/ex00/utils.c b/r01/ex00/utils.c new file mode 100644 index 0000000..91506f4 --- /dev/null +++ b/r01/ex00/utils.c @@ -0,0 +1,42 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* utils.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: whaffman +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/06/16 12:43:53 by whaffman #+# #+# */ +/* Updated: 2024/06/16 13:32:55 by whaffman ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include + +void put_n(int n) +{ + char c; + + c = n + '0'; + write(1, &c, 1); +} + +void display_grid(int **grid) +{ + int x; + int y; + + y = 0; + while (y < 4) + { + x = 0; + while (x < 4) + { + put_n(grid[y][x]); + if (x < 3) + write(1, " ", 1); + x++; + } + write(1, "\n", 1); + y++; + } +}