From 3e999d9445d26c0cf02cba58fcde232465689114 Mon Sep 17 00:00:00 2001 From: varunu28 Date: Fri, 24 Aug 2018 10:07:38 -0700 Subject: [PATCH 001/120] Restructured the folder --- .gitignore | 3 +- ClosestPair/ClosestPair.java | 211 - ClosestPair/closest_data.txt | 12 - .../bin/HEncoder$Node$Nodecomparator.class | Bin 859 -> 0 bytes Compression/bin/HEncoder$Node.class | Bin 683 -> 0 bytes Compression/bin/HEncoder.class | Bin 3674 -> 0 bytes Compression/bin/compressclient.class | Bin 756 -> 0 bytes Compression/bin/genericheap.class | Bin 2858 -> 0 bytes Compression/src/HEncoder.java | 108 - Compression/src/compressclient.java | 11 - Compression/src/genericheap.java | 93 - Conversions/AnyBaseToAnyBase.java | 130 - Conversions/AnyBaseToDecimal.java | 59 - Conversions/AnytoAny.java | 29 - Conversions/BinaryToDecimal.java | 33 - Conversions/BinaryToHexadecimal.java | 57 - Conversions/BinaryToOctal.java | 43 - Conversions/DecimalToBinary.java | 57 - Conversions/DecimalToHexaDecimal.java | 30 - Conversions/DecimalToOctal.java | 33 - Conversions/HexToOct.java | 74 - Conversions/HexaDecimalToBinary.java | 37 - Conversions/HexaDecimalToDecimal.java | 42 - Conversions/OctalToBinary.java | 49 - Conversions/OctalToDecimal.java | 47 - Conversions/OctalToHexadecimal.java | 63 - DataStructures/Bags/Bag.java | 126 - DataStructures/Buffers/CircularBuffer.java | 124 - DataStructures/CSVFile/src/CSVFile.java | 692 - DataStructures/CSVFile/src/TestCSVFile.java | 133 - DataStructures/CSVFile/testData.csv | 25029 ---------------- DataStructures/CSVFile/testData2.csv | 3 - DataStructures/CSVFile/testData3.csv | 1 - DataStructures/CSVFile/testData4.csv | 7 - DataStructures/Graphs/BFS.java | 62 - DataStructures/Graphs/BellmanFord.java | 158 - DataStructures/Graphs/ConnectedComponent.java | 150 - DataStructures/Graphs/DFS.java | 63 - DataStructures/Graphs/FloydWarshall.java | 78 - DataStructures/Graphs/Graphs.java | 129 - DataStructures/Graphs/KruskalsAlgorithm.java | 174 - DataStructures/Graphs/MatrixGraphs.java | 145 - DataStructures/Graphs/PrimMST.java | 114 - DataStructures/HashMap/HashMap.java | 283 - DataStructures/HashMap/Hashing/HashMap.java | 39 - .../HashMap/Hashing/LinkedList.java | 62 - DataStructures/HashMap/Hashing/Main.java | 45 - DataStructures/HashMap/Hashing/Node.java | 9 - DataStructures/Heaps/EmptyHeapException.java | 18 - DataStructures/Heaps/Heap.java | 41 - DataStructures/Heaps/HeapElement.java | 132 - DataStructures/Heaps/MaxHeap.java | 115 - DataStructures/Heaps/MinHeap.java | 115 - DataStructures/Lists/CircleLinkedList.java | 54 - DataStructures/Lists/DoublyLinkedList.java | 214 - DataStructures/Lists/SinglyLinkedList.java | 151 - DataStructures/Matrix/Matrix.java | 259 - .../Queues/GenericArrayListQueue.java | 42 - DataStructures/Queues/PriorityQueues.java | 123 - DataStructures/Queues/Queues.java | 148 - DataStructures/Stacks/BalancedBrackets.java | 89 - DataStructures/Stacks/NodeStack.java | 183 - DataStructures/Stacks/StackOfLinkedList.java | 109 - DataStructures/Stacks/Stacks.java | 240 - DataStructures/Trees/AVLTree.java | 212 - DataStructures/Trees/BinaryTree.java | 268 - DataStructures/Trees/FindHeightOfTree.java | 100 - DataStructures/Trees/GenericTree.Java | 226 - DataStructures/Trees/LevelOrderTraversal.java | 78 - .../Trees/LevelOrderTraversalQueue.java | 62 - DataStructures/Trees/PrintTopViewofTree.java | 105 - DataStructures/Trees/RedBlackBST.java | 330 - DataStructures/Trees/TreeTraversal.java | 124 - DataStructures/Trees/TrieImp.java | 135 - DataStructures/Trees/ValidBSTOrNot.java | 62 - Dynamic Programming/CoinChange.java | 50 - Dynamic Programming/Edit_Distance.java | 89 - Dynamic Programming/EggDropping.java | 53 - Dynamic Programming/Fibonacci.java | 75 - Dynamic Programming/KadaneAlgorithm.java | 55 - Dynamic Programming/Knapsack.java | 38 - Dynamic Programming/LevenshteinDistance.java | 55 - .../LongestCommonSubsequence.java | 66 - .../LongestIncreasingSubsequence.java | 62 - Dynamic Programming/RodCutting.java | 32 - MinimizingLateness/MinimizingLateness.java | 52 - MinimizingLateness/data06_lateness.txt | 7 - Misc/PalindromicPrime.java | 41 - Misc/heap_sort.java | 73 - Others/Abecedarian.java | 17 - Others/Armstrong.java | 47 - Others/BrianKernighanAlgorithm.java | 55 - Others/CountChar.java | 43 - Others/Dijkshtra.java | 61 - Others/Factorial.java | 49 - Others/FibToN.java | 24 - Others/FloydTriangle.java | 17 - Others/GCD.java | 30 - Others/GuassLengendre.java | 44 - Others/Huffman.java | 158 - Others/InsertDeleteInArray.java | 46 - Others/KMP.java | 55 - Others/LinearCongruentialGenerator.java | 57 - Others/LowestBasePalindrome.java | 144 - Others/Node.java | 16 - Others/Palindrome.java | 26 - Others/PasswordGen.java | 45 - Others/PerlinNoise.java | 164 - Others/PowerOfTwoOrNot.java | 33 - Others/QueueUsingTwoStacks.java | 158 - Others/ReturnSubsequence.java | 59 - Others/ReverseStackUsingRecursion.java | 70 - Others/ReverseString.java | 46 - Others/RootPrecision.java | 33 - Others/SieveOfEratosthenes.java | 49 - Others/SkylineProblem.java | 131 - Others/StackPostfixNotation.java | 38 - Others/TopKWords.java | 84 - Others/TowerOfHanoiUsingRecursion.java | 26 - Others/countwords.java | 26 - Others/crc32.java | 27 - Others/krishnamurthy.java | 28 - Others/removeDuplicateFromString.java | 45 - README.md | 2 +- Searches/src/search/BinarySearch.java | 94 - Searches/src/search/InterpolationSearch.java | 79 - .../src/search/IterativeBinarySearch.java | 82 - .../src/search/IterativeTernarySearch.java | 87 - Searches/src/search/LinearSearch.java | 63 - Searches/src/search/SaddlebackSearch.java | 80 - Searches/src/search/SearchAlgorithm.java | 20 - Searches/src/search/TernarySearch.java | 106 - SkylineProblem/SkylineProblem.java | 131 - Sorts/src/sort/BinaryTreeSort.java | 96 - Sorts/src/sort/BogoSort.java | 59 - Sorts/src/sort/BubbleSort.java | 55 - Sorts/src/sort/CocktailShakerSort.java | 67 - Sorts/src/sort/CombSort.java | 76 - Sorts/src/sort/CountingSort.java | 102 - Sorts/src/sort/CycleSort.java | 81 - Sorts/src/sort/GnomeSort.java | 44 - Sorts/src/sort/HeapSort.java | 131 - Sorts/src/sort/InsertionSort.java | 61 - Sorts/src/sort/MergeSort.java | 113 - Sorts/src/sort/PancakeSort.java | 47 - Sorts/src/sort/QuickSort.java | 97 - Sorts/src/sort/RadixSort.java | 65 - Sorts/src/sort/SelectionSort.java | 63 - Sorts/src/sort/ShellSort.java | 50 - Sorts/src/sort/SortAlgorithm.java | 31 - Sorts/src/sort/SortUtils.java | 75 - ciphers/AES.java | 605 - ciphers/AESEncryption.java | 114 - ciphers/Caesar.java | 131 - ciphers/ColumnarTranspositionCipher.java | 224 - ciphers/RSA.java | 98 - ciphers/Vigenere.java | 67 - myfile.txt | 1 - .../java/conversions}/DecimalToAnyBase.java | 36 +- .../conversions/DecimalToAnyBaseTest.java | 16 + 160 files changed, 25 insertions(+), 38605 deletions(-) delete mode 100644 ClosestPair/ClosestPair.java delete mode 100644 ClosestPair/closest_data.txt delete mode 100644 Compression/bin/HEncoder$Node$Nodecomparator.class delete mode 100644 Compression/bin/HEncoder$Node.class delete mode 100644 Compression/bin/HEncoder.class delete mode 100644 Compression/bin/compressclient.class delete mode 100644 Compression/bin/genericheap.class delete mode 100644 Compression/src/HEncoder.java delete mode 100644 Compression/src/compressclient.java delete mode 100644 Compression/src/genericheap.java delete mode 100644 Conversions/AnyBaseToAnyBase.java delete mode 100644 Conversions/AnyBaseToDecimal.java delete mode 100644 Conversions/AnytoAny.java delete mode 100644 Conversions/BinaryToDecimal.java delete mode 100644 Conversions/BinaryToHexadecimal.java delete mode 100644 Conversions/BinaryToOctal.java delete mode 100644 Conversions/DecimalToBinary.java delete mode 100644 Conversions/DecimalToHexaDecimal.java delete mode 100644 Conversions/DecimalToOctal.java delete mode 100644 Conversions/HexToOct.java delete mode 100644 Conversions/HexaDecimalToBinary.java delete mode 100644 Conversions/HexaDecimalToDecimal.java delete mode 100644 Conversions/OctalToBinary.java delete mode 100644 Conversions/OctalToDecimal.java delete mode 100644 Conversions/OctalToHexadecimal.java delete mode 100644 DataStructures/Bags/Bag.java delete mode 100644 DataStructures/Buffers/CircularBuffer.java delete mode 100644 DataStructures/CSVFile/src/CSVFile.java delete mode 100644 DataStructures/CSVFile/src/TestCSVFile.java delete mode 100644 DataStructures/CSVFile/testData.csv delete mode 100644 DataStructures/CSVFile/testData2.csv delete mode 100644 DataStructures/CSVFile/testData3.csv delete mode 100644 DataStructures/CSVFile/testData4.csv delete mode 100644 DataStructures/Graphs/BFS.java delete mode 100644 DataStructures/Graphs/BellmanFord.java delete mode 100644 DataStructures/Graphs/ConnectedComponent.java delete mode 100644 DataStructures/Graphs/DFS.java delete mode 100644 DataStructures/Graphs/FloydWarshall.java delete mode 100644 DataStructures/Graphs/Graphs.java delete mode 100644 DataStructures/Graphs/KruskalsAlgorithm.java delete mode 100644 DataStructures/Graphs/MatrixGraphs.java delete mode 100644 DataStructures/Graphs/PrimMST.java delete mode 100644 DataStructures/HashMap/HashMap.java delete mode 100644 DataStructures/HashMap/Hashing/HashMap.java delete mode 100644 DataStructures/HashMap/Hashing/LinkedList.java delete mode 100644 DataStructures/HashMap/Hashing/Main.java delete mode 100644 DataStructures/HashMap/Hashing/Node.java delete mode 100644 DataStructures/Heaps/EmptyHeapException.java delete mode 100644 DataStructures/Heaps/Heap.java delete mode 100644 DataStructures/Heaps/HeapElement.java delete mode 100644 DataStructures/Heaps/MaxHeap.java delete mode 100644 DataStructures/Heaps/MinHeap.java delete mode 100644 DataStructures/Lists/CircleLinkedList.java delete mode 100644 DataStructures/Lists/DoublyLinkedList.java delete mode 100644 DataStructures/Lists/SinglyLinkedList.java delete mode 100644 DataStructures/Matrix/Matrix.java delete mode 100644 DataStructures/Queues/GenericArrayListQueue.java delete mode 100644 DataStructures/Queues/PriorityQueues.java delete mode 100644 DataStructures/Queues/Queues.java delete mode 100644 DataStructures/Stacks/BalancedBrackets.java delete mode 100644 DataStructures/Stacks/NodeStack.java delete mode 100644 DataStructures/Stacks/StackOfLinkedList.java delete mode 100644 DataStructures/Stacks/Stacks.java delete mode 100644 DataStructures/Trees/AVLTree.java delete mode 100644 DataStructures/Trees/BinaryTree.java delete mode 100644 DataStructures/Trees/FindHeightOfTree.java delete mode 100644 DataStructures/Trees/GenericTree.Java delete mode 100644 DataStructures/Trees/LevelOrderTraversal.java delete mode 100644 DataStructures/Trees/LevelOrderTraversalQueue.java delete mode 100644 DataStructures/Trees/PrintTopViewofTree.java delete mode 100644 DataStructures/Trees/RedBlackBST.java delete mode 100644 DataStructures/Trees/TreeTraversal.java delete mode 100644 DataStructures/Trees/TrieImp.java delete mode 100644 DataStructures/Trees/ValidBSTOrNot.java delete mode 100644 Dynamic Programming/CoinChange.java delete mode 100644 Dynamic Programming/Edit_Distance.java delete mode 100644 Dynamic Programming/EggDropping.java delete mode 100644 Dynamic Programming/Fibonacci.java delete mode 100644 Dynamic Programming/KadaneAlgorithm.java delete mode 100644 Dynamic Programming/Knapsack.java delete mode 100644 Dynamic Programming/LevenshteinDistance.java delete mode 100644 Dynamic Programming/LongestCommonSubsequence.java delete mode 100644 Dynamic Programming/LongestIncreasingSubsequence.java delete mode 100644 Dynamic Programming/RodCutting.java delete mode 100644 MinimizingLateness/MinimizingLateness.java delete mode 100644 MinimizingLateness/data06_lateness.txt delete mode 100644 Misc/PalindromicPrime.java delete mode 100644 Misc/heap_sort.java delete mode 100644 Others/Abecedarian.java delete mode 100644 Others/Armstrong.java delete mode 100644 Others/BrianKernighanAlgorithm.java delete mode 100644 Others/CountChar.java delete mode 100644 Others/Dijkshtra.java delete mode 100644 Others/Factorial.java delete mode 100644 Others/FibToN.java delete mode 100644 Others/FloydTriangle.java delete mode 100644 Others/GCD.java delete mode 100644 Others/GuassLengendre.java delete mode 100644 Others/Huffman.java delete mode 100644 Others/InsertDeleteInArray.java delete mode 100644 Others/KMP.java delete mode 100644 Others/LinearCongruentialGenerator.java delete mode 100644 Others/LowestBasePalindrome.java delete mode 100644 Others/Node.java delete mode 100644 Others/Palindrome.java delete mode 100644 Others/PasswordGen.java delete mode 100644 Others/PerlinNoise.java delete mode 100644 Others/PowerOfTwoOrNot.java delete mode 100644 Others/QueueUsingTwoStacks.java delete mode 100644 Others/ReturnSubsequence.java delete mode 100644 Others/ReverseStackUsingRecursion.java delete mode 100644 Others/ReverseString.java delete mode 100644 Others/RootPrecision.java delete mode 100644 Others/SieveOfEratosthenes.java delete mode 100644 Others/SkylineProblem.java delete mode 100644 Others/StackPostfixNotation.java delete mode 100644 Others/TopKWords.java delete mode 100644 Others/TowerOfHanoiUsingRecursion.java delete mode 100644 Others/countwords.java delete mode 100644 Others/crc32.java delete mode 100644 Others/krishnamurthy.java delete mode 100644 Others/removeDuplicateFromString.java delete mode 100644 Searches/src/search/BinarySearch.java delete mode 100644 Searches/src/search/InterpolationSearch.java delete mode 100644 Searches/src/search/IterativeBinarySearch.java delete mode 100644 Searches/src/search/IterativeTernarySearch.java delete mode 100644 Searches/src/search/LinearSearch.java delete mode 100644 Searches/src/search/SaddlebackSearch.java delete mode 100644 Searches/src/search/SearchAlgorithm.java delete mode 100644 Searches/src/search/TernarySearch.java delete mode 100644 SkylineProblem/SkylineProblem.java delete mode 100644 Sorts/src/sort/BinaryTreeSort.java delete mode 100644 Sorts/src/sort/BogoSort.java delete mode 100644 Sorts/src/sort/BubbleSort.java delete mode 100644 Sorts/src/sort/CocktailShakerSort.java delete mode 100644 Sorts/src/sort/CombSort.java delete mode 100644 Sorts/src/sort/CountingSort.java delete mode 100644 Sorts/src/sort/CycleSort.java delete mode 100644 Sorts/src/sort/GnomeSort.java delete mode 100644 Sorts/src/sort/HeapSort.java delete mode 100644 Sorts/src/sort/InsertionSort.java delete mode 100644 Sorts/src/sort/MergeSort.java delete mode 100644 Sorts/src/sort/PancakeSort.java delete mode 100644 Sorts/src/sort/QuickSort.java delete mode 100644 Sorts/src/sort/RadixSort.java delete mode 100644 Sorts/src/sort/SelectionSort.java delete mode 100644 Sorts/src/sort/ShellSort.java delete mode 100644 Sorts/src/sort/SortAlgorithm.java delete mode 100644 Sorts/src/sort/SortUtils.java delete mode 100644 ciphers/AES.java delete mode 100644 ciphers/AESEncryption.java delete mode 100644 ciphers/Caesar.java delete mode 100644 ciphers/ColumnarTranspositionCipher.java delete mode 100644 ciphers/RSA.java delete mode 100644 ciphers/Vigenere.java delete mode 100644 myfile.txt rename {Conversions => src/main/com/java/conversions}/DecimalToAnyBase.java (50%) create mode 100644 src/test/com/java/conversions/DecimalToAnyBaseTest.java diff --git a/.gitignore b/.gitignore index ae3c172..729ef78 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/bin/ +Java.iml +out/ diff --git a/ClosestPair/ClosestPair.java b/ClosestPair/ClosestPair.java deleted file mode 100644 index 760ef7f..0000000 --- a/ClosestPair/ClosestPair.java +++ /dev/null @@ -1,211 +0,0 @@ -import java.io.*; -import java.util.*; - -public class ClosestPair { - static int count = 0;// array length - static int secondCount = 0;// array length - static Location array[] = new Location[10000]; - static Location point1 = null; // Minimum point coordinate - static Location point2 = null; // Minimum point coordinate - static double minNum = Double.MAX_VALUE;// Minimum point length - - private static class Location { // Location class - double x = 0, y = 0; - - public Location(double x, double y) { //Save x, y coordinates - this.x = x; - this.y = y; - } - } - - public static int xPartition(Location[] a, int first, int last) { // x-axis Quick Sorting - Location pivot = a[last]; // pivot - int pIndex = last; - int i = first - 1; - Location temp; // Temporarily store the value for position transformation - for (int j = first; j <= last - 1; j++) { - if (a[j].x <= pivot.x) { // Less than or less than pivot - i++; - temp = a[i]; // array[i] <-> array[j] - a[i] = a[j]; - a[j] = temp; - } - } - i++; - temp = a[i];// array[pivot] <-> array[i] - a[i] = a[pIndex]; - a[pIndex] = temp; - return i;// pivot index - } - public static int yPartition(Location[] a, int first, int last) { //y-axis Quick Sorting - Location pivot = a[last]; // pivot - int pIndex = last; - int i = first - 1; - Location temp; // Temporarily store the value for position transformation - for (int j = first; j <= last - 1; j++) { - if (a[j].y <= pivot.y) { // Less than or less than pivot - i++; - temp = a[i]; // array[i] <-> array[j] - a[i] = a[j]; - a[j] = temp; - } - } - i++; - temp = a[i];// array[pivot] <-> array[i] - a[i] = a[pIndex]; - a[pIndex] = temp; - return i;// pivot index - } - - public static void xQuickSort(Location[] a, int first, int last) { //x-axis Quick Sorting - if (first < last) { - int q = xPartition(a, first, last); // pivot - xQuickSort(a, first, q - 1); // Left - xQuickSort(a, q + 1, last); // Right - } - } - - public static void yQuickSort(Location[] a, int first, int last) { //y-axis Quick Sorting - if (first < last) { - int q = yPartition(a, first, last); // pivot - yQuickSort(a, first, q - 1); // Left - yQuickSort(a, q + 1, last); // Right - } - } - - public static double closestPair(Location[] a, int indexNum, int first, int last) {// closestPair - Location divideArray[] = new Location[indexNum]; // array stored before divide - System.arraycopy(a, 0, divideArray, 0, indexNum); // Copy from previous array - - int totalNum = indexNum; // number of coordinates in the divideArray array - int divideX = indexNum / 2; // Intermediate value for divide - Location leftArray[] = new Location[divideX]; //divide - left array - Location rightArray[] = new Location[totalNum - divideX]; //divide - right array - - if (indexNum <= 3) { // If the number of coordinates is 3 or less - return bruteForce(divideArray); - } - System.arraycopy(divideArray, 0, leftArray, 0, divideX); //divide - left array - System.arraycopy(divideArray, divideX, rightArray, 0, totalNum - divideX); //divide - right array - - double minLeftArea = 0; //Minimum length of left array - double minRightArea = 0; //Minimum length of right array - double minValue = 0; //Minimum lengt - - minLeftArea = closestPair(leftArray, divideX, 0, divideX - 1); // recursive closestPair - minRightArea = closestPair(rightArray, totalNum - divideX, divideX, totalNum - divideX - 1); - minValue = Math.min(minLeftArea, minRightArea);// window size (= minimum length) - - // Create window - for (int i = 0; i < totalNum; i++) { // Set the size for creating a window and creating a new array for the coordinates in the window - double xGap = Math.abs(divideArray[divideX].x - divideArray[i].x); - if (xGap < minValue) { - secondCount++; // size of the array - } else { - if (divideArray[i].x > divideArray[divideX].x) { - break; - } - } - } - Location firstWindow[] = new Location[secondCount]; // new array for coordinates in window - int k = 0; - for (int i = 0; i < totalNum; i++) { - double xGap = Math.abs(divideArray[divideX].x - divideArray[i].x); - if (xGap < minValue) { // if it's inside a window - firstWindow[k] = divideArray[i]; // put in an array - k++; - } else { - if (divideArray[i].x > divideArray[divideX].x) { - break; - } - } - } - yQuickSort(firstWindow, 0, secondCount - 1);// Sort by y coordinates - / * Coordinates in Window * / - double length = 0; - for (int i = 0; i < secondCount - 1; i++) { // size comparison within window - for (int j = (i + 1); j < secondCount; j++) { - double xGap = Math.abs(firstWindow[i].x - firstWindow[j].x); - double yGap = Math.abs(firstWindow[i].y - firstWindow[j].y); - if (yGap < minValue) { - length = (double) Math.sqrt(Math.pow(xGap, 2) + Math.pow(yGap, 2)); - if (length < minValue) { // If the measured distance is less than the current minimum distance - minValue = length;// Change minimum distance to current distance - if (length < minNum) { // Conditional statement for registering final coordinate - minNum = length; - point1 = firstWindow[i]; - point2 = firstWindow[j]; - } - } - } - else - break; - } - } - secondCount = 0; - return minValue; - } - - public static double bruteForce(Location[] array) { // When the number of coordinates is less than 3 - double minValue = Double.MAX_VALUE; // minimum distance - double length = 0; - double xGap = 0, yGap = 0; // Difference between x, y coordinates - if (array.length == 2) { // When there are two coordinates - xGap = (array[0].x - array[1].x); // Difference between x coordinates - yGap = (array[0].y - array[1].y); // Difference between y coordinates - length = (double) Math.sqrt(Math.pow(xGap, 2) + Math.pow(yGap, 2)); // distance between coordinates - if (length < minNum) { // Conditional statement for registering final coordinate - minNum = length; - point1 = array[0]; - point2 = array[1]; - } - return length; - } else if (array.length == 3) { // When there are 3 coordinates - for (int i = 0; i < array.length - 1; i++) { - for (int j = (i + 1); j < array.length; j++) { - xGap = (array[i].x - array[j].x); // Difference between x coordinates - yGap = (array[i].y - array[j].y); // Difference between y coordinates - length = (double) Math.sqrt(Math.pow(xGap, 2) + Math.pow(yGap, 2)); // distance between coordinates - if (length < minValue) { // If the measured distance is less than the current minimum distance - minValue = length; // Change minimum distance to current distance - if (length < minNum) { // Conditional statement for registering final coordinate - minNum = length; - point1 = array[i]; - point2 = array[j]; - } - } - } - } - return minValue; - } - return minValue; - } - - public static void main(String[] args) throws IOException { - // TODO Auto-generated method stub - StringTokenizer token; - - BufferedReader in = new BufferedReader(new FileReader("closest_data.txt")); - //Input data consists of one x-coordinate and one y-coordinate - String ch; - - System.out.println("Input data"); - while ((ch = in.readLine()) != null) { - token = new StringTokenizer(ch, " "); - - array[count] = new Location(Double.parseDouble(token.nextToken()), Double.parseDouble(token.nextToken())); // put in an array - count++; // the number of coordinates actually in the array - System.out.println("x: "+array[count - 1].x + ", y: " + array[count - 1].y); - } - - xQuickSort(array, 0, count - 1); // Sorting by x value - - double result; // minimum distance - result = closestPair(array, count, 0, count - 1); // ClosestPair start - System.out.println("Output Data");// minimum distance coordinates and distance output - System.out.println("(" + point1.x + ", " + point1.y + ")"); - System.out.println("(" + point2.x + ", " + point2.y + ")"); - System.out.println("Minimum Distance : " + result); - - } -} diff --git a/ClosestPair/closest_data.txt b/ClosestPair/closest_data.txt deleted file mode 100644 index 8ebef63..0000000 --- a/ClosestPair/closest_data.txt +++ /dev/null @@ -1,12 +0,0 @@ -2 3 -2 16 -3 9 -6 3 -7 7 -9 12 -10 11 -15 2 -15 19 -16 11 -17 13 -19 4 diff --git a/Compression/bin/HEncoder$Node$Nodecomparator.class b/Compression/bin/HEncoder$Node$Nodecomparator.class deleted file mode 100644 index 132ac19ff6cac8f89e2f9c0e4fbdab3088d97268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859 zcmaJfgc5PjpMapO9z6Bo)yDJ?BDUnK%@L8&UC2!y35Jrw1>ahKGUYs1FoS8=IS z6^R4l%#T9M+Wkr*aoBk?v$JpC?9QLRKYsyugFO=lVg2L#$d8Yu+8MCTj31wU5lSSn zGEpQrr{bIFgd!Su4o9cbPfU~ut64Tpg0R!OsV9{7gD6N22!(oMNGSH0)ItGEHcTuM zR{B9C2kF^Js!w7RNi@v&8($*;Tr$oy>cV7a8uN S&RAm^E*fY-f0K(g%KrfHwzif4 diff --git a/Compression/bin/HEncoder$Node.class b/Compression/bin/HEncoder$Node.class deleted file mode 100644 index 9fcce4c5042a2435e9f72adbb12ab07fb091644d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 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 w!`&GU=IhoBM_jL7gKtp(*OVf diff --git a/Compression/bin/genericheap.class b/Compression/bin/genericheap.class deleted file mode 100644 index 16c2d03aa1029eb85be2e4cf7fee29187320d1b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2858 zcma)8TT@e46#h2nyd zPQfX=nQh1BfoY&;$9`tdqNU?8PTyHz(gbGcl$_fl@9x?mub zcDD+4b+_yoIML2$acym3iH>HbS}YrgH2GX9=1X?j<~i-rwuaj6jzzcNR+kJ6#oGEU z#McdswzugR;$U7WW}Pnham<2+UIYGEd_9PM1AT4Sb)gT(LNG9BA%G594Os}G%fQi; zTX1ge<~N=4n!TAL_uf=7W9QcGvMYP<(5!B|6$3|7O?4*K$YI~TQq8}&*|A35thiq? z0imu6qBksz;go@(TS?|i)jef-D3%EeXK`-B|L*s2H^WHx8ZVITGCHfT;qKFlH! z-nVcCR}FN!m6Tmp{(;!)YFvfCX5l(k7_#!YT{55y4DHLf28>lMN?aUCSMAKxn|4Vl zDY$Q0xQ#o^vE@k3h^G}n827LiMA|@qqn{dGZs9(JL`L;JHJxZvwAQF`f-(f$4zs(} zZGLyE+k)vM3m@YX?kj?6BDUJ*a_bQ}lfw$R^vBwekdnk%NS3ecG>IN`}prb;s8B~-_ZBq z00S=(Nld=P@fS4saf07onEZzM?c_BJ{R|Z4Nkm`9Fh;mz7%%DQA=}BiO+Xkjv;0c> zt7;E)CVoa_AE%%5OlK4-K#$5|sdcB9MPfHjB(@>5&TpHD(cztn^S*;BX66Inhur@E511!JL9z^fVZh=#%?+XCvX2!^|FFzLBh( zj$oh=s~y2;lLCWYLSPU}c#n7+3W!ZBAhu=NeDbDv?7n79i8>bj7UqknnGNJFC8EOz zxcm*e)gqbTPN6VWFN~@NI>lZ%&6YdEt~kqn7^iK5dEyGyn2uRTHHKAuz>Hyb$PKQ1 z3ZGVS%)^%=3jPuY{>G3%%JEqWidcOBTai%$r;tpBgfM!CgPTL%@9Q z7r`~qh`M!-<(lHmP805V!ktwBXLZCnz;SFSfXspq6+kKS1D4XyyM1`bm8n2$YU3Vg z?X_I@TBer}VWa encoder = new HashMap<>(); // in order to encode - public HashMap decoder = new HashMap<>(); // in order to decode - - private static class Node { - - Character ch; - Integer freq; - Node left; - Node right; - - public static final Nodecomparator Ctor = new Nodecomparator(); - - public static class Nodecomparator implements Comparator { - - @Override - public int compare(Node o1, Node o2) { - return o2.freq - o1.freq; - } - - } - } - - public HEncoder(String feeder) { - // 1. freq map - HashMap freqmap = new HashMap<>(); - for (int i = 0; i < feeder.length(); ++i) { - char ch = feeder.charAt(i); - if (freqmap.containsKey(ch)) { - freqmap.put(ch, freqmap.get(ch) + 1); - } else { - freqmap.put(ch, 1); - } - } - - // 2. prepare the heap from keyset - genericheap heap = new genericheap(Node.Ctor); - ArrayList k = new ArrayList<>(freqmap.keySet()); - for (Character c : k) { - Node n = new Node(); - n.ch = c; - n.left = null; - n.right = null; - n.freq = freqmap.get(c); - heap.add(n); - } - - // 3.Prepare tree, remove two , merge, add it back - Node fn = new Node(); - while (heap.size() != 1) { - Node n1 = heap.removeHP(); - Node n2 = heap.removeHP(); - fn = new Node(); - - fn.freq = n1.freq + n2.freq; - fn.left = n1; - fn.right = n2; - - heap.add(fn); - } - - // 4. traverse - - traverse(heap.removeHP(), ""); - } - - private void traverse(Node node, String osf) { - - if (node.left == null && node.right == null) { - encoder.put(node.ch, osf); - decoder.put(osf, node.ch); - return; - } - traverse(node.left, osf + "0"); - traverse(node.right, osf + "1"); - - } - - // compression work done here - public String compress(String str) { - String rv = ""; - for (int i = 0; i < str.length(); ++i) { - rv += encoder.get(str.charAt(i)); - } - return rv; - } - - - //in order to decompress - public String decompress(String str) { - String s = ""; - String code = ""; - for (int i = 0; i < str.length(); ++i) { - code += str.charAt(i); - if (decoder.containsKey(code)) { - s += decoder.get(code); - code = ""; - } - } - - return s; - } -} diff --git a/Compression/src/compressclient.java b/Compression/src/compressclient.java deleted file mode 100644 index 496c8a8..0000000 --- a/Compression/src/compressclient.java +++ /dev/null @@ -1,11 +0,0 @@ - -public class compressclient { - - public static void main(String[] args) { - - HEncoder h= new HEncoder("aaaabbbcccccccccccdddd"); - System.out.println(h.compress("aabccd")); - System.out.println(h.decompress("101011000111")); - } - -} diff --git a/Compression/src/genericheap.java b/Compression/src/genericheap.java deleted file mode 100644 index de00316..0000000 --- a/Compression/src/genericheap.java +++ /dev/null @@ -1,93 +0,0 @@ - - -import java.util.ArrayList; -import java.util.Comparator; - -public class genericheap { // create a generic heap class , where T can be of any type. - - private ArrayList data = new ArrayList<>(); - private Comparator ctor; - - public genericheap(Comparator ctor) { // constructor to initialize the generic comparator - this.ctor=ctor; - } - - public int size() { // returns the size of the arraylist data - return data.size(); - } - - public boolean isEmpty() { // checks whether the list is empty or not :: return true or false for the same - return data.isEmpty(); - } - - public void display() { //displays the list - System.out.println(this.data); - } - - public void add(T integer) { // in this function we have added the type object into the arraylist and called upheapify - data.add(integer); - upheapify(data.size() - 1); - } - - private void upheapify(int ci) { - if (ci == 0) { - return; - } - int pi = (ci - 1) / 2; - if (isLarger(ci,pi) == true) { - swap(ci, pi); - upheapify(pi); - } - } - - private boolean isLarger(int i, int j) { - T ith = data.get(i); - T jth = data.get(j); - if(ctor.compare(ith,jth)>0) - { - return true; - } - else - { - return false; - } - } - - private void swap(int ci, int pi) { // swap function written like this because of the generic property - T ith = data.get(ci); - T jth=data.get(pi); - data.set(ci, jth); - data.set(pi, ith); - } - - public T getHP() { - return data.get(0); - } - - public T removeHP() { - - swap(0, data.size() - 1); - T rv=data.remove(data.size()-1); - downheapify(0); - return rv; - } - - private void downheapify(int pi) { - int lci = 2 * pi + 1; - int rci = 2 * pi + 2; - - int max = pi; - - if (lci < data.size() && isLarger(lci, max) == true) { - max = lci; - } - if (rci < data.size() && isLarger(rci, max) == true) { - max = rci; - } - if (max != pi) { - swap(pi, max); - downheapify(max); - } - } - -} diff --git a/Conversions/AnyBaseToAnyBase.java b/Conversions/AnyBaseToAnyBase.java deleted file mode 100644 index 33c7797..0000000 --- a/Conversions/AnyBaseToAnyBase.java +++ /dev/null @@ -1,130 +0,0 @@ -import java.util.Arrays; -import java.util.HashSet; -import java.util.InputMismatchException; -import java.util.Scanner; - -/** - * Class for converting from "any" base to "any" other base, when "any" means from 2-36. - * Works by going from base 1 to decimal to base 2. Includes auxiliary method for - * determining whether a number is valid for a given base. - * - * @author Michael Rolland - * @version 2017.10.10 - * - */ -public class AnyBaseToAnyBase { - - // Smallest and largest base you want to accept as valid input - static final int MINIMUM_BASE = 2; - static final int MAXIMUM_BASE = 36; - - // Driver - public static void main(String[] args) { - Scanner in = new Scanner(System.in); - String n; - int b1=0,b2=0; - while (true) { - try { - System.out.print("Enter number: "); - n = in.next(); - System.out.print("Enter beginning base (between "+MINIMUM_BASE+" and "+MAXIMUM_BASE+"): "); - b1 = in.nextInt(); - if (b1 > MAXIMUM_BASE || b1 < MINIMUM_BASE) { - System.out.println("Invalid base!"); - continue; - } - if (!validForBase(n, b1)) { - System.out.println("The number is invalid for this base!"); - continue; - } - System.out.print("Enter end base (between "+MINIMUM_BASE+" and "+MAXIMUM_BASE+"): "); - b2 = in.nextInt(); - if (b2 > MAXIMUM_BASE || b2 < MINIMUM_BASE) { - System.out.println("Invalid base!"); - continue; - } - break; - } catch (InputMismatchException e) { - System.out.println("Invalid input."); - in.next(); - } - } - System.out.println(base2base(n, b1, b2)); - } - - /** - * Checks if a number (as a String) is valid for a given base. - */ - public static boolean validForBase(String n, int base) { - char[] validDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', - 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', - 'W', 'X', 'Y', 'Z'}; - // digitsForBase contains all the valid digits for the base given - char[] digitsForBase = Arrays.copyOfRange(validDigits, 0, base); - - // Convert character array into set for convenience of contains() method - HashSet digitsList = new HashSet(); - for (int i=0; i9 and store it in charB2 - if (charB1 >= 'A' && charB1 <= 'Z') - charB2 = 10 + (charB1 - 'A'); - // Else, store the integer value in charB2 - else - charB2 = charB1 - '0'; - // Convert the digit to decimal and add it to the - // decimalValue of n - decimalValue = decimalValue * b1 + charB2; - } - - // Converting the decimal value to base b2: - // A number is converted from decimal to another base - // by continuously dividing by the base and recording - // the remainder until the quotient is zero. The number in the - // new base is the remainders, with the last remainder - // being the left-most digit. - - // While the quotient is NOT zero: - while (decimalValue != 0) { - // If the remainder is a digit < 10, simply add it to - // the left side of the new number. - if (decimalValue % b2 < 10) - output = Integer.toString(decimalValue % b2) + output; - // If the remainder is >= 10, add a character with the - // corresponding value to the new number. (A = 10, B = 11, C = 12, ...) - else - output = (char)((decimalValue % b2)+55) + output; - // Divide by the new base again - decimalValue /= b2; - } - return output; - } -} diff --git a/Conversions/AnyBaseToDecimal.java b/Conversions/AnyBaseToDecimal.java deleted file mode 100644 index 5e04bcf..0000000 --- a/Conversions/AnyBaseToDecimal.java +++ /dev/null @@ -1,59 +0,0 @@ -import java.io.BufferedReader; -import java.io.InputStreamReader; - -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ - -// Driver program -public class AnyBaseToDecimal { - public static void main (String[] args) throws Exception{ - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - - String inp = br.readLine(); - int base = Integer.parseInt(br.readLine()); - - System.out.println("Input in base " + base + " is: " + inp); - System.out.println("Decimal value of " + inp + " is: " + convertToDecimal(inp, base)); - - br.close(); - } - - /** - * This method produces a decimal value of any given input number of any base - * @param inp_num String of which we need the decimal value and base in integer format - * @return string format of the decimal value - */ - - public static String convertToDecimal(String inp_num, int base) { - int len = inp_num.length(); - int num = 0; - int pow = 1; - - for (int i=len-1; i>=0; i--) { - if (valOfChar(inp_num.charAt(i)) >= base) { - return "Invalid Number"; - } - num += valOfChar(inp_num.charAt(i))*pow; - pow *= base; - } - return String.valueOf(num); - } - - /** - * This method produces integer value of the input character and returns it - * @param c Char of which we need the integer value of - * @return integer value of input char - */ - - public static int valOfChar(char c) { - if (c >= '0' && c <= '9') { - return (int)c - '0'; - } - else { - return (int)c - 'A' + 10; - } - } -} diff --git a/Conversions/AnytoAny.java b/Conversions/AnytoAny.java deleted file mode 100644 index a86e2d0..0000000 --- a/Conversions/AnytoAny.java +++ /dev/null @@ -1,29 +0,0 @@ -package Java.Conversions; - -import java.util.Scanner; -//given a source number , source base, destination base, this code can give you the destination number. -//sn ,sb,db ---> ()dn . this is what we have to do . - -public class AnytoAny { - - public static void main(String[] args) { - Scanner scn = new Scanner(System.in); - int sn = scn.nextInt(); - int sb = scn.nextInt(); - int db = scn.nextInt(); - int m = 1, dec = 0, dn = 0; - while (sn != 0) { - dec = dec + (sn % 10) * m; - m *= sb; - sn /= 10; - } - m = 1; - while (dec != 0) { - dn = dn + (dec % db) * m; - m *= 10; - dec /= db; - } - System.out.println(dn); - } - -} diff --git a/Conversions/BinaryToDecimal.java b/Conversions/BinaryToDecimal.java deleted file mode 100644 index 9e5494e..0000000 --- a/Conversions/BinaryToDecimal.java +++ /dev/null @@ -1,33 +0,0 @@ -import java.util.Scanner; - -/** - * This class converts a Binary number to a Decimal number - * - * @author Unknown - * - */ -class BinaryToDecimal -{ - - /** - * Main Method - * - * @param args Command line arguments - */ - public static void main(String args[]) - { - Scanner sc=new Scanner(System.in); - int n,k,d,s=0,c=0; - System.out.print("Binary number: "); - n=sc.nextInt(); - k=n; - while(k!=0) - { - d=k%10; - s+=d*(int)Math.pow(2,c++); - k/=10; - } - System.out.println("Decimal equivalent:"+s); - sc.close(); - } -} diff --git a/Conversions/BinaryToHexadecimal.java b/Conversions/BinaryToHexadecimal.java deleted file mode 100644 index a71d129..0000000 --- a/Conversions/BinaryToHexadecimal.java +++ /dev/null @@ -1,57 +0,0 @@ -import java.util.*; -/** - * Converts any Binary Number to a Hexadecimal Number - * - * @author Nishita Aggarwal - * - */ -public class BinaryToHexadecimal { - - /** - * This method converts a binary number to - * a hexadecimal number. - * - * @param binary The binary number - * @return The hexadecimal number - */ - static String binToHex(int binary) - { - //hm to store hexadecimal codes for binary numbers within the range: 0000 to 1111 i.e. for decimal numbers 0 to 15 - HashMap hm=new HashMap<>(); - //String to store hexadecimal code - String hex=""; - int i; - for(i=0 ; i<10 ; i++) - { - hm.put(i, String.valueOf(i)); - } - for(i=10 ; i<16 ; i++) hm.put(i,String.valueOf((char)('A'+i-10))); - int currbit; - while(binary != 0) - { - int code4 = 0; //to store decimal equivalent of number formed by 4 decimal digits - for(i=0 ; i<4 ; i++) - { - currbit = binary % 10; - binary = binary / 10; - code4 += currbit * Math.pow(2, i); - } - hex= hm.get(code4) + hex; - } - return hex; - } - - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - System.out.println("Enter binary number:"); - int binary = sc.nextInt(); - String hex = binToHex(binary); - System.out.println("Hexadecimal Code:" + hex); - sc.close(); - } -} diff --git a/Conversions/BinaryToOctal.java b/Conversions/BinaryToOctal.java deleted file mode 100644 index cb04fe5..0000000 --- a/Conversions/BinaryToOctal.java +++ /dev/null @@ -1,43 +0,0 @@ -import java.util.Scanner; - -/** - * Converts any Binary number to an Octal Number - * - * @author Zachary Jones - * - */ -public class BinaryToOctal { - - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String args[]) { - Scanner sc = new Scanner(System.in); - int b = sc.nextInt(); - System.out.println("Octal equivalent: " + convertBinaryToOctal(b)); - sc.close(); - - } - - /** - * This method converts a binary number to - * an octal number. - * - * @param b The binary number - * @return The octal number - */ - public static int convertBinaryToOctal(int b) { - int o = 0, r=0, j =1 ; - while(b!=0) - { - r = b % 10; - o = o + r * j; - j = j * 2; - b = b / 10; - } - return o; - } - -} diff --git a/Conversions/DecimalToBinary.java b/Conversions/DecimalToBinary.java deleted file mode 100644 index 176d27e..0000000 --- a/Conversions/DecimalToBinary.java +++ /dev/null @@ -1,57 +0,0 @@ -import java.util.Scanner; - -/** - * This class converts a Decimal number to a Binary number - * - * @author Unknown - * - */ -class DecimalToBinary { - - /** - * Main Method - * - * @param args Command Line Arguments - */ - public static void main(String args[]) { - conventionalConversion(); - bitwiseConversion(); - } - - /** - * This method converts a decimal number - * to a binary number using a conventional - * algorithm. - */ - public static void conventionalConversion() { - int n, b = 0, c = 0, d; - Scanner input = new Scanner(System.in); - System.out.printf("Conventional conversion.\n\tEnter the decimal number: "); - n = input.nextInt(); - while (n != 0) { - d = n % 2; - b = b + d * (int) Math.pow(10, c++); - n /= 2; - } //converting decimal to binary - System.out.println("\tBinary number: " + b); - } - - /** - * This method converts a decimal number - * to a binary number using a bitwise - * algorithm - */ - public static void bitwiseConversion() { - int n, b = 0, c = 0, d; - Scanner input = new Scanner(System.in); - System.out.printf("Bitwise conversion.\n\tEnter the decimal number: "); - n = input.nextInt(); - while (n != 0) { - d = (n & 1); - b += d * (int) Math.pow(10, c++); - n >>= 1; - } - System.out.println("\tBinary number: " + b); - } - -} diff --git a/Conversions/DecimalToHexaDecimal.java b/Conversions/DecimalToHexaDecimal.java deleted file mode 100644 index 251d10c..0000000 --- a/Conversions/DecimalToHexaDecimal.java +++ /dev/null @@ -1,30 +0,0 @@ - -class DecimalToHexaDecimal { - private static final int sizeOfIntInHalfBytes = 8; - private static final int numberOfBitsInAHalfByte = 4; - private static final int halfByte = 0x0F; - private static final char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', - 'F' }; - - // Returns the hex value of the dec entered in the parameter. - public static String decToHex(int dec) { - StringBuilder hexBuilder = new StringBuilder(sizeOfIntInHalfBytes); - hexBuilder.setLength(sizeOfIntInHalfBytes); - for (int i = sizeOfIntInHalfBytes - 1; i >= 0; --i) { - int j = dec & halfByte; - hexBuilder.setCharAt(i, hexDigits[j]); - dec >>= numberOfBitsInAHalfByte; - } - return hexBuilder.toString().toLowerCase(); - } - - // Test above function. - public static void main(String[] args) { - System.out.println("Test..."); - int dec = 305445566; - String libraryDecToHex = Integer.toHexString(dec); - String decToHex = decToHex(dec); - System.out.println("Result from the library : " + libraryDecToHex); - System.out.println("Result decToHex method : " + decToHex); - } -} \ No newline at end of file diff --git a/Conversions/DecimalToOctal.java b/Conversions/DecimalToOctal.java deleted file mode 100644 index 1efa00f..0000000 --- a/Conversions/DecimalToOctal.java +++ /dev/null @@ -1,33 +0,0 @@ -import java.util.Scanner; - -/** - * This class converts Decimal numbers to Octal Numbers - * - * @author Unknown - * - */ -class Decimal_Octal -{ - /** - * Main Method - * - * @param args Command line Arguments - */ - public static void main(String[] args) - { - Scanner sc=new Scanner(System.in); - int n,k,d,s=0,c=0; - System.out.print("Decimal number: "); - n=sc.nextInt(); - k=n; - while(k!=0) - { - d=k%8; - s+=d*(int)Math.pow(10,c++); - k/=8; - } - - System.out.println("Octal equivalent:"+s); - sc.close(); - } -} diff --git a/Conversions/HexToOct.java b/Conversions/HexToOct.java deleted file mode 100644 index d00b0a9..0000000 --- a/Conversions/HexToOct.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - + * Converts any Hexadecimal Number to Octal - + * - + * @author Tanmay Joshi - + * - + */ -import java.util.Scanner; - -public class HexToOct -{ - /** - + * This method converts a Hexadecimal number to - + * a decimal number - + * - + * @param The Hexadecimal Number - + * @return The Decimal number - + */ - public static int hex2decimal(String s) - { - String str = "0123456789ABCDEF"; - s = s.toUpperCase(); - int val = 0; - for (int i = 0; i < s.length(); i++) - { - char a = s.charAt(i); - int n = str.indexOf(a); - val = 16*val + n; - } - return val; - } - - /** - + * This method converts a Decimal number to - + * a octal number - + * - + * @param The Decimal Number - + * @return The Octal number - + */ - public static int decimal2octal(int q) - { - int now; - int i=1; - int octnum=0; - while(q>0) - { - now=q%8; - octnum=(now*(int)(Math.pow(10,i)))+octnum; - q/=8; - i++; - } - octnum/=10; - return octnum; - } - // Main method that gets the hex input from user and converts it into octal. - public static void main(String args[]) - { - String hexadecnum; - int decnum,octalnum; - Scanner scan = new Scanner(System.in); - - System.out.print("Enter Hexadecimal Number : "); - hexadecnum = scan.nextLine(); - - // first convert hexadecimal to decimal - - decnum = hex2decimal(hexadecnum); //Pass the string to the hex2decimal function and get the decimal form in variable decnum - - // convert decimal to octal - octalnum=decimal2octal(decnum); - System.out.println("Number in octal: "+octalnum); - - - } -} diff --git a/Conversions/HexaDecimalToBinary.java b/Conversions/HexaDecimalToBinary.java deleted file mode 100644 index 29608e1..0000000 --- a/Conversions/HexaDecimalToBinary.java +++ /dev/null @@ -1,37 +0,0 @@ -import java.lang.StringBuilder; -import java.util.*; -import java.util.Scanner; -import javax.swing.*; - -public class HexaDecimalToBinary { - - private final int LONG_BITS = 8; - - public void convert(String numHex) { - //String a HexaDecimal: - int conHex = Integer.parseInt(numHex, 16); - //Hex a Binary: - String binary = Integer.toBinaryString(conHex); - //Presentation: - System.out.println(numHex + " = " + completeDigits(binary)); - } - - public String completeDigits(String binNum) { - for (int i = binNum.length(); i < LONG_BITS; i++) { - binNum = "0" + binNum; - } - return binNum; - } - - public static void main(String[] args) { - - //Testing Numbers: - String[] hexNums = {"1", "A1", "ef", "BA", "AA", "BB", - "19", "01", "02", "03", "04"}; - HexaDecimalToBinary objConvert = new HexaDecimalToBinary(); - - for (String num : hexNums) { - objConvert.convert(num); - } - } -} diff --git a/Conversions/HexaDecimalToDecimal.java b/Conversions/HexaDecimalToDecimal.java deleted file mode 100644 index 24c4e0a..0000000 --- a/Conversions/HexaDecimalToDecimal.java +++ /dev/null @@ -1,42 +0,0 @@ -package Conversions; - -import java.util.Scanner; - -public class HexaDecimalToDecimal { - - // convert hexadecimal to decimal - public static int getHexaToDec(String hex){ - String digits = "012345678910ABCDEFF"; - hex = hex.toUpperCase(); - int val = 0; - for (int i = 0; i < hex.length(); i++) - { - int d = digits.indexOf(hex.charAt(i)); - val = 16*val + d; - } - return val; - } - - // Main method gets the hexadecimal input from user and converts it into Decimal output. - - public static void main(String args[]) - { - String hexa_Input; - int dec_output; - Scanner scan = new Scanner(System.in); - - System.out.print("Enter Hexadecimal Number : "); - hexa_Input = scan.nextLine(); - - // convert hexadecimal to decimal - - dec_output = getHexaToDec(hexa_Input); - /* - Pass the string to the getHexaToDec function - and it returns the decimal form in the variable dec_output. - */ - System.out.println("Number in Decimal: "+dec_output); - - - } -} diff --git a/Conversions/OctalToBinary.java b/Conversions/OctalToBinary.java deleted file mode 100644 index 6a011c0..0000000 --- a/Conversions/OctalToBinary.java +++ /dev/null @@ -1,49 +0,0 @@ -import java.util.Scanner; - -/** - * Converts any Octal number to a Binary number - * - * @author Zachary Jones - * - */ -public class OctalToBinary { - - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String args[]) { - Scanner sc = new Scanner(System.in); - int o = sc.nextInt(); - System.out.println("Binary equivalent: " + convertOctalToBinary(o)); - sc.close(); - } - - /** - * This method converts an octal number - * to a binary number. - * - * @param o The octal number - * @return The binary number - */ - public static int convertOctalToBinary(int o) { - Scanner scan; - int num; - - void getVal() { - - System.out.println("Octal to Binary"); - scan = new Scanner(System.in); - // Entering the needed number - System.out.println("\nEnter the number : "); - num = Integer.parseInt(scan.nextLine(), 8); - } - - void convert() { - - String binary = Integer.toBinaryString(num); - System.out.println("Binary Value is : " + binary); - } - } -} \ No newline at end of file diff --git a/Conversions/OctalToDecimal.java b/Conversions/OctalToDecimal.java deleted file mode 100644 index 2c90985..0000000 --- a/Conversions/OctalToDecimal.java +++ /dev/null @@ -1,47 +0,0 @@ -import java.util.Scanner; - -/** - * Converts any Octal Number to a Decimal Number - * - * @author Zachary Jones - * - */ -public class OctalToDecimal { - - /** - * Main method - * - * @param args - * Command line arguments - */ - public static void main(String args[]) { - Scanner sc = new Scanner(System.in); - System.out.print("Octal Input: "); - String inputOctal = sc.nextLine(); - int result = convertOctalToDecimal(inputOctal); - if (result != -1) - System.out.println("Result convertOctalToDecimal : " + result); - sc.close(); - } - - /** - * This method converts an octal number to a decimal number. - * - * @param inputOctal - * The octal number - * @return The decimal number - */ - public static int convertOctalToDecimal(String inputOctal) { - - try { - // Actual conversion of Octal to Decimal: - Integer outputDecimal = Integer.parseInt(inputOctal, 8); - return outputDecimal; - } catch (NumberFormatException ne) { - // Printing a warning message if the input is not a valid octal - // number: - System.out.println("Invalid Input, Expecting octal number 0-7"); - return -1; - } - } -} \ No newline at end of file diff --git a/Conversions/OctalToHexadecimal.java b/Conversions/OctalToHexadecimal.java deleted file mode 100644 index a68df62..0000000 --- a/Conversions/OctalToHexadecimal.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - + + * Converts any Octal Number to HexaDecimal - + + * - + + * @author Tanmay Joshi - + + * - + + * - **/ -import java.util.Scanner; - -public class OctalToHexadecimal { - - /** - + + * This method converts a Octal number to - + + * a decimal number - + + * - + + * @param The Octal Number - + + * @return The Decimal number - + + */ - public static int OctToDec(String s) - { - int i =0; - for(int j =0;j 0) { - int digit = d % 16; - hex = digits.charAt(digit) + hex; - d = d / 16; - } - return hex; -} - - //Driver Program -public static void main ( String args[]) { - - Scanner input = new Scanner(System.in); - System.out.print("Enter the Octal number: "); - String oct = input.next(); //Take octal number as input from user in a string - int decimal = OctToDec(oct); //Pass the octal number to function and get converted deciaml form - String hex = DecimalToHex(decimal); //Pass the decimla number to function and get converted Hex form of the number - System.out.println("The Hexadecimal equivalant is: "+hex); - } -} - diff --git a/DataStructures/Bags/Bag.java b/DataStructures/Bags/Bag.java deleted file mode 100644 index 06b454e..0000000 --- a/DataStructures/Bags/Bag.java +++ /dev/null @@ -1,126 +0,0 @@ -package Bags; - -import java.util.Iterator; -import java.util.NoSuchElementException; - -/** - * Collection which does not allow removing elements (only collect and iterate) - * - * @param - the generic type of an element in this bag - */ -public class Bag implements Iterable { - - private Node firstElement; // first element of the bag - private int size; // size of bag - - private static class Node { - private Element content; - private Node nextElement; - } - - /** - * Create an empty bag - */ - public Bag() { - firstElement = null; - size = 0; - } - - /** - * @return true if this bag is empty, false otherwise - */ - public boolean isEmpty() { - return firstElement == null; - } - - /** - * @return the number of elements - */ - public int size() { - return size; - } - - /** - * @param element - the element to add - */ - public void add(Element element) { - Node oldfirst = firstElement; - firstElement = new Node<>(); - firstElement.content = element; - firstElement.nextElement = oldfirst; - size++; - } - - /** - * Checks if the bag contains a specific element - * - * @param element which you want to look for - * @return true if bag contains element, otherwise false - */ - public boolean contains(Element element) { - Iterator iterator = this.iterator(); - while(iterator.hasNext()) { - if (iterator.next().equals(element)) { - return true; - } - } - return false; - } - - /** - * @return an iterator that iterates over the elements in this bag in arbitrary order - */ - public Iterator iterator() { - return new ListIterator<>(firstElement); - } - - @SuppressWarnings("hiding") - private class ListIterator implements Iterator { - private Node currentElement; - - public ListIterator(Node firstElement) { - currentElement = firstElement; - } - - public boolean hasNext() { - return currentElement != null; - } - - /** - * remove is not allowed in a bag - */ - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - - public Element next() { - if (!hasNext()) - throw new NoSuchElementException(); - Element element = currentElement.content; - currentElement = currentElement.nextElement; - return element; - } - } - - /** - * main-method for testing - */ - public static void main(String[] args) { - Bag bag = new Bag<>(); - - bag.add("1"); - bag.add("1"); - bag.add("2"); - - System.out.println("size of bag = " + bag.size()); - for (String s : bag) { - System.out.println(s); - } - - System.out.println(bag.contains(null)); - System.out.println(bag.contains("1")); - System.out.println(bag.contains("3")); - } - -} diff --git a/DataStructures/Buffers/CircularBuffer.java b/DataStructures/Buffers/CircularBuffer.java deleted file mode 100644 index d1f7016..0000000 --- a/DataStructures/Buffers/CircularBuffer.java +++ /dev/null @@ -1,124 +0,0 @@ -import java.util.Random; -import java.util.concurrent.atomic.AtomicInteger; - -public class CircularBuffer { - private char[] _buffer; - public final int _buffer_size; - private int _write_index = 0; - private int _read_index = 0; - private AtomicInteger _readable_data = new AtomicInteger(0); - - public CircularBuffer(int buffer_size) { - if(!IsPowerOfTwo(buffer_size)) { - throw new IllegalArgumentException(); - } - this._buffer_size = buffer_size; - _buffer = new char[buffer_size]; - } - - private boolean IsPowerOfTwo(int i) { - return (i & (i - 1)) == 0; - } - - private int getTrueIndex(int i) { - return i % _buffer_size; - } - - public Character readOutChar() { - Character result = null; - - //if we have data to read - if(_readable_data.get() > 0) { - result = new Character(_buffer[getTrueIndex(_read_index)]); - _readable_data.decrementAndGet(); - _read_index++; - } - - return result; - } - - public boolean writeToCharBuffer(char c) { - boolean result = false; - - //if we can write to the buffer - if(_readable_data.get() < _buffer_size) { - //write to buffer - _buffer[getTrueIndex(_write_index)] = c; - _readable_data.incrementAndGet(); - _write_index++; - result = true; - } - - return result; - } - - private static class TestWriteWorker implements Runnable { - String _alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; - Random _random = new Random(); - CircularBuffer _buffer; - public TestWriteWorker(CircularBuffer cb) { - this._buffer = cb; - } - - private char getRandomChar() { - return _alphabet.charAt(_random.nextInt(_alphabet.length())); - } - - public void run() { - while(!Thread.interrupted()) { - if(!_buffer.writeToCharBuffer(getRandomChar())){ - Thread.yield(); - try{ - Thread.sleep(10); - } catch (InterruptedException e) { - return; - } - } - } - } - } - - private static class TestReadWorker implements Runnable { - CircularBuffer _buffer; - public TestReadWorker(CircularBuffer cb) { - this._buffer = cb; - } - - public void run() { - System.out.println("Printing Buffer:"); - while(!Thread.interrupted()) { - Character c = _buffer.readOutChar(); - if(c != null) { - System.out.print(c.charValue()); - } else { - Thread.yield(); - try { - Thread.sleep(10); - } catch (InterruptedException e) { - System.out.println(); - return; - } - } - } - } - } - - public static void main(String[] args) throws InterruptedException { - int buffer_size = 1024; - //create circular buffer - CircularBuffer cb = new CircularBuffer(buffer_size); - - //create threads that read and write the buffer. - Thread write_thread = new Thread(new TestWriteWorker(cb)); - Thread read_thread = new Thread(new TestReadWorker(cb)); - read_thread.start(); - write_thread.start(); - - //wait some amount of time - Thread.sleep(10000); - - //interrupt threads and exit - write_thread.interrupt(); - read_thread.interrupt(); - } -} diff --git a/DataStructures/CSVFile/src/CSVFile.java b/DataStructures/CSVFile/src/CSVFile.java deleted file mode 100644 index 7bc6186..0000000 --- a/DataStructures/CSVFile/src/CSVFile.java +++ /dev/null @@ -1,692 +0,0 @@ -/* - * author: Christian Bender - * class: CSVFile - * - * This class implements a data structure for handling of - * CSV-files. - * - * Overview - * - * CSVFile(path : string, seperator : char) - * compiles the CSV-file in the inner data structure. - * - * CSVFile (file : File, seperator : char) - * CSVFile (seperator : char) - * - * compile (row : string, seperator : char) : string - * compiles row in its columns. - * - * isPunctuation (ch : char) : boolean - * check whether ch is a punctuation character. - * - * getElementString(row : int, column : int) : string - * returns the specified element. - * - * getElementDouble(row : int, column : int) : double - * returns the specified element as double. - * - * addRow(row : string) : void - * adds a row to the inner data structure. - * without writing into the CSV-file. - * - * set (row : int, column : int, item : string) : void - * replaces the specified item with a newer. - * - * commit() : void - * writes the added data into CSV-file. - * - * commit(path : String) : void - * commit(file : File ) : void - * - * findRow(key : string) : ArrayList - * returns the searched row otherwise null. - * - * contains(key : string) : boolean - * returns true if a row contains 'key' otherwise false. - * - * getColumn(column : int) : ArrayList - * returns the specified column as ArrayList. - * - * getColumn(key : string) : ArrayList - * - * removeRow(key : string) : void - * purpose removes the specified row at the inner data structure. - * - * removeRow(column : int) : void - * - * updateFile() : void - * overwrites the CSV-file with the current inner data structure. - * removed rows are remove in the CSV-file, too. - * - * updateFile(file : File) : void - * - * getNumberOfRows() : int - * returns the number of rows in CSV-File - * it counts only rows that in the table. - * - */ - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collections; -import java.util.regex.Pattern; - -public class CSVFile { - - // the actual CSV-content - private ArrayList> table; - // to tracking added rows. - private ArrayList trackList; - // notice the seperator - private char seperator; - // notice the path of the CSV-File. - private String pathCSVFile; - - - /** - * Constructor - * - * @param path - * @param seperator - * @purpose loads the CSV-file and fills the inner table with the data - */ - public CSVFile(String path, char seperator) { - this(new File(path),seperator); - } - - - /** - * - * @param file - * same constructor different arguments. - */ - public CSVFile(File file, char seperator) { - table = new ArrayList>(); - trackList = new ArrayList(); - pathCSVFile = file.getPath(); - this.seperator = seperator; - ArrayList colums = new ArrayList(); - if (!file.canRead() || !file.isFile()) { - System.out.println("unable to open file"); - System.exit(1); - } - - try (BufferedReader br = Files.newBufferedReader(Paths.get(file.getAbsolutePath()))) { - br.lines().forEach(line -> table.add(compile(line, seperator))); - } catch (IOException e) { - e.printStackTrace(); - } - } - - - /** - * - * @param separator - * @purpose Constructor for empty CSV-File. - */ - public CSVFile(char separator) { - table = new ArrayList>(); - trackList = new ArrayList(); - pathCSVFile = ""; - this.seperator = seperator; - } - - - /** - * - * @param row - * @param sep - * the seperator - * @return ArrayList that contains each column of row. - * @purpose compiles row in its columns. - * - */ - public static ArrayList compile(String row, char sep) { - ArrayList columns = new ArrayList(); - int state = 0; - char ch = ' '; - String column = ""; - int countQuotes = 0; - for (int i = 0; i < row.length(); i++) { - // fetch next character - ch = row.charAt(i); - switch (state) { - - // state 0 - case 0: - if (Character.isLetter(ch) || Character.isDigit(ch)) { - state = 1; - column += ch; - } else if (ch == '"') { // catch " - state = 2; - column += ch; - } else if (Character.isWhitespace(ch)) { - state = 0; - } - break; - // state 1 - case 1: - if ((Character.isLetter(ch) || Character.isDigit(ch) - || isPunctuation(ch) || Character.isWhitespace(ch)) - && (ch != sep)) { - state = 1; - column += ch; - } else if (ch == sep || ch == '\n') { - state = 0; - column = column.trim(); - columns.add(column); - column = ""; - } else { // error case - throw new RuntimeException("compile: invalid" - + " character " + ch); - } - break; - - // state 2 - case 2: - if ((Character.isLetter(ch) || Character.isDigit(ch) - || Character.isWhitespace(ch) || isPunctuation(ch)) - && (ch != '"')) { - state = 2; - column += ch; - } else if (ch == '"') { - state = 3; - column += ch; - } else { // error case - throw new RuntimeException("compile: invalid" - + " character " + ch); - } - break; - - // state 3 - case 3: - if ((Character.isLetter(ch) || Character.isDigit(ch) - || Character.isWhitespace(ch) || isPunctuation(ch)) - && (ch != '"') && (ch != sep)) { - state = 2; - column += ch; - } else if (ch == ',') { - state = 0; - column = column.trim(); - columns.add(column); - column = ""; - } else { // error case - throw new RuntimeException("compile: invalid" - + " character " + ch); - } - - } - - } - // for adding the remaining column - columns.add(column); - column = ""; - return columns; - } - - private static Pattern PATTERN_PUNCTUATION = Pattern.compile("\\p{Punct}"); - /** - * - * @param ch - * @returns true if ch is punctuation character otherwise false. - */ - public static boolean isPunctuation(char ch) { - return PATTERN_PUNCTUATION.matcher("" + ch).matches(); - } - - - /** - * - * @param row - * @param column - * @return the specific element as string - */ - public String getElementString(int row, int column) { - // check arguments - if (row < table.size() && column < table.get(0).size()) { - return table.get(row).get(column); - } else { // error case - throw new RuntimeException("getElementString: " - + " arguments out of bound."); - } - - } - - - /** - * - * @param row - * @param column - * @return the specific element as double - * @throws NumberFormatException - */ - public double getElementDouble(int row, int column) - throws NumberFormatException { - // check arguments - if (row < table.size() && column < table.get(0).size()) { - return Double.parseDouble(table.get(row).get(column)); - } else { // error case - throw new RuntimeException("getElementString: " - + " arguments out of bound."); - } - } - - - /** - * - * @param row - * @purpose adds a row to the inner data structure. - * without writing into the CSV-file. - */ - public void addRow(String row) { - table.add(compile(row, seperator)); - // tracking the last item. - trackList.add(table.size() - 1); - } - - - /** - * @purpose: writes the added data into CSV-file. - */ - public void commit() { - String row = ""; - PrintWriter pWriter = null; - try { - pWriter = new PrintWriter(new BufferedWriter(new FileWriter( - pathCSVFile, true))); - - // writes the tracked rows into CSV-file. - for (int index : trackList) { - for (int i = 0; i < table.get(index).size(); i++) { - if (i != 0) { - row += ","; - row += table.get(index).get(i); - } else { - row += table.get(index).get(i); - } - } - // add newline for next row - row += "\n"; - pWriter.write(row); - // clear row for the next one - row = ""; - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } finally { - if (pWriter != null) { - pWriter.flush(); - pWriter.close(); - } - } - - // remove tracked rows. - trackList.clear(); - } - - - /** - * @param path - * @purpose: writes the added data into CSV-file (given path). - */ - public void commit(String path) { - String row = ""; - pathCSVFile = path; - PrintWriter pWriter = null; - try { - - pWriter = new PrintWriter(new BufferedWriter(new FileWriter( - pathCSVFile, true))); - - // writes the tracked rows into CSV-file. - for (int index : trackList) { - for (int i = 0; i < table.get(index).size(); i++) { - if (i != 0) { - row += ","; - row += table.get(index).get(i); - } else { - row += table.get(index).get(i); - } - } - // add newline for next row - row += "\n"; - pWriter.write(row); - // clear row - row = ""; - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } finally { - if (pWriter != null) { - pWriter.flush(); - pWriter.close(); - } - } - - // remove tracked rows. - trackList.clear(); - } - - /** - * - * @param file - * @purpose: writes the added data into CSV-file (given path). - */ - public void commit(File file) { - String row = ""; - pathCSVFile = file.getPath(); - PrintWriter pWriter = null; - try { - - pWriter = new PrintWriter(new BufferedWriter(new FileWriter( - file, true))); - - // writes the tracked rows into CSV-file. - for (int index : trackList) { - for (int i = 0; i < table.get(index).size(); i++) { - if (i != 0) { - row += ","; - row += table.get(index).get(i); - } else { - row += table.get(index).get(i); - } - } - // add newline for next row - row += "\n"; - pWriter.write(row); - // clear row - row = ""; - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } finally { - if (pWriter != null) { - pWriter.flush(); - pWriter.close(); - } - } - - // remove tracked rows. - trackList.clear(); - } - - - /** - * - * @param key - * @returns the searched row otherwise null. - */ - public ArrayList findRow(String key) { - ArrayList ans = null; - key = key.trim(); - for (int i = 0; i < table.size(); i++) { - for (String item : table.get(i)) { - item = item.trim(); - if (item.equals(key)) { - ans = table.get(i); - break; - } - } - } - return ans; - } - - - /** - * - * @param key - * @returns true if a row contains 'key' otherwise false. - */ - public boolean contains(String key) { - key = key.trim(); - for (int i = 0; i < table.size(); i++) { - for (String item : table.get(i)) { - item = item.trim(); - if (item.equals(key)) { - return true; - } - } - } - return false; - } - - - /** - * - * @param n of type integer - * @returns the specified column as ArrayList. - */ - public ArrayList getColumn(int column) { - ArrayList ans = new ArrayList(); - if (column < table.get(0).size()) { - for (int i = 0; i < table.size(); i++) { - ans.add(table.get(i).get(column)); - } - } else { // error case - throw new RuntimeException("getColumn: column is too large"); - } - return ans; - } - - - /** - * - * @param label of type string - * @returns the specified column at label. - */ - public ArrayList getColumn(String label) { - ArrayList ans = new ArrayList(); - int n = table.get(0).indexOf(label); - // check whether label exists. - if (n != -1) { - for (int i = 1; i < table.size(); i++) { - ans.add(table.get(i).get(n)); - } - } else { // error case - throw new RuntimeException("getColumn: label " + label - + " don't exists."); - } - return ans; - } - - - /** - * - * @param key of type string - * @purpose removes the specified row at the inner data structure. - */ - public void removeRow(String key) { - for (int i = 0; i < table.size(); i++) { - if (table.get(i) != null) { - for (String item : table.get(i)) { - if (item.equals(key)) { - table.set(i,null); - // updates the track list - if (trackList.indexOf(i) != -1) { - trackList.remove(i); - } - } - } - } - } - // removes all null-elements - table.removeAll(Collections.singleton(null)); - } - - - /** - * - * @param n of type integer - * @purpose removes the specified row at the inner data structure. - */ - public void removeRow(int column) { - if (column < table.size()) { - table.set(column, null); - // removes all null-elements - table.removeAll(Collections.singleton(null)); - // updates the track list - if (trackList.indexOf(column) != -1) { - trackList.remove(column); - } - } else { - throw new RuntimeException("removeRow: column is too large"); - } - } - - - /** - * overwrites the CSV-file with the current inner data structure. - * removed rows are remove in the CSV-file, too. - */ - public void updateFile() { - String row = ""; - PrintWriter pWriter = null; - try { - pWriter = new PrintWriter(new BufferedWriter(new FileWriter( - pathCSVFile))); - - // writes the table rows into CSV-file. - for (int i = 0; i < table.size(); i++) { - for (int j = 0; j < table.get(i).size(); j++) { - if (j != 0) { - row += ","; - row += table.get(i).get(j); - } else { - row += table.get(i).get(j); - } - } - // add newline for next row - row += "\n"; - pWriter.write(row); - // clear row - row = ""; - } - - // writes the tracked rows into CSV-file. - for (int index : trackList) { - for (int i = 0; i < table.get(index).size(); i++) { - if (i != 0) { - row += ","; - row += table.get(index).get(i); - } else { - row += table.get(index).get(i); - } - } - // add newline for next row - row += "\n"; - pWriter.write(row); - // clear row for the next one - row = ""; - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } finally { - if (pWriter != null) { - pWriter.flush(); - pWriter.close(); - } - } - - // remove tracked rows. - trackList.clear(); - } - - - /** - * - * @param file - * overwrites the CSV-file with the current inner data structure. - * removed rows are remove in the CSV-file, too. - */ - public void updateFile(File file) { - String row = ""; - PrintWriter pWriter = null; - try { - pWriter = new PrintWriter(new BufferedWriter(new FileWriter( - file))); - - // writes the table rows into CSV-file. - for (int i = 0; i < table.size(); i++) { - for (int j = 0; j < table.get(i).size(); j++) { - if (j != 0) { - row += ","; - row += table.get(i).get(j); - } else { - row += table.get(i).get(j); - } - } - // add newline for next row - row += "\n"; - pWriter.write(row); - // clear row - row = ""; - } - - // writes the tracked rows into CSV-file. - for (int index : trackList) { - for (int i = 0; i < table.get(index).size(); i++) { - if (i != 0) { - row += ","; - row += table.get(index).get(i); - } else { - row += table.get(index).get(i); - } - } - // add newline for next row - row += "\n"; - pWriter.write(row); - // clear row - row = ""; - } - } catch (IOException ioe) { - ioe.printStackTrace(); - } finally { - if (pWriter != null) { - pWriter.flush(); - pWriter.close(); - } - } - - // remove tracked rows. - trackList.clear(); - } - - - /** - * - * @returns the number of rows in CSV-File - * it counts only rows that in the table. - */ - public int getNumberOfRows() { - return table.size(); - } - - - /** - * - * @param row - * @param column - * @param item - * @purpose replaces the specified item with a newer. - */ - public void set(int row, int column, String item) { - if (row < table.size()) { - if (column < table.get(row).size()) { - table.get(row).set(column, item); - } else { - throw new RuntimeException("set: column is too large!"); - } - } else { - throw new RuntimeException("set: row is too large!"); - } - } - -} diff --git a/DataStructures/CSVFile/src/TestCSVFile.java b/DataStructures/CSVFile/src/TestCSVFile.java deleted file mode 100644 index 0f63c90..0000000 --- a/DataStructures/CSVFile/src/TestCSVFile.java +++ /dev/null @@ -1,133 +0,0 @@ -import static org.junit.Assert.*; - -import org.junit.Before; -import org.junit.Test; - -import java.io.File; -import java.util.ArrayList; - -public class TestCSVFile { - - - @Test - public void testConstructor1() { - CSVFile testObj = new CSVFile("testData.csv",','); - assertEquals(testObj.getElementDouble(1, 1),65.78331, 0.001); - assertEquals(testObj.getElementString(1, 1),"65.78331"); - assertEquals(testObj.getElementString(0, 1),"\"Height(Inches)\""); - assertEquals(testObj.getNumberOfRows(),25029); - } - - @Test - public void testConstructor2() { - CSVFile testObj = new CSVFile(','); - testObj.addRow("1, 65.78331, 112.9925"); - testObj.addRow("12, 67.62333, 114.143"); - testObj.addRow("6, 68.69784, 123.3024"); -// testObj.commit("testData2.csv"); -// testObj.commit(new File("testData2.csv")); - } - - @Test - public void testConstructor3() { - CSVFile testObj = new CSVFile(new File("testData.csv"),','); - assertEquals(testObj.getElementDouble(1, 1),65.78331, 0.001); - assertEquals(testObj.getElementString(1, 1),"65.78331"); - assertEquals(testObj.getElementString(0, 1),"\"Height(Inches)\""); - } - - @Test - public void testIsPunctuation() { - assertTrue(CSVFile.isPunctuation(':')); - } - - @Test - public void testCompile() { - ArrayList columns = new ArrayList(); - columns.add("2"); - columns.add("71.51521"); - columns.add("136.4873"); - - - assertEquals(CSVFile.compile("2, 71.51521, 136.4873", ','),columns); - columns.clear(); - - // test successful - columns.add("\"Index\""); - columns.add("\"Height(Inches)\""); - columns.add("\"Weight(Pounds)\""); - - assertEquals(CSVFile.compile("\"Index\", \"Height(Inches)\", " - + "\"Weight(Pounds)\"", ','),columns); - - - } - - @Test - public void testAddRowCommit() { -// CSVFile testObj = new CSVFile("testData.csv",','); -// testObj.addRow("1,1,1"); -// testObj.addRow("1,2,3"); -// testObj.commit(); - // test successful - } - - @Test - public void testFindRow() { - CSVFile testObj = new CSVFile("testData.csv",','); - ArrayList columns = new ArrayList(); - columns.add("2"); - columns.add("71.51521"); - columns.add("136.4873"); - assertEquals(testObj.findRow("71.51521"),columns); - } - - @Test - public void testContains() { - CSVFile testObj = new CSVFile("testData.csv",','); - ArrayList columns = new ArrayList(); - columns.add("2"); - columns.add("71.51521"); - columns.add("136.4873"); - assertTrue(testObj.contains("71.51521")); - assertFalse(testObj.contains("9889678")); - } - - - @Test - public void testGetColumn() { - CSVFile testObj = new CSVFile("testData2.csv",','); - CSVFile testObj2 = new CSVFile("testData3.csv",','); - ArrayList columns = new ArrayList(); - columns.add("height"); - columns.add("65.78331"); - columns.add("67.62333"); - assertEquals(testObj.getColumn(1),columns); - columns.clear(); - columns.add("65.78331"); - columns.add("67.62333"); - assertEquals(testObj.getColumn("height"),columns); - columns.clear(); - assertEquals(testObj2.getColumn("height"),columns); - } - - - @Test - public void testRemoving() { - CSVFile testObj = new CSVFile("testData4.csv",','); - //testObj.removeRow("68.69784"); -// testObj.removeRow(0); -// testObj.updateFile(new File("testData4.csv")); - // test successful - } - - @Test - public void testSet() { -// CSVFile testObj = new CSVFile("testData4.csv",','); -// testObj.set(6, 2, "80"); -// testObj.updateFile(); - // test succesfull - } - - -} diff --git a/DataStructures/CSVFile/testData.csv b/DataStructures/CSVFile/testData.csv deleted file mode 100644 index 9b272c8..0000000 --- a/DataStructures/CSVFile/testData.csv +++ /dev/null @@ -1,25029 +0,0 @@ -"Index", "Height(Inches)", "Weight(Pounds)" -1, 65.78331, 112.9925 -2, 71.51521, 136.4873 -3, 69.39874, 153.0269 -4, 68.2166, 142.3354 -5, 67.78781, 144.2971 -6, 68.69784, 123.3024 -7, 69.80204, 141.4947 -8, 70.01472, 136.4623 -9, 67.90265, 112.3723 -10, 66.78236, 120.6672 -11, 66.48769, 127.4516 -12, 67.62333, 114.143 -13, 68.30248, 125.6107 -14, 67.11656, 122.4618 -15, 68.27967, 116.0866 -16, 71.0916, 139.9975 -17, 66.461, 129.5023 -18, 68.64927, 142.9733 -19, 71.23033, 137.9025 -20, 67.13118, 124.0449 -21, 67.83379, 141.2807 -22, 68.87881, 143.5392 -23, 63.48115, 97.90191 -24, 68.42187, 129.5027 -25, 67.62804, 141.8501 -26, 67.20864, 129.7244 -27, 70.84235, 142.4235 -28, 67.49434, 131.5502 -29, 66.53401, 108.3324 -30, 65.44098, 113.8922 -31, 69.5233, 103.3016 -32, 65.8132, 120.7536 -33, 67.8163, 125.7886 -34, 70.59505, 136.2225 -35, 71.80484, 140.1015 -36, 69.20613, 128.7487 -37, 66.80368, 141.7994 -38, 67.65893, 121.2319 -39, 67.80701, 131.3478 -40, 64.04535, 106.7115 -41, 68.57463, 124.3598 -42, 65.18357, 124.8591 -43, 69.65814, 139.6711 -44, 67.96731, 137.3696 -45, 65.98088, 106.4499 -46, 68.67249, 128.7639 -47, 66.88088, 145.6837 -48, 67.69868, 116.819 -49, 69.82117, 143.6215 -50, 69.08817, 134.9325 -51, 69.91479, 147.0219 -52, 67.33182, 126.3285 -53, 70.26939, 125.4839 -54, 69.10344, 115.7084 -55, 65.38356, 123.4892 -56, 70.18447, 147.8926 -57, 70.40617, 155.8987 -58, 66.54376, 128.0742 -59, 66.36418, 119.3701 -60, 67.537, 133.8148 -61, 66.50418, 128.7325 -62, 68.99958, 137.5453 -63, 68.30355, 129.7604 -64, 67.01255, 128.824 -65, 70.80592, 135.3165 -66, 68.21951, 109.6113 -67, 69.05914, 142.4684 -68, 67.73103, 132.749 -69, 67.21568, 103.5275 -70, 67.36763, 124.7299 -71, 65.27033, 129.3137 -72, 70.84278, 134.0175 -73, 69.92442, 140.3969 -74, 64.28508, 102.8351 -75, 68.2452, 128.5214 -76, 66.35708, 120.2991 -77, 68.36275, 138.6036 -78, 65.4769, 132.9574 -79, 69.71947, 115.6233 -80, 67.72554, 122.524 -81, 68.63941, 134.6254 -82, 66.78405, 121.8986 -83, 70.05147, 155.3767 -84, 66.27848, 128.9418 -85, 69.20198, 129.1013 -86, 69.13481, 139.4733 -87, 67.36436, 140.8901 -88, 70.09297, 131.5916 -89, 70.1766, 121.1232 -90, 68.22556, 131.5127 -91, 68.12932, 136.5479 -92, 70.24256, 141.4896 -93, 71.48752, 140.6104 -94, 69.20477, 112.1413 -95, 70.06306, 133.457 -96, 70.55703, 131.8001 -97, 66.28644, 120.0285 -98, 63.42577, 123.0972 -99, 66.76711, 128.1432 -100, 68.88741, 115.4759 -101, 64.87434, 102.0927 -102, 67.09272, 130.353 -103, 68.34761, 134.1842 -104, 65.61073, 98.64133 -105, 67.75551, 114.5599 -106, 68.0212, 123.4917 -107, 67.66193, 123.048 -108, 66.3146, 126.4772 -109, 69.43706, 128.417 -110, 63.83624, 127.1941 -111, 67.72277, 122.0562 -112, 70.05098, 127.6064 -113, 70.18602, 131.6423 -114, 65.94588, 111.8955 -115, 70.007, 122.039 -116, 68.61129, 128.5547 -117, 68.80817, 132.6792 -118, 69.76212, 136.0632 -119, 65.45539, 115.9403 -120, 68.82534, 136.9041 -121, 65.8003, 119.8804 -122, 67.21474, 109.0055 -123, 69.42021, 128.2705 -124, 68.94396, 135.2913 -125, 67.9415, 106.8558 -126, 65.62506, 123.2939 -127, 66.49607, 109.5143 -128, 67.92809, 119.3087 -129, 68.89415, 140.2402 -130, 70.241, 133.9841 -131, 68.26623, 132.5807 -132, 71.23161, 130.6988 -133, 69.09747, 115.5637 -134, 64.39693, 123.7941 -135, 71.09585, 128.1427 -136, 68.21868, 135.9646 -137, 65.91721, 116.6273 -138, 67.4369, 126.8241 -139, 73.90107, 151.3913 -140, 69.98149, 130.4022 -141, 69.51862, 136.2068 -142, 65.18437, 113.3989 -143, 68.00869, 125.3287 -144, 68.3384, 127.5846 -145, 65.18417, 107.1564 -146, 68.26209, 116.4588 -147, 68.56865, 133.8402 -148, 64.49675, 112.8901 -149, 68.71053, 130.7568 -150, 68.89148, 137.7571 -151, 69.54011, 125.4036 -152, 67.39964, 138.4659 -153, 66.47521, 120.8184 -154, 66.01217, 140.1539 -155, 72.44434, 136.7397 -156, 64.12642, 106.1139 -157, 70.98112, 158.9562 -158, 67.50124, 108.7868 -159, 72.01515, 138.7758 -160, 65.31143, 115.9136 -161, 67.07509, 146.2922 -162, 64.39148, 109.8765 -163, 69.37003, 139.0499 -164, 68.37921, 119.9001 -165, 65.31018, 128.3069 -166, 67.1369, 127.2428 -167, 68.39468, 115.2306 -168, 66.2918, 124.7975 -169, 67.1866, 126.9511 -170, 65.99156, 111.2711 -171, 69.43393, 122.6089 -172, 67.97463, 124.2084 -173, 67.76133, 124.6453 -174, 65.27864, 119.5169 -175, 73.83364, 139.2983 -176, 66.81312, 104.8265 -177, 66.89411, 123.0424 -178, 65.73568, 118.8923 -179, 65.98283, 121.4939 -180, 66.58396, 119.2488 -181, 67.11294, 135.0239 -182, 65.87481, 116.228 -183, 66.78067, 109.1731 -184, 68.73577, 124.2237 -185, 66.22666, 141.1645 -186, 65.95968, 129.1501 -187, 68.58372, 127.8693 -188, 66.59347, 120.9244 -189, 66.96574, 127.6466 -190, 68.08015, 101.4693 -191, 70.19025, 144.9927 -192, 65.52149, 110.9523 -193, 67.45905, 132.8625 -194, 67.40985, 146.3385 -195, 69.66158, 145.5894 -196, 65.79799, 120.8431 -197, 66.10558, 115.7813 -198, 68.23987, 128.3019 -199, 68.02403, 127.4718 -200, 71.39044, 127.8761 -201, 65.7316, 121.4997 -202, 66.43358, 112.7148 -203, 70.01309, 135.002 -204, 69.48146, 128.6789 -205, 68.62764, 124.4062 -206, 68.36275, 140.026 -207, 68.39028, 117.519 -208, 68.77413, 143.8737 -209, 69.9236, 141.1703 -210, 71.55542, 155.9414 -211, 68.44764, 134.0093 -212, 66.71398, 130.0975 -213, 66.68413, 106.2265 -214, 67.93699, 112.0489 -215, 68.89855, 136.1884 -216, 67.29191, 131.236 -217, 69.57212, 131.3231 -218, 67.67479, 119.5261 -219, 69.04155, 116.9965 -220, 67.96765, 138.5255 -221, 65.83982, 109.6518 -222, 65.77288, 130.1569 -223, 71.14106, 137.1114 -224, 67.83055, 113.759 -225, 65.0693, 114.9725 -226, 69.70745, 127.7149 -227, 69.92983, 121.9972 -228, 66.11569, 117.9607 -229, 68.61364, 127.7141 -230, 68.9976, 117.9619 -231, 66.79171, 125.1554 -232, 68.02363, 141.1026 -233, 69.67258, 145.4822 -234, 71.82178, 116.065 -235, 72.74676, 135.7458 -236, 67.27951, 132.9248 -237, 67.41015, 115.6622 -238, 68.5315, 114.3184 -239, 68.47126, 148.952 -240, 68.51867, 142.1878 -241, 63.72529, 134.104 -242, 67.70483, 141.8926 -243, 69.47115, 138.7444 -244, 66.70198, 134.449 -245, 65.23126, 117.0167 -246, 69.89473, 115.6752 -247, 69.83048, 134.7905 -248, 65.3979, 120.5746 -249, 68.32214, 120.0835 -250, 65.93895, 84.3598 -251, 70.09805, 138.9394 -252, 66.05531, 143.5245 -253, 68.23481, 123.1347 -254, 65.21758, 115.5261 -255, 69.16173, 120.9844 -256, 67.60064, 120.6473 -257, 67.28621, 124.0352 -258, 66.84323, 117.2238 -259, 68.08281, 127.9598 -260, 66.56991, 116.7527 -261, 70.16973, 121.9957 -262, 67.85113, 123.9952 -263, 66.62309, 108.855 -264, 63.68816, 104.6574 -265, 68.0356, 132.248 -266, 66.941, 127.1834 -267, 66.26292, 125.1209 -268, 70.7301, 133.322 -269, 70.70844, 122.3364 -270, 73.26872, 130.2636 -271, 63.79021, 116.7431 -272, 67.84109, 125.8534 -273, 67.78058, 100.627 -274, 67.23901, 118.4945 -275, 66.75701, 137.1255 -276, 69.03098, 118.6991 -277, 68.52652, 124.1641 -278, 64.65419, 124.9442 -279, 65.14295, 126.3889 -280, 66.74124, 121.5255 -281, 66.99923, 133.2951 -282, 70.26611, 127.4072 -283, 67.57666, 125.08 -284, 66.30582, 102.8114 -285, 68.90702, 134.2212 -286, 65.60543, 100.9758 -287, 68.00189, 145.8886 -288, 69.93715, 155.3046 -289, 70.1459, 138.7175 -290, 66.66364, 116.2611 -291, 69.40676, 120.6087 -292, 66.80598, 114.4083 -293, 67.70048, 133.3406 -294, 69.13438, 92.74955 -295, 67.53769, 131.7825 -296, 65.77912, 118.3865 -297, 66.25769, 131.1466 -298, 67.39038, 130.2033 -299, 64.94327, 129.1836 -300, 69.25699, 143.1445 -301, 69.07739, 138.7307 -302, 69.64403, 130.9528 -303, 69.07705, 124.3032 -304, 68.01304, 135.3702 -305, 68.85664, 124.1988 -306, 63.19158, 111.2389 -307, 65.57591, 129.4037 -308, 69.12101, 127.7444 -309, 69.78765, 121.3311 -310, 67.48203, 118.2183 -311, 69.08809, 123.3441 -312, 68.5529, 151.9118 -313, 68.21327, 115.3108 -314, 67.1012, 122.3844 -315, 71.23661, 129.2323 -316, 69.11946, 138.2824 -317, 65.49848, 144.0565 -318, 66.58706, 120.8482 -319, 67.99831, 113.3034 -320, 72.57747, 149.3227 -321, 67.97585, 130.6373 -322, 66.62347, 122.387 -323, 67.29574, 133.8677 -324, 65.95951, 134.8336 -325, 66.54011, 137.8363 -326, 68.07723, 112.6812 -327, 65.83291, 121.1964 -328, 69.23721, 114.9262 -329, 64.69413, 110.3762 -330, 69.21372, 126.0337 -331, 67.16792, 118.7008 -332, 67.8467, 119.3108 -333, 69.27389, 150.7397 -334, 67.90547, 121.1142 -335, 67.076, 118.4065 -336, 70.01531, 142.759 -337, 70.05454, 145.6305 -338, 70.86714, 127.3425 -339, 66.0586, 115.9678 -340, 65.23745, 104.4441 -341, 68.7413, 138.4905 -342, 69.51946, 145.5049 -343, 70.30764, 124.4065 -344, 67.29982, 124.1866 -345, 67.60582, 126.1659 -346, 67.85566, 138.8125 -347, 66.46536, 121.5515 -348, 68.92071, 114.2555 -349, 68.46886, 129.4022 -350, 69.5193, 137.5583 -351, 70.23956, 134.4996 -352, 67.85651, 127.7103 -353, 68.00435, 115.6709 -354, 67.13983, 131.5906 -355, 68.09931, 127.5839 -356, 68.99077, 125.7211 -357, 69.32618, 119.9885 -358, 70.09286, 140.8676 -359, 68.74304, 136.9164 -360, 64.18633, 118.4759 -361, 66.09074, 129.5516 -362, 69.24418, 152.0714 -363, 69.66512, 120.8646 -364, 68.42721, 136.1027 -365, 68.28613, 130.0611 -366, 69.37684, 131.7743 -367, 68.35315, 139.38 -368, 72.32489, 168.229 -369, 70.37159, 127.6446 -370, 65.72927, 131.8008 -371, 66.49627, 122.8561 -372, 70.81339, 140.2133 -373, 67.37579, 142.6929 -374, 67.79709, 137.4299 -375, 68.1607, 126.0392 -376, 68.85782, 143.5985 -377, 67.71342, 122.62 -378, 64.66007, 108.6044 -379, 65.73721, 100.6617 -380, 68.42441, 116.1397 -381, 68.88946, 140.5293 -382, 68.27367, 125.6907 -383, 69.18045, 134.3329 -384, 72.60996, 136.4649 -385, 66.04157, 127.8822 -386, 69.2288, 123.1361 -387, 68.87697, 116.3375 -388, 66.46042, 124.5581 -389, 69.30444, 125.7853 -390, 67.58249, 107.5905 -391, 69.41816, 143.0236 -392, 67.46867, 118.7434 -393, 66.44873, 118.9856 -394, 68.76185, 131.8744 -395, 63.76881, 119.3691 -396, 69.03663, 126.1223 -397, 66.48966, 126.6122 -398, 66.74224, 113.5597 -399, 67.69394, 115.8413 -400, 66.69066, 130.2738 -401, 67.02877, 125.4542 -402, 65.91096, 117.1655 -403, 70.0304, 137.3184 -404, 69.26978, 149.4447 -405, 70.07695, 151.0695 -406, 64.90942, 116.9994 -407, 69.68744, 138.1787 -408, 67.56524, 127.621 -409, 63.85529, 120.7514 -410, 71.6189, 144.2537 -411, 64.98993, 105.7939 -412, 64.60759, 120.1567 -413, 62.01666, 109.0848 -414, 65.28516, 125.971 -415, 67.70163, 110.2325 -416, 70.85794, 134.4706 -417, 68.17075, 115.5067 -418, 67.45006, 125.1086 -419, 71.04224, 116.4113 -420, 67.83032, 133.3944 -421, 67.15488, 108.7478 -422, 68.30289, 134.3986 -423, 65.41208, 131.2085 -424, 68.66755, 130.8318 -425, 70.06733, 127.0838 -426, 69.13413, 119.4067 -427, 67.02078, 105.5616 -428, 65.52274, 134.4733 -429, 70.19808, 132.6897 -430, 67.66866, 126.058 -431, 69.73257, 126.3532 -432, 67.61719, 142.3603 -433, 70.79589, 124.5873 -434, 69.65804, 122.3604 -435, 66.73277, 123.2298 -436, 67.58008, 131.4049 -437, 65.25317, 124.3037 -438, 70.71387, 128.3836 -439, 71.27374, 136.853 -440, 66.55913, 118.0569 -441, 68.04247, 121.4969 -442, 68.11699, 119.2811 -443, 71.2367, 126.5545 -444, 66.92387, 129.2477 -445, 71.10381, 134.7804 -446, 69.41466, 146.0725 -447, 69.16807, 162.4109 -448, 68.57725, 130.1885 -449, 69.60315, 132.1941 -450, 69.05087, 127.4591 -451, 68.28699, 125.3466 -452, 69.25276, 134.7559 -453, 68.23862, 121.9395 -454, 67.6868, 125.6688 -455, 68.84083, 145.956 -456, 69.52061, 119.9207 -457, 66.97668, 111.5093 -458, 72.0053, 138.676 -459, 67.44482, 135.0151 -460, 66.06214, 116.509 -461, 65.5747, 123.9575 -462, 68.30171, 136.952 -463, 71.02603, 153.0797 -464, 70.76882, 126.357 -465, 67.50812, 145.0614 -466, 69.50936, 135.1739 -467, 66.4455, 108.806 -468, 68.5689, 110.5155 -469, 67.01296, 138.2685 -470, 68.70004, 119.5111 -471, 68.23013, 115.3214 -472, 70.40713, 132.3684 -473, 65.69989, 93.99438 -474, 65.7031, 127.4051 -475, 68.48055, 134.3024 -476, 66.62891, 124.9721 -477, 66.84285, 124.072 -478, 69.89734, 133.5476 -479, 67.6543, 134.1509 -480, 68.30917, 130.2489 -481, 69.74848, 138.0935 -482, 68.57906, 126.6064 -483, 68.14477, 131.8076 -484, 67.98093, 131.7363 -485, 64.82535, 117.6261 -486, 69.20785, 126.1943 -487, 69.2656, 127.5132 -488, 70.9403, 142.4785 -489, 69.07826, 139.444 -490, 66.20183, 110.3204 -491, 71.05779, 131.9541 -492, 68.99493, 129.2037 -493, 70.96089, 124.3513 -494, 66.02496, 126.5251 -495, 69.8641, 149.2303 -496, 66.82802, 142.1577 -497, 69.09424, 127.1436 -498, 66.81425, 122.3353 -499, 67.13183, 112.6659 -500, 64.57428, 134.2647 -501, 68.68038, 120.6936 -502, 67.53724, 115.783 -503, 71.17732, 128.6855 -504, 70.53514, 134.7611 -505, 71.53411, 118.3419 -506, 66.77301, 106.1557 -507, 66.33636, 126.3823 -508, 64.83095, 114.3716 -509, 68.38247, 130.2787 -510, 68.05038, 123.3066 -511, 69.09149, 122.8571 -512, 69.91046, 125.6932 -513, 68.40737, 111.7247 -514, 68.32559, 125.5516 -515, 66.95555, 119.9702 -516, 70.54816, 132.6043 -517, 69.37805, 132.6738 -518, 67.52012, 117.4521 -519, 64.87142, 101.8549 -520, 69.13396, 128.4418 -521, 68.81192, 134.0414 -522, 67.56446, 127.7511 -523, 68.16772, 127.6172 -524, 65.80687, 139.3971 -525, 64.92276, 113.9381 -526, 68.35584, 147.5188 -527, 66.71546, 132.6523 -528, 69.18196, 132.8139 -529, 65.88795, 105.0942 -530, 66.03733, 127.5187 -531, 69.44194, 130.7305 -532, 67.14847, 128.5815 -533, 65.69442, 122.5699 -534, 69.42723, 157.2961 -535, 66.54503, 121.1097 -536, 69.04469, 147.5061 -537, 67.62036, 117.493 -538, 69.59105, 132.4472 -539, 68.12343, 118.1774 -540, 71.22641, 123.7319 -541, 66.43285, 130.365 -542, 66.31808, 122.8882 -543, 68.02724, 107.8693 -544, 68.2876, 118.591 -545, 66.91609, 125.6467 -546, 71.77546, 148.6016 -547, 66.04535, 150.279 -548, 69.01455, 127.0678 -549, 68.70744, 128.7122 -550, 65.012, 118.4233 -551, 66.05857, 125.3879 -552, 71.16403, 149.2676 -553, 67.55274, 107.3484 -554, 68.83455, 133.6992 -555, 68.11811, 124.8508 -556, 67.90528, 112.7028 -557, 67.64085, 127.8407 -558, 69.78282, 134.1615 -559, 67.99889, 138.6031 -560, 69.41465, 126.044 -561, 70.42989, 129.5856 -562, 67.67519, 134.1054 -563, 67.88036, 106.1251 -564, 68.06905, 127.0561 -565, 66.99435, 121.9241 -566, 71.57689, 150.7365 -567, 64.36564, 116.0061 -568, 67.93011, 125.4748 -569, 69.91863, 131.6099 -570, 69.93864, 129.0696 -571, 66.79766, 129.1117 -572, 70.11119, 148.1624 -573, 68.94814, 105.388 -574, 68.02886, 110.5447 -575, 69.36148, 118.6402 -576, 68.44886, 122.8151 -577, 65.70282, 124.887 -578, 69.55674, 135.7695 -579, 65.84635, 116.4563 -580, 68.79983, 125.3617 -581, 69.03835, 133.122 -582, 67.36352, 138.3328 -583, 70.35788, 124.4972 -584, 69.88828, 136.7205 -585, 65.15319, 115.0153 -586, 69.40907, 132.6366 -587, 68.50874, 143.1323 -588, 65.71552, 134.7422 -589, 63.98308, 122.6246 -590, 70.07685, 153.5634 -591, 68.42542, 126.289 -592, 68.23665, 134.7206 -593, 67.82856, 134.5987 -594, 66.31277, 118.3945 -595, 69.75128, 121.2997 -596, 65.70901, 132.2844 -597, 66.88227, 139.0617 -598, 67.2791, 110.698 -599, 70.63357, 154.1073 -600, 69.9377, 124.1592 -601, 65.87671, 134.5173 -602, 72.44694, 138.2622 -603, 70.07052, 149.0801 -604, 67.68486, 127.0075 -605, 66.1151, 117.8222 -606, 69.94355, 148.9096 -607, 68.24317, 128.2151 -608, 68.80144, 129.6944 -609, 66.61818, 125.5674 -610, 70.18701, 128.7947 -611, 65.58971, 124.187 -612, 68.69566, 151.4167 -613, 64.88639, 106.9803 -614, 69.81993, 145.6221 -615, 66.33962, 121.5926 -616, 70.4434, 130.9386 -617, 69.99163, 135.6203 -618, 70.13617, 123.9315 -619, 67.1793, 131.9955 -620, 68.2034, 117.484 -621, 67.76121, 129.6577 -622, 64.79753, 122.3706 -623, 66.47871, 114.5867 -624, 66.98337, 116.5401 -625, 65.69991, 139.4307 -626, 66.82705, 123.4822 -627, 66.35141, 132.5492 -628, 70.13491, 143.4013 -629, 70.11565, 132.9429 -630, 64.56145, 98.8972 -631, 68.15724, 122.4342 -632, 67.1475, 104.6767 -633, 70.88927, 142.7847 -634, 68.16218, 130.9283 -635, 71.19657, 143.827 -636, 67.92444, 142.2832 -637, 65.30204, 107.9441 -638, 66.40756, 105.6891 -639, 71.30647, 125.4007 -640, 69.05997, 106.4195 -641, 65.95442, 118.5371 -642, 69.63776, 136.7836 -643, 71.10495, 145.9328 -644, 66.21851, 129.637 -645, 66.13469, 108.4955 -646, 67.7851, 121.2537 -647, 66.67737, 135.7399 -648, 69.99408, 137.5026 -649, 71.1441, 124.0052 -650, 68.63927, 128.8613 -651, 69.08548, 133.6811 -652, 67.97389, 106.5185 -653, 65.94809, 113.0398 -654, 66.02102, 125.9639 -655, 71.23576, 140.2945 -656, 67.52674, 143.229 -657, 71.06935, 145.8063 -658, 68.27178, 128.1697 -659, 67.31932, 134.1839 -660, 68.98848, 140.2166 -661, 68.404, 146.3453 -662, 67.092, 132.0784 -663, 66.76866, 122.13 -664, 65.64636, 131.4693 -665, 65.34105, 129.5167 -666, 68.18299, 125.7451 -667, 70.65924, 153.1384 -668, 65.94401, 124.5559 -669, 69.62792, 134.8225 -670, 68.29965, 115.3877 -671, 70.06075, 117.9618 -672, 68.43602, 124.5647 -673, 69.27012, 134.4043 -674, 67.70511, 129.3092 -675, 70.89315, 133.1423 -676, 70.54313, 147.3609 -677, 71.58086, 155.0132 -678, 68.42301, 126.2905 -679, 69.35781, 134.4605 -680, 70.445, 134.0296 -681, 67.38153, 128.9248 -682, 67.50767, 123.0543 -683, 68.52054, 112.1788 -684, 66.80858, 111.7443 -685, 72.38532, 148.4615 -686, 68.51642, 136.7459 -687, 70.79791, 133.2068 -688, 66.21905, 116.8855 -689, 68.31167, 124.8542 -690, 67.1715, 121.5809 -691, 67.7714, 123.197 -692, 67.47328, 137.1255 -693, 67.77463, 121.4941 -694, 69.20099, 150.9398 -695, 70.04297, 142.3009 -696, 70.56979, 134.7527 -697, 66.45379, 133.5585 -698, 67.68132, 136.0895 -699, 65.75638, 95.20216 -700, 69.3549, 119.7404 -701, 70.5902, 152.9146 -702, 67.27626, 140.1991 -703, 68.48853, 145.2503 -704, 67.02188, 119.4855 -705, 65.77613, 123.512 -706, 65.96579, 110.6754 -707, 68.18868, 111.4951 -708, 72.08595, 139.4849 -709, 66.85358, 133.088 -710, 69.10929, 133.5196 -711, 64.5909, 112.7698 -712, 67.03849, 124.7975 -713, 68.99156, 123.4224 -714, 70.59872, 142.0921 -715, 70.08988, 116.2814 -716, 65.6844, 131.1256 -717, 67.0982, 131.2493 -718, 66.03932, 127.2422 -719, 69.26423, 122.4523 -720, 66.61351, 115.2431 -721, 68.11738, 126.9532 -722, 69.73059, 143.4439 -723, 64.02042, 125.377 -724, 66.23753, 109.0095 -725, 72.46761, 139.2411 -726, 66.21938, 102.182 -727, 71.2978, 144.3898 -728, 63.1255, 83.08527 -729, 70.93034, 145.3938 -730, 68.25489, 134.9267 -731, 64.78014, 134.678 -732, 65.42982, 111.4963 -733, 68.91361, 119.7951 -734, 64.96937, 95.70426 -735, 66.15237, 117.159 -736, 65.98386, 127.2356 -737, 69.2435, 144.9205 -738, 68.31982, 122.8464 -739, 70.11607, 134.19 -740, 68.63521, 124.9776 -741, 67.74289, 135.8441 -742, 64.58641, 120.8222 -743, 64.66165, 125.0174 -744, 65.90771, 133.5474 -745, 65.77649, 124.5583 -746, 67.1506, 135.9691 -747, 72.24339, 143.5738 -748, 68.73199, 130.5725 -749, 67.57019, 127.192 -750, 70.36234, 141.2372 -751, 63.62233, 107.4236 -752, 66.20711, 122.3234 -753, 66.22114, 111.6055 -754, 70.0722, 137.8915 -755, 69.6563, 142.8742 -756, 66.25043, 114.4349 -757, 68.0704, 128.2736 -758, 67.14808, 134.5725 -759, 68.76609, 140.1034 -760, 68.12075, 121.977 -761, 65.72987, 111.4248 -762, 69.17439, 135.0756 -763, 70.36351, 132.9826 -764, 70.78557, 117.7566 -765, 70.88083, 134.9877 -766, 66.62148, 151.6121 -767, 69.9829, 128.9287 -768, 66.92866, 120.1575 -769, 71.45806, 125.6007 -770, 69.66344, 127.8292 -771, 69.30943, 136.1354 -772, 66.59775, 116.2841 -773, 64.20209, 127.0777 -774, 68.23051, 125.7165 -775, 70.09021, 121.0749 -776, 70.9755, 122.7382 -777, 64.93134, 119.4545 -778, 66.90106, 132.9048 -779, 69.19803, 132.8687 -780, 68.4149, 124.3486 -781, 66.3163, 132.2198 -782, 72.13467, 142.804 -783, 65.74613, 129.605 -784, 69.96677, 128.5326 -785, 65.11417, 112.9919 -786, 67.43294, 122.0795 -787, 66.39785, 118.396 -788, 67.18769, 130.1299 -789, 67.68597, 111.6824 -790, 67.77469, 142.2452 -791, 63.62937, 122.6049 -792, 66.447, 122.8198 -793, 71.9233, 119.1123 -794, 67.92214, 139.4335 -795, 68.01143, 141.3353 -796, 67.76524, 119.787 -797, 69.19791, 136.326 -798, 67.00109, 118.4099 -799, 67.09659, 137.692 -800, 69.85144, 129.078 -801, 67.42782, 123.4642 -802, 68.1104, 115.4311 -803, 68.29433, 129.931 -804, 69.45176, 135.9563 -805, 69.08219, 127.8134 -806, 70.91753, 139.1014 -807, 64.20566, 109.2132 -808, 71.10315, 124.6154 -809, 72.08523, 136.221 -810, 66.15119, 120.4722 -811, 67.52898, 116.1659 -812, 67.17586, 115.5093 -813, 72.92955, 141.9961 -814, 65.54112, 135.4869 -815, 69.08487, 135.1305 -816, 65.28991, 108.2494 -817, 68.53447, 125.1277 -818, 71.32802, 142.8947 -819, 66.88095, 128.2978 -820, 67.91196, 128.268 -821, 67.00238, 103.5665 -822, 68.27584, 156.1069 -823, 66.20276, 104.9661 -824, 64.24214, 121.6365 -825, 67.43738, 132.0066 -826, 64.50081, 118.4079 -827, 68.89607, 135.3898 -828, 70.32908, 140.6633 -829, 64.31742, 111.6703 -830, 67.11253, 128.0328 -831, 68.01206, 130.4737 -832, 68.25267, 128.2127 -833, 67.76873, 142.8202 -834, 67.44291, 123.0804 -835, 65.73581, 117.8771 -836, 69.64372, 130.9274 -837, 71.92818, 129.1735 -838, 69.39435, 144.5784 -839, 67.14717, 115.8635 -840, 69.1469, 116.5322 -841, 66.90594, 141.9947 -842, 67.838, 132.1304 -843, 68.09614, 135.2607 -844, 66.14093, 127.0684 -845, 71.16386, 129.844 -846, 67.55757, 134.5066 -847, 70.01279, 121.3609 -848, 72.56431, 143.1486 -849, 66.60224, 124.7741 -850, 68.51802, 120.1546 -851, 66.34638, 139.4163 -852, 69.02692, 131.6743 -853, 69.12446, 131.07 -854, 68.24578, 129.8914 -855, 68.4869, 123.344 -856, 70.68261, 137.5314 -857, 70.35969, 136.8886 -858, 67.62401, 118.4024 -859, 69.4463, 116.2441 -860, 67.92486, 124.8433 -861, 68.39347, 120.9809 -862, 66.31812, 105.1208 -863, 71.22882, 145.4377 -864, 65.29169, 108.1912 -865, 66.00287, 130.3778 -866, 67.61775, 117.5157 -867, 69.10276, 135.8762 -868, 68.99743, 127.5126 -869, 69.07531, 151.3998 -870, 68.34086, 112.4799 -871, 71.68196, 156.7554 -872, 68.77664, 138.2098 -873, 66.18191, 109.5685 -874, 72.37092, 139.9742 -875, 66.85155, 124.5873 -876, 65.75688, 130.5023 -877, 69.69245, 151.0783 -878, 66.27915, 108.7722 -879, 66.47752, 105.9927 -880, 68.71912, 143.4301 -881, 68.29244, 114.7434 -882, 67.66696, 123.7736 -883, 71.29885, 139.4769 -884, 67.07369, 115.8201 -885, 70.68048, 146.5682 -886, 71.40114, 153.9993 -887, 71.00392, 137.5899 -888, 66.2799, 125.9287 -889, 68.05383, 139.6939 -890, 64.16346, 126.3585 -891, 66.87966, 113.9307 -892, 70.52968, 129.7605 -893, 65.45595, 116.1925 -894, 69.11331, 139.1294 -895, 67.94221, 126.9815 -896, 67.2132, 125.8352 -897, 67.6372, 113.524 -898, 70.09365, 123.2372 -899, 64.41354, 123.0554 -900, 69.77698, 128.133 -901, 66.58181, 127.9357 -902, 68.14995, 110.4678 -903, 66.18165, 127.9364 -904, 66.79412, 118.1678 -905, 67.1657, 129.7243 -906, 68.01904, 130.6094 -907, 66.95837, 105.0414 -908, 68.70397, 122.6299 -909, 69.68057, 138.3259 -910, 66.52793, 107.7381 -911, 66.46981, 141.4417 -912, 71.44643, 153.6966 -913, 66.62648, 134.5551 -914, 64.01015, 109.6593 -915, 65.03312, 117.2029 -916, 66.77216, 124.2843 -917, 68.91932, 125.2193 -918, 71.22926, 133.2256 -919, 71.10332, 122.6042 -920, 69.80699, 134.8652 -921, 67.09127, 111.4506 -922, 67.27958, 116.8458 -923, 71.86593, 143.1527 -924, 67.20197, 99.92383 -925, 68.44108, 127.9232 -926, 67.20278, 136.658 -927, 69.36588, 145.3947 -928, 69.0416, 126.6818 -929, 65.9056, 128.1983 -930, 66.44766, 122.8328 -931, 66.08009, 133.2571 -932, 69.35367, 116.7606 -933, 70.83359, 144.0455 -934, 67.664, 132.5153 -935, 65.30966, 123.9832 -936, 66.66817, 113.1423 -937, 66.93271, 123.9512 -938, 67.73938, 133.9787 -939, 64.27722, 128.1519 -940, 66.83442, 121.2878 -941, 65.89728, 122.7107 -942, 67.6564, 125.4136 -943, 68.68966, 124.8761 -944, 66.08003, 116.5903 -945, 66.91344, 129.889 -946, 69.48392, 123.889 -947, 68.60001, 137.6571 -948, 69.21225, 130.8805 -949, 67.63342, 141.9706 -950, 65.73405, 125.7334 -951, 66.09947, 104.4108 -952, 67.65293, 117.0685 -953, 67.59619, 131.7669 -954, 69.57859, 125.4738 -955, 66.08879, 129.5734 -956, 70.08026, 130.1053 -957, 65.00956, 131.9305 -958, 69.16464, 142.4645 -959, 69.61276, 127.6431 -960, 71.48367, 153.3153 -961, 69.47413, 126.7609 -962, 69.0027, 114.0258 -963, 69.5581, 133.9684 -964, 68.63746, 127.5869 -965, 67.20262, 126.4859 -966, 66.07614, 120.7651 -967, 66.18342, 126.6479 -968, 70.80778, 133.0747 -969, 67.158, 125.9649 -970, 65.2973, 121.3206 -971, 69.23494, 129.7824 -972, 68.90768, 130.0549 -973, 72.3478, 123.4005 -974, 68.29557, 137.2791 -975, 68.34735, 127.7554 -976, 67.46476, 133.6853 -977, 68.86803, 113.9275 -978, 66.62471, 135.6168 -979, 64.77193, 122.6005 -980, 67.70647, 118.9472 -981, 72.992, 134.2703 -982, 70.95194, 124.2747 -983, 67.95677, 130.6981 -984, 67.20959, 124.6797 -985, 66.36959, 129.0839 -986, 67.63896, 121.9456 -987, 69.74444, 126.2689 -988, 68.17532, 134.6122 -989, 66.89711, 131.8476 -990, 67.4966, 103.5828 -991, 66.51569, 116.3925 -992, 66.88332, 123.5095 -993, 69.7277, 150.3395 -994, 69.78345, 135.2437 -995, 65.40046, 112.4584 -996, 67.99831, 137.4861 -997, 72.25581, 132.7902 -998, 70.79562, 126.0286 -999, 65.18786, 141.3591 -1000, 67.7123, 135.9065 -1001, 70.05146, 134.6655 -1002, 67.30497, 122.0232 -1003, 66.39813, 128.3502 -1004, 69.73637, 130.6354 -1005, 68.71659, 131.717 -1006, 63.88437, 108.6132 -1007, 68.40851, 114.5673 -1008, 67.93251, 133.5136 -1009, 70.69674, 135.8641 -1010, 68.95083, 148.1093 -1011, 66.49457, 123.5179 -1012, 68.59369, 120.8406 -1013, 66.26442, 116.2666 -1014, 69.58656, 123.8986 -1015, 67.35651, 119.32 -1016, 69.68727, 119.4097 -1017, 68.44046, 124.5933 -1018, 68.47973, 130.8802 -1019, 65.45463, 118.2058 -1020, 66.8085, 109.6357 -1021, 70.05212, 140.2298 -1022, 67.43558, 121.5764 -1023, 66.54306, 98.30262 -1024, 67.32353, 117.6173 -1025, 67.9725, 136.5104 -1026, 69.03858, 148.9791 -1027, 67.69453, 123.9665 -1028, 69.30508, 133.5957 -1029, 65.39643, 117.2334 -1030, 68.35638, 123.5943 -1031, 65.36888, 117.7674 -1032, 68.36499, 137.2321 -1033, 71.15702, 129.1996 -1034, 69.25532, 142.4032 -1035, 66.6984, 128.4838 -1036, 69.17548, 115.3008 -1037, 68.31559, 119.5309 -1038, 67.81616, 121.7224 -1039, 68.56123, 142.8442 -1040, 66.23085, 110.1171 -1041, 68.95099, 122.0958 -1042, 67.86761, 124.8188 -1043, 68.05498, 119.3169 -1044, 67.73986, 132.4571 -1045, 69.83641, 133.0316 -1046, 70.68574, 160.8831 -1047, 64.54385, 119.127 -1048, 67.93112, 138.516 -1049, 67.77291, 124.8232 -1050, 69.41312, 135.9744 -1051, 67.77213, 116.2254 -1052, 67.79965, 139.2002 -1053, 67.98313, 137.983 -1054, 69.97983, 144.5084 -1055, 63.83261, 109.1938 -1056, 65.57212, 127.228 -1057, 69.34307, 124.5517 -1058, 67.28398, 114.926 -1059, 68.7435, 132.5027 -1060, 69.03112, 125.3892 -1061, 69.64426, 128.4988 -1062, 66.70052, 117.7319 -1063, 67.9143, 112.9531 -1064, 64.36849, 126.1835 -1065, 65.87507, 118.7934 -1066, 67.07427, 125.4388 -1067, 69.34545, 124.9451 -1068, 69.83212, 145.5139 -1069, 66.10245, 116.7836 -1070, 69.26205, 132.5216 -1071, 68.33525, 114.8933 -1072, 69.38017, 122.8594 -1073, 69.12887, 130.5782 -1074, 68.44658, 119.1058 -1075, 66.34542, 133.8204 -1076, 70.03275, 128.5779 -1077, 70.16523, 139.0179 -1078, 68.18324, 101.2876 -1079, 70.12378, 140.958 -1080, 68.4296, 134.6146 -1081, 66.43974, 129.9482 -1082, 71.72703, 139.064 -1083, 70.72387, 135.1996 -1084, 68.09022, 129.682 -1085, 70.12976, 129.1395 -1086, 66.05393, 129.0051 -1087, 69.77059, 112.7357 -1088, 68.15816, 126.1123 -1089, 69.91372, 118.3724 -1090, 65.34461, 122.9731 -1091, 68.35621, 130.3663 -1092, 64.50585, 114.226 -1093, 67.95491, 115.7854 -1094, 68.57621, 137.9526 -1095, 68.12257, 112.2435 -1096, 68.77583, 137.237 -1097, 67.92593, 124.9418 -1098, 69.1484, 135.0961 -1099, 63.20539, 114.4199 -1100, 69.2442, 122.1823 -1101, 65.88645, 129.375 -1102, 67.85186, 129.9448 -1103, 65.57418, 140.4557 -1104, 66.70819, 120.8977 -1105, 69.172, 129.159 -1106, 69.23593, 137.1397 -1107, 67.57232, 145.2218 -1108, 69.50518, 140.0956 -1109, 70.60288, 124.12 -1110, 66.54152, 135.6875 -1111, 69.11494, 127.756 -1112, 69.951, 144.0475 -1113, 67.70347, 131.9333 -1114, 69.19028, 135.5263 -1115, 67.8047, 151.3579 -1116, 67.62532, 124.7073 -1117, 70.36898, 135.274 -1118, 71.02595, 136.5388 -1119, 69.8452, 137.8778 -1120, 67.08638, 114.2066 -1121, 68.62013, 141.5844 -1122, 64.37275, 111.0969 -1123, 65.93523, 126.3868 -1124, 65.24285, 132.8885 -1125, 70.51481, 144.7904 -1126, 66.61129, 108.3859 -1127, 67.13394, 124.1348 -1128, 66.77634, 129.4462 -1129, 67.69385, 131.3339 -1130, 67.82809, 111.6411 -1131, 66.63254, 111.6422 -1132, 67.62229, 140.3178 -1133, 69.66798, 125.5286 -1134, 62.75039, 114.49 -1135, 64.53878, 113.998 -1136, 68.01929, 117.1931 -1137, 66.38551, 138.3156 -1138, 70.18724, 122.3712 -1139, 64.646, 132.9431 -1140, 67.48819, 124.0449 -1141, 72.01807, 144.1591 -1142, 66.61356, 115.4581 -1143, 65.81803, 116.5192 -1144, 71.16185, 139.6139 -1145, 68.51977, 133.2364 -1146, 64.96088, 120.025 -1147, 66.88268, 123.1111 -1148, 70.3531, 132.8462 -1149, 67.71744, 120.9359 -1150, 66.03333, 129.7702 -1151, 68.9826, 136.9118 -1152, 68.60237, 131.121 -1153, 66.8408, 133.484 -1154, 68.03659, 136.3871 -1155, 64.79586, 131.4559 -1156, 70.55126, 126.1986 -1157, 68.28166, 115.046 -1158, 68.77574, 130.3178 -1159, 67.09315, 131.6954 -1160, 70.14303, 135.6519 -1161, 65.46833, 120.3029 -1162, 69.02275, 129.1442 -1163, 74.24899, 150.2167 -1164, 64.08575, 120.2076 -1165, 67.57977, 132.153 -1166, 69.19395, 132.1247 -1167, 64.48615, 119.5029 -1168, 68.75888, 136.7629 -1169, 68.45184, 147.7846 -1170, 66.44205, 145.5992 -1171, 70.1756, 124.9662 -1172, 67.1386, 127.902 -1173, 66.91548, 125.9147 -1174, 68.63357, 109.6821 -1175, 66.95697, 107.7733 -1176, 69.97351, 134.1099 -1177, 66.92568, 134.901 -1178, 68.76347, 139.6364 -1179, 67.40692, 127.0273 -1180, 65.74615, 134.7717 -1181, 65.88357, 99.97124 -1182, 66.77623, 129.4522 -1183, 66.9622, 129.3592 -1184, 63.46642, 103.6594 -1185, 68.35224, 115.7327 -1186, 64.43147, 104.8874 -1187, 63.52175, 131.0054 -1188, 66.86196, 129.0709 -1189, 65.53651, 102.5494 -1190, 71.82306, 133.2257 -1191, 68.86538, 146.3008 -1192, 70.79207, 140.8125 -1193, 69.02139, 132.4618 -1194, 67.3527, 118.8437 -1195, 66.3294, 133.4495 -1196, 67.75792, 134.882 -1197, 68.64796, 129.6789 -1198, 68.18784, 136.7318 -1199, 71.53978, 133.9981 -1200, 68.58959, 128.1324 -1201, 71.33959, 130.2482 -1202, 67.18757, 130.2934 -1203, 67.70033, 128.3208 -1204, 64.13048, 134.0501 -1205, 69.90087, 140.5808 -1206, 66.72044, 115.1936 -1207, 69.3532, 135.8445 -1208, 69.70788, 142.8508 -1209, 67.73755, 143.0931 -1210, 68.16879, 114.9519 -1211, 71.94697, 149.4261 -1212, 67.37481, 132.0558 -1213, 65.34039, 127.0174 -1214, 65.63768, 103.3615 -1215, 68.91559, 125.3216 -1216, 65.44571, 130.6423 -1217, 68.11726, 124.3662 -1218, 69.52284, 140.6019 -1219, 69.40202, 124.229 -1220, 70.00803, 132.9642 -1221, 68.59817, 130.2067 -1222, 64.76508, 106.6241 -1223, 67.52805, 108.9888 -1224, 66.71974, 109.9473 -1225, 67.94808, 124.363 -1226, 69.09682, 131.5021 -1227, 70.04724, 137.4264 -1228, 67.92097, 116.0228 -1229, 67.99135, 117.9061 -1230, 68.92023, 116.7259 -1231, 66.75149, 115.4633 -1232, 68.07152, 129.9734 -1233, 68.75961, 148.9128 -1234, 70.93048, 126.0818 -1235, 68.29873, 115.4952 -1236, 69.25316, 158.7833 -1237, 68.39327, 141.2064 -1238, 68.48007, 129.838 -1239, 69.47286, 137.0682 -1240, 66.33003, 123.2428 -1241, 66.88679, 117.9651 -1242, 65.20091, 102.4998 -1243, 68.37273, 130.6338 -1244, 67.10601, 144.6224 -1245, 62.64242, 100.1982 -1246, 69.06906, 120.2937 -1247, 71.15727, 144.3108 -1248, 68.93324, 114.8805 -1249, 68.10686, 141.5328 -1250, 64.45765, 114.6963 -1251, 65.96736, 121.6607 -1252, 68.73038, 119.3241 -1253, 70.53564, 135.206 -1254, 67.40711, 115.9409 -1255, 66.11309, 123.2264 -1256, 69.47433, 133.0619 -1257, 70.95476, 136.3442 -1258, 65.56715, 124.1401 -1259, 65.49243, 116.2944 -1260, 68.89342, 133.1669 -1261, 67.59755, 137.941 -1262, 66.1724, 133.3173 -1263, 68.70371, 114.2219 -1264, 65.47651, 137.6516 -1265, 67.72604, 131.5375 -1266, 70.02202, 137.2221 -1267, 69.72107, 135.1331 -1268, 67.90954, 113.9257 -1269, 65.61306, 132.5883 -1270, 71.40631, 133.5753 -1271, 66.27843, 106.7793 -1272, 65.0276, 95.18466 -1273, 65.68922, 114.2675 -1274, 66.85743, 126.4804 -1275, 68.23, 126.7087 -1276, 66.12036, 110.9096 -1277, 71.32591, 132.3678 -1278, 70.2075, 133.7174 -1279, 71.03619, 144.0125 -1280, 68.18528, 129.9098 -1281, 68.99195, 106.5697 -1282, 67.95745, 121.9433 -1283, 69.49971, 118.1623 -1284, 67.12538, 106.6739 -1285, 67.75678, 128.444 -1286, 67.67958, 127.4595 -1287, 64.71984, 102.93 -1288, 69.72873, 127.8299 -1289, 68.50234, 139.7868 -1290, 70.56446, 133.2813 -1291, 66.58715, 120.2949 -1292, 63.80202, 102.4047 -1293, 66.38836, 134.2056 -1294, 66.7895, 121.4804 -1295, 66.99003, 108.2574 -1296, 72.61998, 145.8469 -1297, 67.80601, 114.9258 -1298, 68.63913, 124.6757 -1299, 65.81803, 113.619 -1300, 66.5755, 126.2651 -1301, 66.40067, 124.0382 -1302, 66.75992, 120.554 -1303, 69.02475, 124.4235 -1304, 70.24902, 130.1726 -1305, 70.18308, 137.2733 -1306, 67.63509, 126.9051 -1307, 66.43547, 118.2885 -1308, 67.50559, 119.6817 -1309, 68.19559, 134.332 -1310, 66.32293, 120.0364 -1311, 70.33673, 140.2713 -1312, 67.9766, 139.4025 -1313, 66.07451, 105.1086 -1314, 68.00118, 140.3289 -1315, 65.48497, 139.7691 -1316, 66.99532, 118.4896 -1317, 69.89331, 121.8301 -1318, 68.03229, 130.3482 -1319, 70.00989, 138.2214 -1320, 66.91337, 119.9847 -1321, 71.43101, 141.5275 -1322, 64.42386, 128.0746 -1323, 68.63254, 122.6639 -1324, 70.14808, 135.5841 -1325, 69.94628, 158.7993 -1326, 66.40808, 103.1971 -1327, 65.27161, 122.9332 -1328, 67.02796, 119.343 -1329, 66.333, 139.5722 -1330, 70.05322, 124.1145 -1331, 71.49315, 132.5483 -1332, 67.11911, 116.0712 -1333, 72.52115, 162.8737 -1334, 68.59945, 131.1394 -1335, 66.72202, 124.8745 -1336, 68.33163, 123.738 -1337, 66.52804, 119.0115 -1338, 69.80841, 135.4606 -1339, 70.18855, 139.6563 -1340, 67.70646, 120.3449 -1341, 66.73552, 113.0404 -1342, 68.37589, 115.658 -1343, 68.14008, 128.6282 -1344, 65.33269, 96.52385 -1345, 68.27634, 122.6695 -1346, 69.17767, 129.3968 -1347, 66.47919, 128.8422 -1348, 66.27731, 133.0853 -1349, 67.80211, 130.1248 -1350, 72.66613, 138.9119 -1351, 70.62111, 138.9252 -1352, 67.45131, 105.9085 -1353, 68.51925, 135.4393 -1354, 72.05853, 147.3129 -1355, 64.71472, 108.7636 -1356, 66.49054, 128.9625 -1357, 71.9151, 147.7867 -1358, 68.37932, 128.5716 -1359, 69.44208, 127.4285 -1360, 65.67788, 128.9123 -1361, 67.97944, 123.3621 -1362, 68.18702, 122.0501 -1363, 67.96766, 159.6644 -1364, 67.69418, 121.5022 -1365, 66.85727, 124.3686 -1366, 68.50423, 130.5608 -1367, 66.46892, 117.7781 -1368, 70.53609, 147.1473 -1369, 68.60163, 128.6512 -1370, 67.13712, 115.6854 -1371, 63.82574, 104.102 -1372, 67.39413, 122.4406 -1373, 71.3131, 124.6131 -1374, 67.98003, 100.4089 -1375, 67.8037, 131.8038 -1376, 71.05584, 134.7575 -1377, 70.6785, 148.5516 -1378, 69.45454, 151.3435 -1379, 67.75404, 121.4032 -1380, 66.37759, 132.7138 -1381, 66.90907, 118.1243 -1382, 67.36022, 120.412 -1383, 70.03559, 141.4458 -1384, 74.19488, 129.0597 -1385, 68.44192, 129.3121 -1386, 68.86465, 148.5716 -1387, 66.41874, 112.319 -1388, 68.58215, 130.0932 -1389, 69.01529, 123.1712 -1390, 64.12752, 99.36058 -1391, 72.58824, 139.1404 -1392, 69.53845, 131.9771 -1393, 69.32255, 127.7025 -1394, 67.26117, 136.8449 -1395, 68.8089, 126.4916 -1396, 65.83333, 111.1847 -1397, 69.14631, 128.5255 -1398, 66.76436, 123.1419 -1399, 68.10866, 141.374 -1400, 66.52579, 127.0178 -1401, 66.72267, 118.0513 -1402, 66.66847, 115.3536 -1403, 66.13808, 136.9275 -1404, 68.04169, 126.5685 -1405, 67.37032, 129.216 -1406, 68.37927, 142.1694 -1407, 68.64261, 136.578 -1408, 67.06567, 121.962 -1409, 69.29222, 146.9053 -1410, 69.97624, 142.657 -1411, 68.36664, 140.2292 -1412, 68.2079, 109.8398 -1413, 67.34824, 134.8916 -1414, 65.91384, 127.6066 -1415, 67.37608, 108.9719 -1416, 70.77374, 138.4284 -1417, 72.8469, 151.4509 -1418, 64.95583, 130.0036 -1419, 68.67514, 113.0897 -1420, 68.73548, 129.1464 -1421, 67.33471, 133.1919 -1422, 66.68746, 124.866 -1423, 65.85168, 121.4815 -1424, 70.81582, 137.8631 -1425, 65.09564, 125.8314 -1426, 70.61931, 135.3299 -1427, 67.96031, 107.3931 -1428, 70.68803, 144.1915 -1429, 66.34093, 100.5991 -1430, 71.98092, 130.1721 -1431, 70.17314, 140.8988 -1432, 70.63179, 143.6734 -1433, 64.87469, 90.29334 -1434, 69.62426, 130.4148 -1435, 65.17407, 123.8754 -1436, 69.09608, 154.0757 -1437, 71.81975, 137.4948 -1438, 68.66104, 141.8174 -1439, 67.17895, 126.8401 -1440, 68.00257, 131.9545 -1441, 70.77144, 120.9803 -1442, 68.82564, 119.7816 -1443, 70.04554, 127.7472 -1444, 68.95339, 134.2469 -1445, 64.41355, 108.5235 -1446, 63.82854, 125.0611 -1447, 68.3559, 123.0197 -1448, 69.25516, 129.8861 -1449, 73.38109, 154.8178 -1450, 69.36199, 151.9248 -1451, 70.71977, 135.6969 -1452, 67.59075, 127.2047 -1453, 70.98644, 137.876 -1454, 67.73825, 124.4771 -1455, 71.10527, 154.6002 -1456, 71.95975, 134.0699 -1457, 65.74155, 117.4639 -1458, 65.64344, 128.3519 -1459, 68.37038, 118.1031 -1460, 70.50701, 127.8238 -1461, 66.43263, 129.914 -1462, 66.60278, 131.3221 -1463, 68.03472, 128.1544 -1464, 69.83384, 122.8347 -1465, 68.22043, 143.5868 -1466, 67.78035, 106.5681 -1467, 67.1894, 124.9457 -1468, 66.17013, 113.6761 -1469, 65.98555, 105.4988 -1470, 70.37458, 125.3804 -1471, 66.98272, 120.0159 -1472, 69.07135, 135.0513 -1473, 64.39778, 112.0501 -1474, 70.30031, 126.6445 -1475, 68.46686, 126.7371 -1476, 68.07287, 138.6844 -1477, 69.65267, 143.346 -1478, 67.85116, 124.6758 -1479, 68.81195, 119.2154 -1480, 68.88093, 129.5162 -1481, 71.2914, 141.2136 -1482, 64.93822, 124.9304 -1483, 64.39593, 117.6936 -1484, 67.61191, 128.117 -1485, 65.36431, 125.507 -1486, 68.57192, 139.9115 -1487, 69.63015, 132.5572 -1488, 64.66196, 129.5233 -1489, 71.18005, 139.3905 -1490, 65.6959, 121.712 -1491, 66.05318, 122.7607 -1492, 67.04924, 117.4026 -1493, 68.42541, 135.9146 -1494, 68.54306, 123.838 -1495, 65.95454, 102.8468 -1496, 66.95297, 119.3281 -1497, 64.91704, 104.4281 -1498, 66.59452, 129.2376 -1499, 68.17706, 138.2296 -1500, 69.573, 138.6461 -1501, 71.65878, 130.4121 -1502, 65.06775, 124.4317 -1503, 66.85523, 127.9011 -1504, 67.84366, 125.2683 -1505, 69.22848, 121.1672 -1506, 69.75159, 128.1437 -1507, 67.48764, 121.494 -1508, 68.12465, 129.3746 -1509, 68.50207, 127.4765 -1510, 67.50188, 113.1406 -1511, 68.83511, 132.5812 -1512, 65.40895, 110.5741 -1513, 68.31175, 139.194 -1514, 68.78411, 128.757 -1515, 65.39974, 132.9714 -1516, 66.754, 125.0153 -1517, 65.37482, 95.80713 -1518, 70.65043, 152.9084 -1519, 70.97634, 121.217 -1520, 66.75895, 127.448 -1521, 66.26857, 120.2754 -1522, 67.34174, 127.4945 -1523, 67.39093, 111.026 -1524, 71.04158, 153.5447 -1525, 63.7418, 110.9415 -1526, 66.91954, 121.0967 -1527, 65.84956, 123.5086 -1528, 67.03723, 116.363 -1529, 67.92717, 134.9384 -1530, 66.72742, 113.8451 -1531, 66.34696, 113.0531 -1532, 66.53015, 127.5692 -1533, 68.60951, 125.1506 -1534, 66.11208, 115.4493 -1535, 67.01143, 138.9409 -1536, 70.45763, 133.292 -1537, 65.3277, 130.5079 -1538, 67.28212, 114.2578 -1539, 70.37548, 137.6167 -1540, 68.04608, 114.5218 -1541, 70.36839, 139.4884 -1542, 68.38089, 124.6962 -1543, 67.78852, 130.045 -1544, 69.77907, 141.782 -1545, 69.59613, 125.4556 -1546, 67.9806, 119.1796 -1547, 65.84256, 107.0361 -1548, 66.99247, 125.3591 -1549, 63.54764, 115.7565 -1550, 71.50943, 128.7986 -1551, 69.94093, 129.3747 -1552, 71.21029, 145.662 -1553, 71.56281, 123.6062 -1554, 65.31159, 124.6278 -1555, 65.18491, 122.7439 -1556, 65.25283, 120.2892 -1557, 67.46596, 128.6295 -1558, 67.27426, 111.5271 -1559, 64.97376, 117.7437 -1560, 64.60687, 109.4645 -1561, 69.736, 132.9405 -1562, 67.7749, 124.1881 -1563, 69.30528, 136.8094 -1564, 71.38338, 143.1901 -1565, 65.60915, 117.3002 -1566, 66.23041, 130.8166 -1567, 66.53307, 137.4417 -1568, 67.51649, 128.97 -1569, 67.72325, 114.6422 -1570, 68.57113, 138.4685 -1571, 66.23808, 123.19 -1572, 67.75308, 121.9934 -1573, 68.2829, 149.3778 -1574, 68.40175, 137.21 -1575, 66.09433, 138.6653 -1576, 70.03545, 118.8309 -1577, 65.46717, 116.7297 -1578, 66.46693, 131.5675 -1579, 67.85512, 129.5762 -1580, 70.36596, 131.4946 -1581, 68.09483, 125.1984 -1582, 70.06267, 131.8467 -1583, 67.65661, 121.0286 -1584, 69.08508, 121.8685 -1585, 68.40932, 147.9118 -1586, 69.12972, 130.6309 -1587, 67.97094, 139.9751 -1588, 67.62895, 126.6522 -1589, 66.80442, 116.7992 -1590, 68.57388, 132.4308 -1591, 67.45375, 130.6493 -1592, 68.6366, 132.6351 -1593, 65.92344, 124.4934 -1594, 70.69799, 129.6396 -1595, 68.09362, 131.2952 -1596, 69.50493, 121.3845 -1597, 67.03953, 116.8423 -1598, 69.04839, 143.4353 -1599, 70.66314, 140.0996 -1600, 67.94574, 127.1524 -1601, 68.5127, 116.4033 -1602, 68.81282, 145.5938 -1603, 67.15097, 136.0613 -1604, 68.34367, 126.2249 -1605, 67.38561, 130.9905 -1606, 64.88607, 131.7105 -1607, 65.5339, 125.1818 -1608, 69.3919, 147.0456 -1609, 66.46889, 109.3503 -1610, 63.25683, 120.7578 -1611, 67.61546, 112.4772 -1612, 69.88085, 138.4517 -1613, 70.15703, 136.7186 -1614, 70.61107, 136.0144 -1615, 71.3845, 148.7104 -1616, 66.53779, 120.4476 -1617, 71.05961, 133.5431 -1618, 67.63928, 140.0484 -1619, 63.8441, 129.0091 -1620, 66.79275, 121.0921 -1621, 68.61061, 125.6694 -1622, 70.40975, 117.6691 -1623, 65.20379, 133.959 -1624, 69.08499, 121.968 -1625, 68.29678, 135.3754 -1626, 65.83832, 111.6269 -1627, 67.18313, 117.3099 -1628, 67.87544, 131.75 -1629, 67.51672, 130.3517 -1630, 67.98827, 124.7463 -1631, 70.33848, 127.5476 -1632, 67.29728, 118.5713 -1633, 65.95685, 118.7344 -1634, 65.2832, 117.239 -1635, 71.86035, 127.4872 -1636, 67.32069, 128.9596 -1637, 68.52503, 147.7036 -1638, 69.74627, 132.158 -1639, 65.75926, 129.6624 -1640, 67.26104, 142.583 -1641, 67.59186, 123.1966 -1642, 65.54701, 114.619 -1643, 70.57745, 134.1679 -1644, 64.93595, 129.3978 -1645, 69.85715, 133.0797 -1646, 70.81884, 130.0722 -1647, 68.30112, 139.2852 -1648, 67.54828, 131.5521 -1649, 71.89737, 135.3276 -1650, 68.81871, 130.5668 -1651, 68.57948, 144.8947 -1652, 66.01716, 121.8662 -1653, 67.25756, 110.649 -1654, 70.5545, 150.0971 -1655, 66.29452, 123.8581 -1656, 68.57082, 128.4226 -1657, 68.60497, 125.197 -1658, 67.99508, 129.7427 -1659, 66.12931, 125.7215 -1660, 66.41232, 132.001 -1661, 68.42482, 140.054 -1662, 66.80813, 114.1178 -1663, 67.72371, 116.1322 -1664, 70.99035, 117.7071 -1665, 67.56098, 131.2855 -1666, 69.12684, 113.6105 -1667, 67.97635, 144.7629 -1668, 66.30036, 141.6047 -1669, 69.30957, 140.0213 -1670, 65.63213, 108.4237 -1671, 66.22333, 117.2512 -1672, 66.74595, 126.77 -1673, 69.66252, 135.074 -1674, 68.21548, 132.0189 -1675, 69.28403, 109.2101 -1676, 69.64359, 127.8589 -1677, 71.48035, 122.0737 -1678, 69.37451, 137.6851 -1679, 65.19039, 127.5918 -1680, 64.02516, 111.5819 -1681, 66.58522, 121.3966 -1682, 65.81355, 138.8427 -1683, 66.10408, 116.5048 -1684, 68.56408, 137.4424 -1685, 67.89191, 121.9768 -1686, 71.42475, 116.8105 -1687, 65.98772, 126.0482 -1688, 70.95594, 114.7284 -1689, 64.37344, 126.7487 -1690, 69.76692, 131.342 -1691, 66.46755, 119.0926 -1692, 67.76109, 137.8646 -1693, 71.17728, 129.5914 -1694, 67.31413, 128.105 -1695, 70.22181, 137.4504 -1696, 69.28985, 129.6324 -1697, 66.35778, 133.4823 -1698, 69.27648, 124.7911 -1699, 66.3778, 113.9428 -1700, 63.24012, 116.8399 -1701, 69.18211, 138.7521 -1702, 69.11432, 125.4607 -1703, 67.48024, 130.5948 -1704, 69.75327, 134.2699 -1705, 69.62313, 143.4724 -1706, 65.95463, 142.254 -1707, 68.89125, 139.8464 -1708, 67.23829, 132.4897 -1709, 67.73728, 138.5529 -1710, 68.72443, 123.1153 -1711, 65.20195, 132.6998 -1712, 66.2865, 106.6149 -1713, 68.01878, 134.9917 -1714, 66.89261, 130.92 -1715, 67.79814, 122.4887 -1716, 66.6555, 136.0645 -1717, 69.77338, 119.5334 -1718, 68.42446, 117.7405 -1719, 65.55531, 115.5734 -1720, 68.34513, 104.7006 -1721, 66.26115, 123.6592 -1722, 66.40599, 138.5289 -1723, 68.64386, 132.2257 -1724, 68.70476, 117.2914 -1725, 68.03119, 141.6933 -1726, 66.25774, 129.6313 -1727, 64.0967, 94.51219 -1728, 67.0669, 120.6412 -1729, 65.80509, 121.3762 -1730, 68.05092, 133.2667 -1731, 67.52718, 127.9032 -1732, 66.35888, 123.3962 -1733, 70.87196, 136.9675 -1734, 68.29448, 114.1357 -1735, 67.0344, 118.0845 -1736, 70.91179, 121.8608 -1737, 68.77458, 145.5199 -1738, 68.8064, 128.9862 -1739, 66.80841, 110.4729 -1740, 65.02676, 126.9126 -1741, 71.83389, 141.1132 -1742, 67.41125, 138.183 -1743, 68.8635, 132.6335 -1744, 66.39633, 127.2025 -1745, 67.90122, 146.2561 -1746, 69.04019, 141.6517 -1747, 66.26552, 126.5209 -1748, 68.4645, 121.554 -1749, 66.8815, 116.5904 -1750, 71.36376, 139.0275 -1751, 66.06344, 116.2031 -1752, 66.64834, 115.7431 -1753, 67.3297, 116.8138 -1754, 68.20575, 138.6574 -1755, 69.59793, 108.5229 -1756, 67.50819, 133.6747 -1757, 68.00385, 128.0916 -1758, 69.51431, 128.6687 -1759, 68.00582, 115.4484 -1760, 67.59357, 125.0018 -1761, 69.78942, 136.4816 -1762, 72.36491, 121.9301 -1763, 68.13393, 126.8874 -1764, 67.83776, 119.9595 -1765, 68.87619, 142.2743 -1766, 66.04124, 129.9792 -1767, 65.81569, 131.1604 -1768, 69.22762, 128.8601 -1769, 64.72395, 111.9433 -1770, 68.48588, 132.3867 -1771, 68.28041, 134.2844 -1772, 65.5087, 127.6919 -1773, 66.73361, 114.5415 -1774, 69.20114, 138.1499 -1775, 71.44618, 140.358 -1776, 70.08869, 125.9099 -1777, 69.6745, 134.4383 -1778, 71.68575, 136.6572 -1779, 71.09849, 123.5248 -1780, 67.65215, 130.345 -1781, 70.41131, 149.8413 -1782, 68.33638, 115.5647 -1783, 64.72321, 109.6661 -1784, 64.6035, 108.8823 -1785, 66.92416, 112.3914 -1786, 68.46553, 130.0139 -1787, 67.19789, 136.8066 -1788, 67.78929, 111.1892 -1789, 66.6783, 119.3179 -1790, 67.38496, 120.1224 -1791, 68.00018, 124.093 -1792, 65.27378, 117.8442 -1793, 69.14142, 142.1545 -1794, 67.46178, 122.3342 -1795, 68.87277, 115.7081 -1796, 68.02365, 136.5833 -1797, 70.33914, 120.5965 -1798, 68.05498, 121.269 -1799, 66.63059, 133.5937 -1800, 66.23781, 127.541 -1801, 70.68625, 139.1153 -1802, 67.92487, 140.4052 -1803, 67.98283, 124.3543 -1804, 67.83966, 136.9707 -1805, 70.87256, 136.9799 -1806, 68.67371, 129.9913 -1807, 65.63433, 113.6199 -1808, 66.98566, 127.6126 -1809, 69.39665, 117.966 -1810, 67.97483, 127.2407 -1811, 69.02449, 123.8412 -1812, 65.06479, 121.2687 -1813, 68.67376, 118.5378 -1814, 67.57063, 115.4182 -1815, 66.86965, 131.2651 -1816, 66.42749, 110.3212 -1817, 68.42186, 129.2128 -1818, 69.83543, 140.8802 -1819, 66.38544, 121.1068 -1820, 69.67951, 134.4281 -1821, 66.10079, 116.2489 -1822, 65.82617, 117.8009 -1823, 68.71368, 126.455 -1824, 71.38503, 137.1076 -1825, 69.73254, 152.1776 -1826, 68.37367, 128.6175 -1827, 65.05453, 113.9725 -1828, 64.38195, 105.9582 -1829, 69.22384, 134.3052 -1830, 66.67906, 132.4565 -1831, 69.15689, 134.3756 -1832, 67.53215, 146.8833 -1833, 70.71198, 131.2724 -1834, 69.06844, 132.9619 -1835, 66.36641, 140.4684 -1836, 69.74416, 144.838 -1837, 69.72221, 129.261 -1838, 67.005, 138.036 -1839, 68.39904, 125.5747 -1840, 65.72237, 129.4743 -1841, 70.41527, 129.4677 -1842, 66.08413, 105.1944 -1843, 66.34093, 125.2679 -1844, 65.25134, 128.237 -1845, 67.53562, 123.3362 -1846, 68.21037, 110.8623 -1847, 67.41542, 114.4586 -1848, 69.8279, 137.2435 -1849, 66.30495, 125.8706 -1850, 69.06175, 140.8451 -1851, 69.64603, 131.2554 -1852, 70.75572, 140.12 -1853, 67.51414, 138.8613 -1854, 67.50856, 117.374 -1855, 67.30225, 109.9978 -1856, 67.76966, 129.4122 -1857, 70.13058, 135.1643 -1858, 66.28125, 108.1378 -1859, 72.48112, 146.3046 -1860, 66.93464, 127.6499 -1861, 67.24385, 133.5096 -1862, 69.30013, 124.8396 -1863, 71.68649, 123.4209 -1864, 69.69329, 125.1731 -1865, 68.22858, 116.5013 -1866, 70.77195, 124.5635 -1867, 69.63875, 132.8562 -1868, 67.5239, 124.2136 -1869, 70.26869, 137.6254 -1870, 67.32622, 112.2365 -1871, 65.82766, 117.92 -1872, 67.28046, 107.1366 -1873, 68.47687, 127.8631 -1874, 66.16499, 119.5914 -1875, 71.12585, 129.7663 -1876, 67.51094, 126.2753 -1877, 67.98365, 120.6916 -1878, 70.76255, 147.2496 -1879, 68.13751, 123.8089 -1880, 69.7139, 124.9097 -1881, 69.28011, 129.2576 -1882, 67.72134, 133.2142 -1883, 71.35771, 134.9818 -1884, 65.01169, 115.4612 -1885, 66.57282, 114.2201 -1886, 66.2121, 126.4372 -1887, 68.42587, 121.5315 -1888, 68.25899, 137.3384 -1889, 71.66231, 130.1496 -1890, 70.73674, 149.3463 -1891, 68.81489, 131.8088 -1892, 67.8052, 124.5172 -1893, 67.28023, 124.094 -1894, 75.1528, 146.9701 -1895, 70.18385, 135.8346 -1896, 70.11018, 121.4131 -1897, 67.55479, 131.3549 -1898, 65.19685, 135.1309 -1899, 71.09811, 141.27 -1900, 63.42211, 106.4187 -1901, 69.87338, 140.1507 -1902, 67.2773, 140.0055 -1903, 66.189, 124.8413 -1904, 65.71651, 134.9238 -1905, 68.09428, 136.0939 -1906, 69.12266, 133.6055 -1907, 69.44989, 114.209 -1908, 67.09671, 144.4419 -1909, 68.50605, 127.578 -1910, 68.14059, 114.5292 -1911, 66.53479, 118.9804 -1912, 67.30796, 118.8584 -1913, 66.46388, 114.4406 -1914, 68.23072, 117.1258 -1915, 70.06314, 139.3579 -1916, 69.26881, 141.7621 -1917, 70.1554, 117.3159 -1918, 66.0776, 136.9107 -1919, 68.95747, 130.915 -1920, 66.76727, 124.4251 -1921, 69.8097, 141.0605 -1922, 67.93231, 125.3143 -1923, 69.44794, 151.3939 -1924, 71.14183, 118.1643 -1925, 66.84818, 114.446 -1926, 67.75431, 118.5776 -1927, 70.83193, 129.1185 -1928, 69.21843, 126.5898 -1929, 68.20571, 133.0472 -1930, 67.32344, 133.0028 -1931, 67.46411, 130.5289 -1932, 67.70673, 110.4494 -1933, 68.5877, 131.6199 -1934, 70.18028, 142.8787 -1935, 69.85138, 137.0263 -1936, 68.82396, 141.9518 -1937, 68.58454, 123.7734 -1938, 66.17491, 121.7871 -1939, 68.29599, 112.7853 -1940, 66.01446, 121.0144 -1941, 70.42725, 124.4965 -1942, 65.95003, 125.2296 -1943, 67.28507, 121.1903 -1944, 70.23598, 140.1737 -1945, 66.37594, 136.5133 -1946, 65.72229, 124.2645 -1947, 72.69022, 150.1384 -1948, 65.52858, 107.7887 -1949, 68.71508, 128.8673 -1950, 69.34245, 133.2224 -1951, 67.38242, 125.7706 -1952, 68.05083, 130.8925 -1953, 69.86498, 151.5925 -1954, 64.51717, 114.9571 -1955, 69.20595, 139.6118 -1956, 67.98607, 127.7814 -1957, 70.14776, 139.3701 -1958, 70.4986, 130.907 -1959, 66.86758, 134.945 -1960, 68.64908, 104.7127 -1961, 67.91149, 113.4475 -1962, 69.24385, 116.3492 -1963, 64.48072, 109.5586 -1964, 71.64447, 126.9269 -1965, 70.04642, 146.8967 -1966, 68.12343, 126.8031 -1967, 65.23383, 122.345 -1968, 68.27239, 127.8701 -1969, 66.17894, 124.9103 -1970, 65.83059, 123.0154 -1971, 65.62889, 107.4306 -1972, 70.92752, 111.6473 -1973, 69.29069, 130.6183 -1974, 69.91684, 132.766 -1975, 72.73301, 125.9357 -1976, 68.44904, 113.1008 -1977, 66.49335, 123.1309 -1978, 72.21533, 122.7007 -1979, 69.53524, 139.1563 -1980, 64.79882, 122.5688 -1981, 67.38254, 126.915 -1982, 67.65345, 131.7026 -1983, 70.01257, 144.6798 -1984, 66.05945, 133.332 -1985, 65.21051, 109.8084 -1986, 68.39529, 132.9511 -1987, 63.99095, 123.6623 -1988, 70.31847, 120.0304 -1989, 70.15159, 123.1364 -1990, 68.01671, 122.7495 -1991, 68.06098, 125.8274 -1992, 66.98618, 117.2347 -1993, 68.8061, 142.7741 -1994, 70.30067, 114.5538 -1995, 65.68106, 111.1723 -1996, 69.27665, 141.7056 -1997, 71.68898, 126.5743 -1998, 67.17092, 148.2722 -1999, 69.24215, 132.6836 -2000, 68.73563, 126.8221 -2001, 69.00812, 125.4763 -2002, 68.69462, 130.1342 -2003, 68.53874, 123.2715 -2004, 67.68634, 129.9806 -2005, 69.60608, 138.6734 -2006, 68.91393, 130.7056 -2007, 66.17148, 113.3707 -2008, 67.46209, 139.6833 -2009, 72.83513, 148.8002 -2010, 64.01976, 90.91793 -2011, 68.02868, 123.7533 -2012, 68.51623, 132.4995 -2013, 70.88524, 131.3128 -2014, 65.29862, 116.5172 -2015, 65.7635, 109.1144 -2016, 65.46143, 129.339 -2017, 65.99098, 114.6394 -2018, 65.57951, 136.1447 -2019, 69.70616, 144.5925 -2020, 66.1974, 107.9777 -2021, 68.23074, 122.0759 -2022, 65.97964, 123.3232 -2023, 71.26857, 133.6208 -2024, 72.01497, 159.2724 -2025, 68.93137, 148.7762 -2026, 67.36601, 120.2868 -2027, 70.12256, 110.3036 -2028, 68.84918, 137.6134 -2029, 67.62215, 132.4802 -2030, 67.13659, 136.4192 -2031, 70.39143, 137.2703 -2032, 68.68117, 134.8569 -2033, 66.92629, 118.8555 -2034, 69.87266, 144.0381 -2035, 67.94061, 128.518 -2036, 68.495, 125.988 -2037, 69.45516, 121.0884 -2038, 67.72991, 125.3854 -2039, 69.85473, 141.3991 -2040, 66.63111, 141.1397 -2041, 66.36326, 116.8585 -2042, 68.2269, 131.1664 -2043, 68.40577, 134.5811 -2044, 68.44489, 133.1242 -2045, 70.94089, 137.7195 -2046, 69.65687, 130.2491 -2047, 65.06613, 109.5825 -2048, 71.81628, 142.8719 -2049, 65.92674, 101.6217 -2050, 66.52018, 112.3553 -2051, 70.52744, 131.0845 -2052, 66.25032, 131.0484 -2053, 64.72936, 111.5548 -2054, 63.79906, 110.8498 -2055, 65.38373, 127.4708 -2056, 65.57359, 107.7067 -2057, 66.57608, 115.1232 -2058, 67.28745, 112.1197 -2059, 66.14358, 128.0777 -2060, 66.11741, 119.4651 -2061, 67.68233, 124.5983 -2062, 68.74723, 126.0285 -2063, 66.5915, 111.3977 -2064, 65.01782, 127.722 -2065, 69.28345, 124.8207 -2066, 67.19343, 122.9788 -2067, 69.81336, 117.7117 -2068, 66.55388, 120.7289 -2069, 66.14617, 121.3302 -2070, 69.93036, 146.6089 -2071, 66.70056, 126.013 -2072, 67.68095, 128.1474 -2073, 67.87796, 129.5415 -2074, 67.65549, 121.5145 -2075, 71.1713, 157.9626 -2076, 69.01806, 127.8941 -2077, 70.58265, 127.1594 -2078, 70.89693, 140.8109 -2079, 68.51895, 140.1451 -2080, 66.61835, 132.7723 -2081, 66.07169, 116.0089 -2082, 68.1535, 121.2886 -2083, 72.89832, 147.5384 -2084, 69.90164, 138.8642 -2085, 66.50525, 120.8563 -2086, 69.27168, 125.8179 -2087, 70.53643, 135.3753 -2088, 65.1243, 107.6247 -2089, 70.34418, 122.9851 -2090, 69.13083, 131.7164 -2091, 65.21067, 110.3376 -2092, 67.08781, 100.2532 -2093, 64.65639, 106.579 -2094, 66.28071, 121.223 -2095, 71.30341, 130.5588 -2096, 66.91234, 132.6182 -2097, 70.84318, 132.613 -2098, 66.65796, 117.8331 -2099, 64.54303, 94.29987 -2100, 66.43942, 125.1826 -2101, 66.60747, 125.3684 -2102, 66.38807, 117.4577 -2103, 66.85611, 130.8168 -2104, 68.50863, 128.3144 -2105, 63.45049, 118.4083 -2106, 67.54653, 129.4669 -2107, 65.41398, 116.7348 -2108, 66.91885, 146.8505 -2109, 67.59652, 120.2168 -2110, 67.05552, 136.2774 -2111, 68.00153, 130.1697 -2112, 70.33681, 134.8282 -2113, 69.10376, 126.2799 -2114, 68.12704, 142.6738 -2115, 67.5512, 121.2891 -2116, 68.78357, 111.1965 -2117, 66.62497, 130.424 -2118, 67.88387, 138.8309 -2119, 67.75152, 125.105 -2120, 68.3286, 141.6323 -2121, 71.05207, 149.779 -2122, 68.11943, 118.6268 -2123, 66.44223, 119.4357 -2124, 71.4563, 134.9113 -2125, 68.60548, 133.1629 -2126, 70.82734, 147.2884 -2127, 68.89076, 117.6717 -2128, 67.15411, 122.843 -2129, 68.76271, 125.7926 -2130, 70.53185, 143.2531 -2131, 66.47953, 127.2118 -2132, 67.94262, 113.7238 -2133, 68.79538, 130.932 -2134, 69.95518, 129.5075 -2135, 69.99489, 157.6149 -2136, 66.55505, 125.4636 -2137, 65.14815, 105.3601 -2138, 70.40094, 130.4476 -2139, 68.32002, 152.0527 -2140, 65.60842, 143.9545 -2141, 70.63864, 136.1993 -2142, 65.08404, 117.4157 -2143, 64.31842, 114.5616 -2144, 66.0525, 115.1065 -2145, 67.35994, 121.8544 -2146, 70.1376, 150.2085 -2147, 67.49796, 122.1628 -2148, 67.1125, 115.5902 -2149, 67.27925, 133.3105 -2150, 66.55492, 141.4402 -2151, 68.1384, 130.7908 -2152, 68.54096, 143.1515 -2153, 68.52593, 138.0426 -2154, 70.77318, 120.9532 -2155, 66.72984, 104.5502 -2156, 66.30573, 120.3066 -2157, 66.1654, 116.7474 -2158, 65.52686, 127.6185 -2159, 71.0176, 128.7638 -2160, 64.0731, 132.1263 -2161, 67.07894, 136.2565 -2162, 66.92118, 114.2461 -2163, 63.92073, 117.7804 -2164, 66.76895, 121.7656 -2165, 67.31046, 117.4512 -2166, 66.94519, 137.7336 -2167, 69.97793, 133.2135 -2168, 66.4156, 114.16 -2169, 69.46121, 136.8798 -2170, 66.47267, 125.4235 -2171, 67.69989, 121.4915 -2172, 68.6046, 123.3492 -2173, 66.82256, 107.8004 -2174, 66.31555, 117.1775 -2175, 69.11039, 126.3083 -2176, 65.94386, 115.3139 -2177, 69.86148, 143.7522 -2178, 64.55479, 113.2482 -2179, 65.56126, 131.7643 -2180, 65.07865, 125.8387 -2181, 66.30496, 115.8846 -2182, 68.63331, 139.0539 -2183, 67.39243, 121.7331 -2184, 66.73104, 141.1317 -2185, 65.57961, 127.9611 -2186, 67.97668, 132.1352 -2187, 62.60611, 129.76 -2188, 66.26361, 129.4162 -2189, 65.65796, 118.7804 -2190, 66.31902, 105.7105 -2191, 65.15141, 124.8365 -2192, 67.06755, 141.8106 -2193, 68.07294, 123.0209 -2194, 68.73375, 118.3051 -2195, 66.50974, 123.1286 -2196, 71.35483, 125.0842 -2197, 67.36943, 118.0443 -2198, 66.53342, 134.41 -2199, 67.44518, 132.5899 -2200, 69.37871, 123.6421 -2201, 68.47617, 136.737 -2202, 66.81962, 130.4451 -2203, 68.62691, 121.9836 -2204, 70.55478, 124.8816 -2205, 65.26709, 110.6805 -2206, 65.35329, 108.9072 -2207, 65.63866, 129.7145 -2208, 69.57228, 140.2426 -2209, 66.41871, 137.8126 -2210, 68.25694, 140.6602 -2211, 70.74604, 136.5621 -2212, 68.35787, 121.0365 -2213, 69.64013, 141.548 -2214, 65.35452, 137.184 -2215, 71.92675, 156.5442 -2216, 70.13403, 137.22 -2217, 65.16717, 121.5264 -2218, 69.31063, 122.0461 -2219, 66.33317, 131.3132 -2220, 68.65304, 127.5565 -2221, 70.27541, 135.3191 -2222, 67.57713, 128.8936 -2223, 69.1971, 134.756 -2224, 69.6239, 129.9452 -2225, 65.86809, 127.9121 -2226, 69.92456, 134.6123 -2227, 68.42315, 138.5594 -2228, 67.61231, 145.1953 -2229, 68.12858, 113.7951 -2230, 64.76601, 118.6754 -2231, 65.33382, 129.7622 -2232, 67.64472, 133.5081 -2233, 69.06267, 139.8787 -2234, 67.17574, 117.2661 -2235, 65.69758, 116.9811 -2236, 68.57486, 141.1557 -2237, 66.34328, 138.224 -2238, 62.78196, 119.847 -2239, 65.28308, 112.5769 -2240, 69.9312, 139.7362 -2241, 65.2271, 130.6158 -2242, 71.57674, 142.2788 -2243, 69.1121, 134.2085 -2244, 68.83916, 123.6683 -2245, 66.39741, 119.1475 -2246, 66.69861, 133.9891 -2247, 64.95406, 115.6216 -2248, 69.50341, 135.2493 -2249, 69.43668, 115.9697 -2250, 67.07002, 121.3118 -2251, 70.49846, 134.3579 -2252, 69.18776, 143.0344 -2253, 67.48622, 119.856 -2254, 67.40826, 124.8424 -2255, 69.43651, 127.9505 -2256, 64.15318, 112.225 -2257, 69.14007, 137.3179 -2258, 68.8929, 120.1185 -2259, 64.95274, 93.44115 -2260, 66.41945, 137.0321 -2261, 67.42646, 124.5909 -2262, 65.63755, 126.3297 -2263, 70.16858, 128.3273 -2264, 66.23711, 130.688 -2265, 66.49138, 138.4146 -2266, 65.0471, 116.7381 -2267, 67.08449, 118.1314 -2268, 64.3389, 128.2028 -2269, 64.20833, 113.1561 -2270, 66.89449, 113.1405 -2271, 65.79218, 126.8992 -2272, 68.843, 131.3916 -2273, 71.09755, 143.3004 -2274, 63.8882, 122.9986 -2275, 68.35671, 136.7665 -2276, 69.47682, 140.3565 -2277, 69.0265, 138.7555 -2278, 70.29803, 135.4454 -2279, 70.84459, 135.3925 -2280, 71.86799, 144.6497 -2281, 69.57461, 139.8465 -2282, 70.88841, 136.5899 -2283, 67.94317, 123.7762 -2284, 67.70347, 127.8934 -2285, 68.59478, 148.9399 -2286, 66.91402, 128.9211 -2287, 68.33449, 125.5417 -2288, 64.65946, 140.4392 -2289, 66.05221, 115.642 -2290, 70.24304, 130.7133 -2291, 67.37048, 119.0077 -2292, 69.95831, 128.0902 -2293, 70.64717, 153.0286 -2294, 70.5802, 127.6482 -2295, 68.86101, 134.8113 -2296, 68.7432, 121.5345 -2297, 67.17409, 128.304 -2298, 65.78148, 107.3133 -2299, 67.52494, 136.2616 -2300, 67.08075, 149.1684 -2301, 67.69345, 129.6252 -2302, 64.64051, 105.8442 -2303, 69.36402, 113.9182 -2304, 69.2178, 142.8796 -2305, 67.36034, 119.1631 -2306, 65.63764, 117.8529 -2307, 68.76324, 126.8712 -2308, 68.17144, 124.9338 -2309, 65.83305, 103.8489 -2310, 69.30622, 130.2827 -2311, 70.8049, 123.8101 -2312, 66.59071, 137.5423 -2313, 64.67352, 104.9377 -2314, 71.93986, 129.2747 -2315, 67.64634, 120.458 -2316, 68.73411, 126.8398 -2317, 66.95634, 127.1688 -2318, 72.56549, 130.0389 -2319, 67.36934, 136.9061 -2320, 70.02946, 135.9857 -2321, 66.54034, 110.9114 -2322, 67.74769, 113.6583 -2323, 67.57706, 144.701 -2324, 66.52633, 133.8333 -2325, 69.15551, 152.127 -2326, 69.19157, 122.7961 -2327, 66.60061, 118.2649 -2328, 67.07004, 106.2097 -2329, 69.57028, 148.5705 -2330, 69.23016, 101.4527 -2331, 69.26795, 137.5001 -2332, 67.56717, 123.1061 -2333, 69.10176, 142.433 -2334, 68.54151, 127.3761 -2335, 70.86149, 151.2788 -2336, 67.9873, 124.5609 -2337, 71.04092, 127.1598 -2338, 66.70805, 140.2543 -2339, 65.77676, 113.7058 -2340, 66.79414, 116.248 -2341, 65.93191, 109.5517 -2342, 67.72422, 131.8711 -2343, 66.72423, 112.366 -2344, 66.68607, 115.4197 -2345, 67.25768, 119.9769 -2346, 70.52978, 128.2009 -2347, 69.74125, 128.6789 -2348, 68.75608, 115.2882 -2349, 67.61299, 136.677 -2350, 72.13419, 137.7854 -2351, 67.91004, 126.6205 -2352, 66.18756, 125.3221 -2353, 71.71529, 144.446 -2354, 70.6841, 137.8075 -2355, 71.87845, 143.0609 -2356, 67.75918, 131.826 -2357, 67.09216, 122.1749 -2358, 66.79895, 105.8924 -2359, 63.56132, 118.8125 -2360, 66.49532, 139.3133 -2361, 68.50215, 124.2763 -2362, 66.83975, 116.7159 -2363, 70.64111, 134.415 -2364, 66.0167, 117.703 -2365, 67.3482, 126.8963 -2366, 67.26092, 120.9883 -2367, 70.82199, 140.3611 -2368, 68.33332, 102.5002 -2369, 69.37897, 132.5554 -2370, 64.7609, 119.6373 -2371, 68.699, 125.9149 -2372, 69.49404, 125.5505 -2373, 68.0849, 122.5232 -2374, 66.37539, 134.8766 -2375, 66.75613, 121.5063 -2376, 69.64206, 123.3271 -2377, 69.77774, 133.0832 -2378, 69.49214, 118.9607 -2379, 65.84828, 101.1193 -2380, 70.71369, 143.1946 -2381, 68.48099, 126.7384 -2382, 69.37374, 141.1484 -2383, 70.52541, 135.1763 -2384, 68.70978, 128.8899 -2385, 67.62641, 109.3522 -2386, 68.33709, 137.5541 -2387, 68.23178, 139.1303 -2388, 67.91161, 132.0641 -2389, 70.32186, 136.4673 -2390, 66.39807, 128.5349 -2391, 66.51667, 134.4822 -2392, 69.61525, 122.5729 -2393, 67.63565, 140.0854 -2394, 71.06313, 139.9112 -2395, 70.62246, 127.4324 -2396, 73.99549, 142.9016 -2397, 67.4663, 125.8276 -2398, 65.91279, 101.2434 -2399, 65.60691, 115.9997 -2400, 69.50033, 126.7393 -2401, 69.43735, 133.5447 -2402, 69.00905, 116.1499 -2403, 68.58614, 124.1333 -2404, 66.96198, 118.7229 -2405, 64.56606, 135.4686 -2406, 69.48658, 132.5799 -2407, 65.65789, 145.9751 -2408, 66.80094, 112.1247 -2409, 68.93784, 135.9755 -2410, 68.90478, 120.921 -2411, 68.50005, 132.7228 -2412, 68.02851, 135.0685 -2413, 69.2145, 134.8578 -2414, 68.48721, 141.7791 -2415, 68.80928, 151.4206 -2416, 67.04824, 134.1504 -2417, 68.89055, 139.3242 -2418, 68.75779, 132.5058 -2419, 72.33195, 143.5202 -2420, 66.51286, 121.8849 -2421, 66.7188, 122.9302 -2422, 67.20628, 118.5206 -2423, 70.19428, 131.9154 -2424, 65.51378, 122.5787 -2425, 68.83979, 113.5812 -2426, 66.95528, 129.9893 -2427, 68.03878, 123.9609 -2428, 71.01151, 119.9164 -2429, 69.14341, 124.9403 -2430, 68.86125, 131.6645 -2431, 64.6203, 109.2955 -2432, 68.44749, 110.9724 -2433, 68.82404, 121.5044 -2434, 66.41585, 127.7426 -2435, 68.86164, 147.5692 -2436, 65.7798, 148.7053 -2437, 63.82215, 109.0177 -2438, 67.97504, 119.6017 -2439, 68.39135, 123.7223 -2440, 66.54816, 124.8416 -2441, 71.1807, 144.0008 -2442, 66.03415, 136.0093 -2443, 66.19208, 127.1191 -2444, 65.8689, 121.6531 -2445, 68.65011, 128.9604 -2446, 68.79753, 135.4419 -2447, 66.39828, 123.0735 -2448, 68.08765, 120.0428 -2449, 68.20122, 120.2027 -2450, 64.65154, 124.8094 -2451, 69.30569, 133.7108 -2452, 67.89566, 118.2086 -2453, 66.23676, 131.8546 -2454, 66.84304, 113.6315 -2455, 68.77237, 131.1206 -2456, 68.78389, 141.022 -2457, 70.30029, 128.1661 -2458, 67.68475, 124.7755 -2459, 69.56671, 131.8861 -2460, 69.36532, 124.6139 -2461, 66.46909, 112.5943 -2462, 71.37399, 146.4358 -2463, 68.12643, 126.6456 -2464, 69.49226, 136.9902 -2465, 65.07859, 118.1795 -2466, 66.27357, 144.6287 -2467, 70.26356, 154.9408 -2468, 67.37111, 116.9522 -2469, 68.38613, 140.6401 -2470, 68.68559, 116.6275 -2471, 66.67024, 136.6266 -2472, 71.15168, 131.1853 -2473, 63.86399, 113.9441 -2474, 69.25001, 134.6576 -2475, 67.20448, 107.6304 -2476, 66.94316, 106.9521 -2477, 67.99592, 146.6396 -2478, 67.12143, 114.9585 -2479, 69.87331, 131.0168 -2480, 67.35332, 127.6156 -2481, 71.53386, 145.1178 -2482, 75.11519, 153.9562 -2483, 67.61043, 133.6125 -2484, 64.23075, 127.6976 -2485, 65.51542, 126.4846 -2486, 63.1937, 90.6784 -2487, 68.69521, 109.923 -2488, 66.22516, 101.8528 -2489, 69.44849, 114.3461 -2490, 70.73043, 125.1501 -2491, 70.1737, 157.2751 -2492, 64.7817, 111.8687 -2493, 63.91382, 102.5247 -2494, 68.02246, 129.9915 -2495, 70.48458, 156.3703 -2496, 68.31433, 122.7189 -2497, 68.63014, 125.6964 -2498, 68.12174, 126.2062 -2499, 67.40773, 155.2615 -2500, 68.97304, 142.8808 -2501, 65.72097, 121.262 -2502, 68.32077, 124.3155 -2503, 67.56613, 111.6843 -2504, 69.50262, 124.186 -2505, 67.82427, 126.4867 -2506, 70.85958, 142.6651 -2507, 64.04489, 108.8473 -2508, 66.43905, 116.66 -2509, 68.79621, 143.6181 -2510, 70.05244, 123.0933 -2511, 66.04605, 115.0598 -2512, 69.05127, 132.1098 -2513, 65.61974, 120.7598 -2514, 67.60382, 119.7671 -2515, 67.89065, 122.1496 -2516, 70.01739, 123.9711 -2517, 67.80728, 121.4194 -2518, 67.14185, 123.66 -2519, 65.39888, 98.05813 -2520, 68.70988, 133.8099 -2521, 69.04936, 141.6987 -2522, 67.91969, 117.5158 -2523, 72.30217, 132.1645 -2524, 63.7019, 124.5106 -2525, 70.475, 105.7802 -2526, 67.64613, 133.4242 -2527, 67.75898, 125.3875 -2528, 69.1102, 132.6382 -2529, 65.59124, 121.0751 -2530, 67.63581, 121.5355 -2531, 70.74732, 142.0038 -2532, 70.99416, 135.1886 -2533, 67.66798, 118.3373 -2534, 67.19997, 122.9425 -2535, 67.4785, 116.4973 -2536, 67.66945, 133.004 -2537, 70.62281, 146.4085 -2538, 68.85256, 137.2776 -2539, 65.32564, 122.0439 -2540, 68.76499, 140.8147 -2541, 70.56586, 136.7946 -2542, 69.11378, 127.4421 -2543, 69.47685, 130.272 -2544, 70.13374, 131.169 -2545, 66.07211, 129.6342 -2546, 68.40149, 125.6933 -2547, 65.13161, 104.973 -2548, 64.07239, 120.2984 -2549, 63.84484, 102.4259 -2550, 65.55111, 123.8357 -2551, 66.41112, 117.7 -2552, 65.05758, 121.8919 -2553, 69.2384, 128.4571 -2554, 68.75803, 113.1578 -2555, 68.17548, 125.2742 -2556, 70.1552, 139.8009 -2557, 67.70652, 121.3818 -2558, 66.95169, 114.5435 -2559, 70.92538, 133.8388 -2560, 66.06089, 135.6656 -2561, 66.10974, 127.3786 -2562, 70.57236, 140.6434 -2563, 66.67735, 113.9708 -2564, 65.99458, 120.7042 -2565, 63.44297, 116.0752 -2566, 66.32955, 131.0291 -2567, 66.53488, 134.6458 -2568, 66.80528, 111.616 -2569, 67.9896, 110.0452 -2570, 64.99295, 106.053 -2571, 66.56539, 124.0282 -2572, 66.804, 113.4492 -2573, 67.96612, 132.3117 -2574, 64.71711, 118.356 -2575, 65.82856, 106.1109 -2576, 69.08496, 136.7244 -2577, 68.28753, 125.6799 -2578, 71.11334, 126.4908 -2579, 69.34872, 148.1527 -2580, 67.62203, 117.9474 -2581, 66.06295, 124.5018 -2582, 70.00342, 127.0128 -2583, 66.52881, 127.605 -2584, 68.60366, 129.5427 -2585, 69.53265, 142.0317 -2586, 69.5404, 134.8729 -2587, 68.42714, 124.9955 -2588, 70.12002, 137.7196 -2589, 68.89234, 116.8002 -2590, 67.64467, 123.6212 -2591, 68.97063, 129.4071 -2592, 71.51466, 151.9696 -2593, 70.71134, 142.4361 -2594, 66.90583, 114.3278 -2595, 69.57597, 106.1963 -2596, 66.48164, 111.3787 -2597, 66.89809, 118.3329 -2598, 69.13909, 138.206 -2599, 68.61774, 132.7075 -2600, 66.16611, 111.9004 -2601, 66.64128, 114.0856 -2602, 69.54521, 123.4319 -2603, 62.86795, 98.05815 -2604, 67.85282, 125.754 -2605, 68.54477, 133.7416 -2606, 68.66811, 143.6143 -2607, 70.12714, 123.7248 -2608, 66.78985, 127.694 -2609, 67.27782, 126.7293 -2610, 66.9553, 121.6118 -2611, 69.44337, 123.5342 -2612, 71.51895, 143.988 -2613, 69.66995, 137.9075 -2614, 68.47294, 109.4371 -2615, 66.19926, 110.991 -2616, 68.78565, 144.0145 -2617, 67.86643, 121.9737 -2618, 67.76132, 128.252 -2619, 68.54873, 117.4352 -2620, 68.46365, 130.4536 -2621, 67.00444, 93.78282 -2622, 68.04189, 121.4741 -2623, 70.80235, 140.4798 -2624, 67.7232, 120.5494 -2625, 68.05748, 126.1797 -2626, 69.86881, 128.3204 -2627, 67.67538, 105.9584 -2628, 68.32806, 126.9252 -2629, 69.88401, 142.7832 -2630, 68.80968, 111.1686 -2631, 68.36811, 114.3121 -2632, 68.8827, 143.8443 -2633, 64.85888, 121.0848 -2634, 67.02277, 136.9794 -2635, 65.65821, 123.2681 -2636, 70.01384, 130.2018 -2637, 68.95576, 129.1215 -2638, 69.72231, 135.8375 -2639, 68.26031, 138.5268 -2640, 67.79651, 146.5558 -2641, 66.57574, 114.2481 -2642, 70.38311, 146.8498 -2643, 66.49668, 122.807 -2644, 68.21731, 127.527 -2645, 68.08084, 130.6424 -2646, 66.89732, 125.6947 -2647, 71.03529, 135.7172 -2648, 67.69483, 110.6572 -2649, 66.71312, 122.9811 -2650, 66.19389, 115.5235 -2651, 70.84883, 125.1626 -2652, 60.61265, 88.04646 -2653, 69.33158, 109.2915 -2654, 68.82694, 127.2504 -2655, 68.76714, 110.0752 -2656, 68.3665, 121.2376 -2657, 68.8963, 113.0423 -2658, 71.52552, 144.707 -2659, 66.3396, 111.3345 -2660, 69.24295, 139.3186 -2661, 65.44706, 129.4057 -2662, 64.98078, 121.7515 -2663, 64.73308, 112.2606 -2664, 65.95421, 123.4114 -2665, 69.23656, 113.0173 -2666, 66.6319, 113.3885 -2667, 65.56464, 111.7275 -2668, 67.89517, 127.8383 -2669, 66.72053, 134.4433 -2670, 67.33628, 133.6352 -2671, 68.00682, 128.9038 -2672, 69.59907, 140.7606 -2673, 65.7514, 121.8273 -2674, 66.54868, 133.0094 -2675, 68.67978, 122.6398 -2676, 67.29012, 149.083 -2677, 67.91637, 136.5971 -2678, 65.73796, 111.1435 -2679, 67.89939, 107.5045 -2680, 72.78908, 137.0203 -2681, 65.98489, 129.277 -2682, 69.67441, 121.7105 -2683, 66.75669, 116.2148 -2684, 67.43375, 117.4727 -2685, 67.67624, 123.6071 -2686, 71.25079, 133.5001 -2687, 69.21284, 122.3603 -2688, 70.47954, 134.4949 -2689, 65.27987, 134.6225 -2690, 71.09122, 139.2202 -2691, 69.56615, 124.2333 -2692, 66.89046, 128.8185 -2693, 67.70276, 138.9186 -2694, 66.77085, 121.5008 -2695, 67.85276, 148.7195 -2696, 70.78378, 124.5162 -2697, 67.09928, 121.3383 -2698, 70.44992, 133.1712 -2699, 69.80734, 137.2218 -2700, 69.2187, 156.353 -2701, 69.75148, 147.7342 -2702, 69.25709, 142.5795 -2703, 69.00485, 122.6004 -2704, 66.51077, 127.8756 -2705, 71.06999, 121.0861 -2706, 73.10762, 151.6868 -2707, 71.20673, 137.8023 -2708, 64.27555, 102.5237 -2709, 70.05278, 122.6111 -2710, 66.79032, 105.706 -2711, 68.34193, 113.765 -2712, 68.51775, 134.1383 -2713, 68.93108, 138.9163 -2714, 66.41503, 110.2628 -2715, 66.67827, 108.1567 -2716, 70.52101, 146.2975 -2717, 68.30664, 134.6639 -2718, 67.0116, 136.9904 -2719, 69.88845, 125.9301 -2720, 69.26417, 131.5566 -2721, 67.90954, 120.4869 -2722, 62.73809, 105.2201 -2723, 67.25447, 117.0512 -2724, 65.59876, 117.1139 -2725, 69.77845, 122.691 -2726, 70.90472, 150.021 -2727, 67.19538, 111.1027 -2728, 67.90593, 122.2626 -2729, 69.80063, 145.7116 -2730, 66.6932, 139.5749 -2731, 67.39204, 119.839 -2732, 67.05894, 120.139 -2733, 69.77321, 143.6484 -2734, 68.61434, 142.6088 -2735, 68.04448, 114.4534 -2736, 69.71027, 160.8859 -2737, 69.63078, 132.8733 -2738, 71.04817, 138.0744 -2739, 67.8894, 128.7946 -2740, 69.08591, 139.7656 -2741, 70.50786, 127.2788 -2742, 66.75964, 140.3527 -2743, 66.45788, 118.3607 -2744, 64.38452, 109.4539 -2745, 67.70213, 135.3701 -2746, 72.16119, 141.8671 -2747, 66.73368, 134.3878 -2748, 64.59658, 113.6028 -2749, 69.18583, 136.7389 -2750, 67.70525, 142.2085 -2751, 70.46124, 132.8252 -2752, 66.84239, 135.3456 -2753, 68.09464, 126.5742 -2754, 69.27278, 141.667 -2755, 66.06118, 114.3427 -2756, 68.85839, 142.794 -2757, 68.24827, 109.1823 -2758, 69.68789, 123.3539 -2759, 70.34077, 139.9099 -2760, 68.47674, 118.7857 -2761, 66.78425, 122.2756 -2762, 67.06985, 124.811 -2763, 68.38893, 112.4658 -2764, 67.18538, 111.7251 -2765, 66.8759, 109.1189 -2766, 72.46405, 138.8395 -2767, 68.05495, 125.6718 -2768, 68.9238, 129.8238 -2769, 66.55309, 117.9982 -2770, 68.00334, 133.4084 -2771, 62.53614, 120.647 -2772, 70.71058, 140.2181 -2773, 68.53707, 125.2862 -2774, 70.0098, 151.713 -2775, 68.65745, 120.2825 -2776, 68.89097, 119.1438 -2777, 67.25272, 133.3836 -2778, 67.39484, 133.6104 -2779, 63.37237, 128.7288 -2780, 67.9351, 120.8477 -2781, 68.38418, 131.7234 -2782, 68.37863, 134.8459 -2783, 65.57367, 137.9377 -2784, 65.23577, 128.5973 -2785, 71.3169, 139.8829 -2786, 70.16627, 129.0204 -2787, 67.42392, 122.5717 -2788, 70.49904, 114.3634 -2789, 68.30668, 135.853 -2790, 67.14412, 135.207 -2791, 64.68621, 94.21971 -2792, 66.82203, 140.4193 -2793, 66.17213, 123.9367 -2794, 67.40223, 129.5135 -2795, 69.65239, 148.1859 -2796, 64.6447, 120.4178 -2797, 63.86895, 97.02574 -2798, 67.7235, 114.9802 -2799, 66.78698, 104.0527 -2800, 68.37223, 140.6462 -2801, 68.04613, 118.4149 -2802, 70.70988, 146.6187 -2803, 68.42309, 133.7406 -2804, 69.39765, 118.5079 -2805, 71.73856, 150.9213 -2806, 70.69601, 121.8109 -2807, 69.79586, 146.1372 -2808, 69.20814, 128.8862 -2809, 66.49242, 128.4737 -2810, 67.16108, 139.2681 -2811, 68.76219, 126.9364 -2812, 66.64609, 134.9489 -2813, 69.91623, 141.9177 -2814, 70.71477, 137.8023 -2815, 68.86691, 117.7445 -2816, 65.56879, 119.5334 -2817, 70.7695, 147.1214 -2818, 68.31719, 134.2732 -2819, 63.7678, 97.04078 -2820, 66.49473, 122.836 -2821, 69.21965, 129.9591 -2822, 71.49924, 149.1274 -2823, 67.75486, 128.5848 -2824, 66.19603, 117.3529 -2825, 65.29404, 112.1173 -2826, 68.37324, 129.5659 -2827, 69.09809, 121.057 -2828, 68.5956, 110.0357 -2829, 67.78989, 120.7787 -2830, 67.02507, 122.308 -2831, 66.31844, 126.8147 -2832, 66.33367, 140.2312 -2833, 65.50586, 111.649 -2834, 68.05216, 124.0093 -2835, 69.33545, 135.4809 -2836, 66.39304, 126.1881 -2837, 69.2076, 143.3931 -2838, 70.21379, 122.1613 -2839, 69.178, 142.7784 -2840, 66.76739, 134.2148 -2841, 64.88316, 125.5308 -2842, 70.25427, 130.1801 -2843, 68.38013, 130.1171 -2844, 66.62364, 121.8803 -2845, 67.96737, 116.8868 -2846, 69.07966, 128.4637 -2847, 65.49639, 108.2566 -2848, 67.94823, 131.4797 -2849, 67.69124, 131.0789 -2850, 69.9714, 134.3432 -2851, 67.69387, 112.2898 -2852, 65.98735, 113.6996 -2853, 68.3664, 128.5446 -2854, 69.52877, 136.7997 -2855, 69.27294, 130.2612 -2856, 69.41669, 128.4186 -2857, 70.15337, 139.8741 -2858, 69.82573, 132.6543 -2859, 65.91827, 115.9192 -2860, 67.98945, 118.7202 -2861, 72.12813, 135.5268 -2862, 67.48301, 113.3464 -2863, 68.26193, 117.904 -2864, 69.41184, 130.5207 -2865, 67.82148, 123.5959 -2866, 69.69729, 141.3599 -2867, 63.45113, 104.2273 -2868, 66.9028, 122.3933 -2869, 69.05969, 134.2747 -2870, 69.02413, 120.2068 -2871, 65.1896, 127.2096 -2872, 65.30411, 119.1556 -2873, 67.8454, 100.2365 -2874, 67.09743, 121.1992 -2875, 65.5786, 108.1626 -2876, 68.31828, 129.8971 -2877, 67.77752, 125.3103 -2878, 67.83922, 130.7952 -2879, 67.09143, 127.9221 -2880, 68.6965, 135.3072 -2881, 70.66714, 141.6093 -2882, 65.74989, 134.5339 -2883, 68.51671, 135.9882 -2884, 67.59335, 125.5196 -2885, 65.84344, 123.0473 -2886, 64.9153, 118.3384 -2887, 64.58123, 119.5443 -2888, 66.90827, 136.7318 -2889, 68.0883, 129.1382 -2890, 65.46098, 117.3543 -2891, 69.62403, 133.886 -2892, 70.62668, 127.1567 -2893, 65.82364, 118.264 -2894, 65.06787, 120.8378 -2895, 66.22122, 132.7183 -2896, 69.68826, 125.88 -2897, 69.70612, 129.4925 -2898, 67.65097, 136.1796 -2899, 69.95219, 133.0623 -2900, 70.00937, 129.9978 -2901, 67.61783, 125.53 -2902, 69.31318, 139.8597 -2903, 68.22656, 132.6316 -2904, 68.55723, 118.8729 -2905, 64.22112, 122.1174 -2906, 66.05632, 127.3063 -2907, 66.90354, 113.6921 -2908, 66.84621, 121.585 -2909, 69.4938, 146.0665 -2910, 68.55353, 113.6965 -2911, 65.61282, 110.3262 -2912, 67.37674, 124.0148 -2913, 68.09175, 128.9185 -2914, 66.65804, 117.0019 -2915, 69.54961, 144.9385 -2916, 66.25728, 123.9976 -2917, 67.98509, 135.5365 -2918, 66.09544, 126.996 -2919, 70.52477, 134.6828 -2920, 67.19875, 111.0968 -2921, 68.24137, 121.9514 -2922, 70.97253, 134.2293 -2923, 66.62434, 128.3887 -2924, 65.60995, 124.7491 -2925, 67.79978, 111.9651 -2926, 67.56776, 128.4301 -2927, 65.14281, 113.4592 -2928, 65.46067, 129.2624 -2929, 68.4843, 131.5885 -2930, 68.24746, 126.4105 -2931, 68.62227, 137.2275 -2932, 67.23277, 123.8138 -2933, 70.9315, 124.931 -2934, 70.41644, 145.2017 -2935, 67.76785, 125.2728 -2936, 68.93413, 128.9511 -2937, 66.63682, 123.6178 -2938, 68.50584, 123.3779 -2939, 66.74655, 103.455 -2940, 68.34022, 121.1823 -2941, 68.64082, 104.9272 -2942, 67.7798, 119.9736 -2943, 68.01308, 132.8794 -2944, 64.20657, 119.5831 -2945, 68.16944, 128.8536 -2946, 67.55289, 125.4723 -2947, 67.94972, 120.232 -2948, 65.82888, 110.4565 -2949, 67.43166, 138.2801 -2950, 69.76313, 124.4852 -2951, 66.74117, 117.0476 -2952, 67.23078, 127.707 -2953, 66.219, 121.3801 -2954, 65.57556, 126.3779 -2955, 66.46532, 105.6146 -2956, 71.70666, 150.0118 -2957, 68.32124, 127.4253 -2958, 65.81092, 123.0644 -2959, 68.90095, 119.241 -2960, 66.25545, 124.3161 -2961, 67.63532, 119.8268 -2962, 69.60217, 135.871 -2963, 69.19207, 129.4251 -2964, 68.12331, 116.5582 -2965, 67.47898, 116.8066 -2966, 66.24642, 113.4835 -2967, 68.50173, 121.5935 -2968, 62.87696, 102.6336 -2969, 65.24352, 109.5423 -2970, 69.99091, 136.7711 -2971, 68.75121, 125.0167 -2972, 66.26559, 132.9041 -2973, 67.33988, 137.9208 -2974, 66.08783, 128.0748 -2975, 69.10841, 141.3046 -2976, 68.02947, 136.2458 -2977, 71.4988, 144.147 -2978, 66.42022, 128.7172 -2979, 68.53037, 127.7893 -2980, 69.54256, 134.6098 -2981, 68.89587, 149.2571 -2982, 65.34144, 118.4045 -2983, 68.85953, 147.4612 -2984, 67.9932, 115.8792 -2985, 70.34681, 132.0704 -2986, 65.40868, 123.2475 -2987, 69.67377, 134.0875 -2988, 70.37964, 137.3754 -2989, 68.23626, 128.6996 -2990, 67.40948, 133.7103 -2991, 69.72564, 131.2636 -2992, 66.96911, 112.5541 -2993, 67.05246, 118.0263 -2994, 68.0873, 127.3013 -2995, 70.4947, 125.7998 -2996, 68.59715, 126.259 -2997, 66.45012, 119.3414 -2998, 67.24533, 122.5965 -2999, 69.22665, 135.3375 -3000, 68.4148, 137.2091 -3001, 70.51338, 143.7382 -3002, 70.63103, 145.4599 -3003, 69.83323, 133.1488 -3004, 69.76098, 132.4917 -3005, 68.11679, 126.8125 -3006, 66.53431, 120.2043 -3007, 71.0373, 127.177 -3008, 65.66484, 119.1195 -3009, 67.11404, 131.011 -3010, 70.93121, 151.9596 -3011, 68.25011, 147.9148 -3012, 67.04474, 120.1896 -3013, 69.40034, 121.6422 -3014, 68.35952, 131.7405 -3015, 65.7936, 105.584 -3016, 65.16867, 125.1514 -3017, 64.31223, 132.5808 -3018, 70.65237, 116.5383 -3019, 68.04397, 141.8528 -3020, 67.60186, 130.1925 -3021, 67.58242, 120.4606 -3022, 68.50821, 128.9264 -3023, 65.84079, 119.5386 -3024, 69.13492, 137.8896 -3025, 68.00897, 122.4403 -3026, 67.56761, 129.7133 -3027, 66.79775, 127.9067 -3028, 70.41567, 146.7498 -3029, 66.6532, 111.2623 -3030, 68.94427, 138.8701 -3031, 69.2921, 119.7773 -3032, 71.21679, 128.0274 -3033, 68.26773, 106.61 -3034, 65.73369, 113.3707 -3035, 63.63362, 106.5873 -3036, 69.44197, 125.085 -3037, 67.08087, 125.2055 -3038, 66.03614, 123.3208 -3039, 66.75256, 109.923 -3040, 69.05655, 129.0132 -3041, 66.02949, 108.5156 -3042, 67.62446, 138.1906 -3043, 66.54145, 121.1649 -3044, 71.4012, 133.5965 -3045, 68.54057, 132.5515 -3046, 66.23601, 123.6908 -3047, 71.74579, 148.3826 -3048, 64.8262, 124.0167 -3049, 69.13628, 150.4434 -3050, 63.85309, 113.5616 -3051, 65.88387, 118.8276 -3052, 70.20793, 152.1525 -3053, 69.83569, 121.8741 -3054, 66.51127, 127.3143 -3055, 71.09805, 147.2711 -3056, 64.60825, 112.4456 -3057, 70.23276, 137.7724 -3058, 64.68824, 108.5133 -3059, 67.16361, 124.8309 -3060, 69.32709, 133.656 -3061, 68.45934, 142.1525 -3062, 66.99209, 125.4821 -3063, 68.44693, 132.342 -3064, 67.41731, 128.0697 -3065, 69.21256, 120.7853 -3066, 65.23174, 129.8998 -3067, 65.42771, 117.499 -3068, 66.99225, 121.0608 -3069, 69.66303, 118.2405 -3070, 67.29207, 117.7533 -3071, 64.37238, 124.134 -3072, 68.90985, 106.8616 -3073, 70.80439, 124.5028 -3074, 68.7004, 129.2788 -3075, 68.29255, 113.5292 -3076, 65.50586, 125.7542 -3077, 68.97897, 121.0893 -3078, 69.65275, 125.5083 -3079, 69.49526, 133.7579 -3080, 66.61841, 131.7656 -3081, 64.46226, 117.407 -3082, 69.10304, 131.1557 -3083, 67.86149, 128.0879 -3084, 67.83106, 107.8007 -3085, 67.66576, 133.9987 -3086, 67.93384, 123.2716 -3087, 71.95735, 142.6244 -3088, 66.88443, 115.1191 -3089, 71.25927, 130.7929 -3090, 63.13444, 111.3605 -3091, 70.25703, 131.1771 -3092, 67.68872, 109.8541 -3093, 63.45505, 113.3017 -3094, 71.59334, 117.9625 -3095, 68.69094, 140.3001 -3096, 64.36556, 122.4675 -3097, 68.84021, 139.5953 -3098, 67.79238, 130.4642 -3099, 65.97475, 121.9744 -3100, 64.23339, 106.8916 -3101, 65.46597, 113.5834 -3102, 65.22202, 94.61233 -3103, 67.90056, 120.3075 -3104, 64.42244, 131.5245 -3105, 68.23998, 113.3743 -3106, 70.01671, 128.8175 -3107, 67.25105, 131.9522 -3108, 67.28007, 117.6487 -3109, 69.48821, 129.6283 -3110, 69.50486, 136.9585 -3111, 68.0898, 120.5675 -3112, 68.09624, 127.7017 -3113, 64.59835, 113.0571 -3114, 67.63863, 117.784 -3115, 69.07559, 145.8644 -3116, 65.43751, 123.7503 -3117, 66.04755, 116.2935 -3118, 67.38822, 113.2922 -3119, 68.74094, 121.8236 -3120, 66.68207, 132.4644 -3121, 67.10251, 116.5027 -3122, 68.72578, 148.798 -3123, 69.95585, 134.2309 -3124, 71.48969, 151.6437 -3125, 66.69291, 128.2832 -3126, 65.37967, 110.6266 -3127, 67.59507, 126.1888 -3128, 67.65455, 113.8593 -3129, 68.68263, 125.494 -3130, 69.58679, 125.2317 -3131, 68.37402, 123.4402 -3132, 67.93581, 131.6798 -3133, 65.44645, 133.7783 -3134, 68.37812, 117.4608 -3135, 70.02962, 134.5618 -3136, 66.48126, 125.3948 -3137, 69.02608, 114.1902 -3138, 69.55202, 144.8532 -3139, 64.80997, 132.2021 -3140, 65.70656, 107.7373 -3141, 65.72803, 140.2288 -3142, 68.21876, 121.7152 -3143, 65.86034, 125.5649 -3144, 65.16426, 126.6267 -3145, 66.96428, 135.9602 -3146, 63.75844, 105.6245 -3147, 69.96035, 146.4008 -3148, 69.29626, 106.2849 -3149, 65.18388, 117.985 -3150, 67.37365, 107.4966 -3151, 69.76312, 119.6316 -3152, 65.20697, 116.4881 -3153, 66.31364, 124.9947 -3154, 66.74365, 118.0293 -3155, 65.57241, 128.5441 -3156, 71.05515, 134.7298 -3157, 69.28167, 135.8658 -3158, 71.77797, 136.3061 -3159, 63.53338, 104.7024 -3160, 69.75851, 120.3953 -3161, 66.7395, 118.3091 -3162, 66.76099, 122.1245 -3163, 72.16716, 156.2465 -3164, 64.34648, 117.265 -3165, 69.25366, 128.9281 -3166, 68.20016, 129.2408 -3167, 67.84238, 131.1469 -3168, 70.54498, 136.6229 -3169, 65.25826, 110.8818 -3170, 67.78738, 115.5424 -3171, 66.79884, 132.1508 -3172, 68.13317, 137.9186 -3173, 67.48449, 123.0402 -3174, 70.4411, 148.7687 -3175, 68.33621, 123.88 -3176, 68.67946, 138.1734 -3177, 67.95136, 122.3842 -3178, 65.92021, 120.5629 -3179, 68.14026, 121.2805 -3180, 67.29912, 133.4119 -3181, 67.43318, 121.7736 -3182, 66.07076, 122.2608 -3183, 69.32562, 135.9047 -3184, 65.89875, 134.5927 -3185, 67.23868, 117.4154 -3186, 68.01261, 129.311 -3187, 68.62709, 122.403 -3188, 67.76031, 143.2106 -3189, 67.54784, 128.0734 -3190, 67.26315, 107.2961 -3191, 71.53453, 145.4266 -3192, 65.06551, 123.2535 -3193, 67.43465, 115.9394 -3194, 69.15557, 131.1976 -3195, 67.10856, 110.8966 -3196, 68.48481, 132.9513 -3197, 68.05629, 143.3736 -3198, 68.40527, 142.3615 -3199, 71.97264, 138.5403 -3200, 67.88635, 145.0092 -3201, 68.93287, 133.8419 -3202, 68.24127, 106.3258 -3203, 66.01267, 117.3092 -3204, 67.37485, 134.7795 -3205, 68.21364, 141.9627 -3206, 68.34543, 131.9721 -3207, 68.65931, 137.013 -3208, 68.84427, 144.7351 -3209, 69.03818, 143.485 -3210, 68.11385, 127.8782 -3211, 67.3109, 126.0281 -3212, 69.49562, 126.4439 -3213, 69.39962, 127.7448 -3214, 67.57502, 126.2983 -3215, 66.43096, 106.7579 -3216, 69.2189, 122.9471 -3217, 66.19304, 120.9485 -3218, 66.59157, 107.8202 -3219, 66.81548, 135.6921 -3220, 68.00225, 124.7943 -3221, 69.09045, 123.456 -3222, 68.6133, 133.9338 -3223, 71.62355, 157.659 -3224, 67.4363, 133.6369 -3225, 65.12769, 113.7514 -3226, 68.87788, 139.7284 -3227, 65.8284, 123.9196 -3228, 67.27468, 117.2019 -3229, 68.36412, 114.74 -3230, 67.98858, 135.5863 -3231, 69.99934, 130.2303 -3232, 66.73116, 132.3482 -3233, 67.47372, 116.7746 -3234, 65.0195, 122.0863 -3235, 71.12723, 147.136 -3236, 67.6698, 133.6517 -3237, 68.77095, 153.9969 -3238, 68.48264, 135.3549 -3239, 66.8768, 119.5152 -3240, 70.54119, 134.2581 -3241, 67.04893, 126.7798 -3242, 67.63647, 118.7652 -3243, 67.57626, 120.3951 -3244, 70.87537, 148.4787 -3245, 66.23513, 125.14 -3246, 67.01055, 121.4965 -3247, 67.64118, 129.0488 -3248, 67.9016, 134.8018 -3249, 69.31483, 136.4644 -3250, 68.22857, 119.5528 -3251, 66.98456, 135.7446 -3252, 67.00963, 126.1537 -3253, 69.95272, 144.3773 -3254, 65.80355, 99.51504 -3255, 68.92933, 134.0114 -3256, 67.70136, 136.4446 -3257, 67.91607, 133.3008 -3258, 66.84068, 131.6362 -3259, 69.99456, 135.2158 -3260, 66.4718, 118.2191 -3261, 64.18564, 111.0182 -3262, 66.246, 128.8387 -3263, 68.80963, 130.791 -3264, 67.65907, 128.573 -3265, 66.77115, 130.2165 -3266, 65.37953, 131.9436 -3267, 66.7844, 120.2342 -3268, 71.27461, 137.3123 -3269, 66.61529, 120.9979 -3270, 65.83005, 123.3074 -3271, 69.57158, 130.6931 -3272, 68.00656, 139.9829 -3273, 68.69628, 111.38 -3274, 66.42314, 124.9978 -3275, 66.99259, 122.1147 -3276, 67.96518, 129.2041 -3277, 68.66471, 116.8008 -3278, 66.61581, 110.2205 -3279, 67.63645, 131.1351 -3280, 70.31626, 139.0315 -3281, 69.75296, 124.5872 -3282, 67.08745, 124.9637 -3283, 68.16256, 127.0057 -3284, 68.10701, 134.1875 -3285, 69.7191, 155.7074 -3286, 66.6639, 109.6815 -3287, 69.21432, 142.3644 -3288, 64.6701, 125.2237 -3289, 67.6419, 116.4677 -3290, 70.95584, 129.5297 -3291, 67.68754, 129.9618 -3292, 68.39041, 131.11 -3293, 70.94659, 149.2299 -3294, 69.3929, 138.8501 -3295, 64.29056, 128.0364 -3296, 70.36687, 136.6274 -3297, 67.04642, 127.3941 -3298, 66.03627, 130.0724 -3299, 67.23901, 132.3301 -3300, 68.4523, 115.3808 -3301, 68.00298, 121.4437 -3302, 68.19927, 133.5988 -3303, 69.15154, 135.7115 -3304, 72.36766, 138.8835 -3305, 70.17575, 138.5825 -3306, 66.89187, 130.3881 -3307, 67.86089, 130.8938 -3308, 69.3241, 126.4663 -3309, 68.85085, 125.6815 -3310, 63.59867, 108.3695 -3311, 67.68177, 146.0547 -3312, 65.92195, 128.9527 -3313, 66.04233, 138.9407 -3314, 68.07077, 136.7048 -3315, 68.53269, 136.9208 -3316, 66.41329, 121.4656 -3317, 67.6551, 139.0278 -3318, 69.39574, 124.2868 -3319, 70.72068, 135.4026 -3320, 69.39895, 127.7865 -3321, 68.70993, 134.9467 -3322, 69.38351, 130.8867 -3323, 69.01409, 133.5517 -3324, 68.84671, 121.2891 -3325, 66.67972, 130.3173 -3326, 64.14012, 136.6169 -3327, 65.45315, 120.6706 -3328, 67.16684, 132.1766 -3329, 67.52493, 124.0382 -3330, 67.17756, 133.8366 -3331, 66.73401, 131.714 -3332, 70.0236, 117.9912 -3333, 67.17283, 116.4658 -3334, 65.18918, 138.7007 -3335, 68.32763, 127.9768 -3336, 72.55002, 139.9074 -3337, 70.71251, 148.0151 -3338, 70.88049, 140.65 -3339, 66.96285, 130.6093 -3340, 69.82684, 143.0451 -3341, 65.16431, 128.951 -3342, 68.23622, 140.5259 -3343, 66.73023, 142.5733 -3344, 72.29547, 138.9453 -3345, 69.16314, 127.5533 -3346, 67.56202, 115.1545 -3347, 65.7718, 119.6649 -3348, 67.4295, 100.7527 -3349, 67.235, 122.7841 -3350, 69.86435, 146.7835 -3351, 71.88676, 144.7958 -3352, 68.87227, 138.991 -3353, 70.04608, 137.0023 -3354, 68.73409, 137.8343 -3355, 69.03486, 138.8044 -3356, 69.26447, 128.3303 -3357, 70.09459, 124.8418 -3358, 70.12595, 131.6374 -3359, 66.54739, 120.0134 -3360, 66.3726, 117.0774 -3361, 65.72273, 113.9648 -3362, 67.65602, 126.6406 -3363, 64.69649, 108.3562 -3364, 66.41005, 127.2142 -3365, 69.27872, 134.603 -3366, 68.63208, 121.5365 -3367, 68.60374, 145.1284 -3368, 70.38104, 135.204 -3369, 69.28461, 127.5704 -3370, 71.64455, 153.6515 -3371, 70.37091, 155.869 -3372, 65.45196, 121.4609 -3373, 69.65595, 133.8526 -3374, 67.69863, 108.9521 -3375, 70.04255, 130.5425 -3376, 67.69758, 124.0931 -3377, 66.856, 132.5109 -3378, 69.87691, 154.5701 -3379, 68.5184, 124.004 -3380, 67.68314, 127.6985 -3381, 67.61985, 114.26 -3382, 69.25373, 142.7731 -3383, 68.98349, 115.897 -3384, 66.98194, 125.1081 -3385, 63.41013, 119.8153 -3386, 68.3495, 127.3052 -3387, 70.14263, 130.255 -3388, 67.67369, 125.3486 -3389, 67.83046, 118.0148 -3390, 71.15629, 129.468 -3391, 70.04469, 138.4503 -3392, 69.45013, 138.6964 -3393, 67.78201, 134.9735 -3394, 65.27229, 119.6325 -3395, 69.44983, 132.0852 -3396, 67.90892, 132.1945 -3397, 68.1636, 146.9576 -3398, 66.37934, 112.0144 -3399, 68.73896, 129.7229 -3400, 69.75201, 128.9392 -3401, 69.44655, 125.5484 -3402, 64.92283, 102.8549 -3403, 64.80108, 119.4034 -3404, 65.84217, 143.8547 -3405, 68.34828, 129.9632 -3406, 68.13534, 125.1662 -3407, 66.32414, 126.9552 -3408, 70.74868, 112.1237 -3409, 67.48997, 115.0831 -3410, 65.8077, 120.0188 -3411, 67.41008, 122.7409 -3412, 68.39969, 133.5177 -3413, 72.19938, 144.1058 -3414, 71.65513, 146.9261 -3415, 70.19523, 134.0839 -3416, 65.92306, 112.9231 -3417, 73.35034, 142.4875 -3418, 64.21849, 121.3899 -3419, 65.70466, 122.7506 -3420, 68.90463, 136.1054 -3421, 68.06195, 127.8162 -3422, 66.85163, 139.0505 -3423, 69.58698, 124.5701 -3424, 69.42478, 126.8527 -3425, 68.02716, 145.8616 -3426, 71.71699, 136.8975 -3427, 66.95183, 133.4618 -3428, 69.74699, 122.1901 -3429, 68.80049, 115.6403 -3430, 67.89371, 125.377 -3431, 68.57659, 129.2547 -3432, 68.72581, 129.1874 -3433, 69.63584, 133.0704 -3434, 68.9713, 138.0269 -3435, 66.8827, 118.8532 -3436, 69.21469, 142.7606 -3437, 67.98056, 126.2747 -3438, 68.56045, 119.1386 -3439, 67.92182, 117.0603 -3440, 69.15108, 120.454 -3441, 69.09773, 132.1603 -3442, 66.92076, 108.7441 -3443, 67.43796, 106.5115 -3444, 67.67848, 130.2144 -3445, 70.02323, 140.4403 -3446, 67.78297, 124.5214 -3447, 72.83169, 139.3706 -3448, 68.05868, 129.4378 -3449, 67.44814, 129.0994 -3450, 65.57065, 118.2219 -3451, 67.59465, 117.6786 -3452, 67.82155, 140.8622 -3453, 68.47258, 122.6694 -3454, 63.58771, 104.467 -3455, 67.95929, 129.0106 -3456, 65.22442, 124.3217 -3457, 66.44894, 101.9139 -3458, 67.33704, 139.416 -3459, 65.69507, 132.7342 -3460, 70.72749, 132.8116 -3461, 67.41511, 124.3421 -3462, 69.76325, 126.7586 -3463, 65.37021, 119.848 -3464, 70.00296, 111.9376 -3465, 66.22804, 117.26 -3466, 71.01952, 131.8577 -3467, 66.66825, 122.6517 -3468, 65.766, 117.0445 -3469, 69.19585, 117.8609 -3470, 66.01043, 130.8876 -3471, 65.81063, 124.3575 -3472, 69.63647, 131.0505 -3473, 67.20188, 142.083 -3474, 67.84033, 100.3696 -3475, 63.55149, 127.0979 -3476, 68.31141, 124.2054 -3477, 65.48001, 116.5552 -3478, 69.58827, 123.5653 -3479, 66.1176, 111.8548 -3480, 71.49457, 150.1752 -3481, 70.91224, 128.172 -3482, 65.08904, 120.4457 -3483, 66.85324, 110.6689 -3484, 67.33053, 135.7821 -3485, 70.41812, 145.8887 -3486, 70.74812, 144.6908 -3487, 69.897, 128.3047 -3488, 68.29767, 137.1886 -3489, 67.83703, 127.2593 -3490, 65.24423, 122.1945 -3491, 67.84894, 139.6043 -3492, 70.42564, 129.817 -3493, 70.55525, 152.9847 -3494, 67.88636, 123.5425 -3495, 69.7096, 137.7755 -3496, 67.07269, 116.3106 -3497, 71.88822, 125.4909 -3498, 71.28254, 134.9234 -3499, 66.61757, 116.9673 -3500, 69.33248, 131.029 -3501, 69.17119, 138.2493 -3502, 68.93099, 117.0109 -3503, 65.39211, 117.1889 -3504, 66.40145, 133.3265 -3505, 65.97157, 121.4286 -3506, 65.61777, 122.2767 -3507, 67.1943, 129.2964 -3508, 65.74682, 106.9673 -3509, 64.34058, 118.7342 -3510, 65.27557, 112.0218 -3511, 71.37011, 133.4833 -3512, 68.13757, 127.5429 -3513, 72.05393, 131.366 -3514, 65.7047, 114.9957 -3515, 67.07598, 125.5866 -3516, 63.96935, 84.86345 -3517, 65.26358, 129.4427 -3518, 65.97301, 126.9647 -3519, 68.28892, 139.8538 -3520, 65.81249, 120.6804 -3521, 64.11914, 127.4184 -3522, 67.02094, 120.0865 -3523, 69.03252, 132.7904 -3524, 68.99289, 123.4864 -3525, 64.41882, 114.4503 -3526, 67.15633, 112.938 -3527, 68.76733, 116.9251 -3528, 69.01892, 133.9261 -3529, 66.76233, 128.2645 -3530, 68.18232, 107.0685 -3531, 67.28745, 128.2196 -3532, 68.65317, 126.5592 -3533, 71.06665, 125.8611 -3534, 70.31177, 134.6115 -3535, 72.4691, 152.1181 -3536, 68.8736, 135.5056 -3537, 64.68847, 115.9514 -3538, 68.1288, 127.6565 -3539, 67.36526, 141.0621 -3540, 65.60339, 109.572 -3541, 68.0437, 122.3788 -3542, 69.28083, 134.2059 -3543, 68.87006, 134.8058 -3544, 68.5515, 108.4165 -3545, 70.402, 121.5254 -3546, 70.89245, 131.4848 -3547, 63.57508, 112.824 -3548, 69.96784, 129.2959 -3549, 69.86404, 144.6551 -3550, 67.43349, 123.2584 -3551, 65.953, 130.0755 -3552, 66.51685, 97.84025 -3553, 66.59374, 133.7803 -3554, 64.82036, 106.5226 -3555, 68.76391, 139.4665 -3556, 67.24653, 116.868 -3557, 67.62134, 133.7579 -3558, 66.16322, 118.9108 -3559, 67.42497, 122.3291 -3560, 68.65199, 127.3678 -3561, 67.41315, 114.0066 -3562, 68.24549, 137.0083 -3563, 66.02486, 110.0077 -3564, 65.25809, 132.9911 -3565, 69.91392, 132.3932 -3566, 65.79089, 117.5234 -3567, 67.71449, 130.4334 -3568, 68.29458, 117.7587 -3569, 65.61141, 117.7477 -3570, 67.78179, 129.0761 -3571, 64.30338, 105.6364 -3572, 67.30706, 131.7766 -3573, 68.96485, 131.8757 -3574, 64.97931, 125.9879 -3575, 69.07887, 123.8861 -3576, 67.39433, 133.0366 -3577, 67.27351, 131.1858 -3578, 67.64179, 126.7371 -3579, 70.45489, 151.614 -3580, 69.09422, 147.1926 -3581, 66.0667, 134.7624 -3582, 67.70438, 133.445 -3583, 66.985, 111.2501 -3584, 65.46653, 117.0386 -3585, 68.69845, 129.8079 -3586, 66.04072, 99.27518 -3587, 66.09431, 128.5692 -3588, 69.80498, 151.548 -3589, 67.73859, 139.3895 -3590, 66.68205, 120.0516 -3591, 68.9189, 124.0676 -3592, 67.06468, 137.5999 -3593, 65.256, 129.4912 -3594, 68.3313, 139.801 -3595, 68.39086, 148.5226 -3596, 67.84685, 120.6246 -3597, 66.37815, 138.6642 -3598, 63.32113, 92.37513 -3599, 66.57084, 136.5421 -3600, 67.88983, 118.2089 -3601, 70.94094, 138.6145 -3602, 69.91224, 135.6715 -3603, 64.89822, 104.5861 -3604, 69.46685, 128.2748 -3605, 68.56738, 125.4858 -3606, 66.53162, 143.8794 -3607, 68.6378, 125.3511 -3608, 70.90025, 126.3358 -3609, 71.26396, 139.7274 -3610, 67.13527, 116.2366 -3611, 64.80236, 97.79781 -3612, 70.67036, 136.8521 -3613, 66.13501, 112.7896 -3614, 64.77081, 112.5529 -3615, 68.35648, 120.7636 -3616, 68.24493, 119.3536 -3617, 67.7318, 135.4753 -3618, 67.04488, 140.4543 -3619, 69.94917, 142.0555 -3620, 64.50981, 126.8512 -3621, 67.87716, 123.1267 -3622, 68.61556, 118.3477 -3623, 68.08104, 134.5331 -3624, 66.35068, 116.8814 -3625, 66.71224, 108.9156 -3626, 71.16146, 134.9529 -3627, 64.76054, 109.5924 -3628, 66.75144, 106.5216 -3629, 66.73685, 119.4936 -3630, 69.68151, 137.7906 -3631, 70.72413, 151.0354 -3632, 68.34441, 121.4853 -3633, 67.6858, 146.7791 -3634, 66.98729, 140.0306 -3635, 69.43833, 116.5077 -3636, 70.35311, 140.7913 -3637, 68.29063, 140.0969 -3638, 69.81605, 131.6661 -3639, 68.07763, 144.0462 -3640, 69.63007, 136.5389 -3641, 67.94658, 124.5183 -3642, 66.66861, 123.3439 -3643, 72.54964, 140.3326 -3644, 65.96495, 125.1353 -3645, 68.73999, 142.2247 -3646, 73.25271, 156.3537 -3647, 63.8433, 113.8671 -3648, 66.96921, 120.7632 -3649, 67.68747, 120.6478 -3650, 66.81228, 139.8202 -3651, 66.72332, 119.0638 -3652, 68.9021, 141.0105 -3653, 69.92563, 143.4254 -3654, 69.85536, 133.5108 -3655, 69.32382, 137.0878 -3656, 66.59092, 121.7154 -3657, 68.85426, 127.9174 -3658, 66.54029, 113.4724 -3659, 65.65814, 128.0828 -3660, 69.30998, 131.776 -3661, 70.17204, 138.2634 -3662, 67.97014, 125.758 -3663, 66.85274, 120.3874 -3664, 67.93626, 129.0463 -3665, 72.43693, 136.391 -3666, 67.58597, 130.0804 -3667, 68.61381, 118.5302 -3668, 70.42389, 129.8475 -3669, 66.40833, 119.5325 -3670, 70.57091, 138.3516 -3671, 69.79777, 128.9593 -3672, 67.34701, 116.8005 -3673, 66.40224, 123.1326 -3674, 64.68881, 116.9304 -3675, 69.53955, 126.5974 -3676, 69.43648, 141.1934 -3677, 69.36832, 131.6094 -3678, 67.02639, 109.3029 -3679, 68.60035, 116.408 -3680, 64.90605, 101.3305 -3681, 73.6704, 147.9165 -3682, 68.37014, 141.2402 -3683, 68.3104, 138.8869 -3684, 64.51584, 148.5007 -3685, 66.12992, 101.0513 -3686, 65.38495, 125.7223 -3687, 65.11549, 106.3269 -3688, 67.05783, 126.3894 -3689, 66.99532, 134.2725 -3690, 67.08079, 125.6528 -3691, 65.28833, 113.2531 -3692, 68.09544, 119.5911 -3693, 66.6868, 116.2576 -3694, 68.33953, 143.6987 -3695, 66.84266, 112.5571 -3696, 68.83968, 131.1388 -3697, 61.8934, 95.74545 -3698, 65.73799, 113.6203 -3699, 68.72588, 141.3191 -3700, 67.8244, 116.9133 -3701, 67.01202, 124.2022 -3702, 65.5611, 117.5665 -3703, 67.55321, 119.2307 -3704, 67.1303, 114.5048 -3705, 67.64061, 130.0058 -3706, 66.83182, 140.4851 -3707, 68.27516, 144.0058 -3708, 69.44828, 131.2024 -3709, 69.58545, 126.2305 -3710, 66.7071, 104.6225 -3711, 68.19325, 121.5126 -3712, 69.13191, 135.9547 -3713, 66.59378, 136.2738 -3714, 66.48656, 131.7593 -3715, 66.37289, 118.7403 -3716, 70.71575, 139.42 -3717, 67.15897, 129.0818 -3718, 67.76901, 114.4204 -3719, 65.18164, 113.1913 -3720, 67.83932, 112.5536 -3721, 68.0491, 157.6543 -3722, 68.58692, 121.5904 -3723, 65.95317, 119.206 -3724, 71.02002, 136.1093 -3725, 69.2108, 116.8245 -3726, 67.16712, 133.9377 -3727, 64.82773, 119.5375 -3728, 71.89734, 125.1534 -3729, 66.29137, 119.6552 -3730, 69.63011, 136.2859 -3731, 66.65205, 112.4741 -3732, 70.56251, 132.5837 -3733, 67.79995, 131.5466 -3734, 68.74825, 128.4833 -3735, 66.84629, 137.0769 -3736, 67.47997, 112.9767 -3737, 67.13893, 124.5135 -3738, 68.40021, 138.2798 -3739, 68.86099, 136.6706 -3740, 66.17409, 119.2702 -3741, 68.84978, 131.2561 -3742, 68.67678, 129.8508 -3743, 69.82135, 156.1101 -3744, 64.2599, 108.0741 -3745, 69.71651, 136.2846 -3746, 70.94085, 136.9681 -3747, 70.06779, 139.4128 -3748, 70.88342, 135.7171 -3749, 65.49529, 118.6689 -3750, 68.4804, 138.799 -3751, 68.51303, 138.9157 -3752, 68.16142, 118.2547 -3753, 71.95866, 135.3357 -3754, 64.75487, 129.262 -3755, 70.30789, 135.1908 -3756, 67.4222, 115.1791 -3757, 68.24432, 112.2308 -3758, 68.24598, 122.3013 -3759, 68.67772, 128.2031 -3760, 69.45147, 157.3486 -3761, 67.00023, 128.2287 -3762, 68.53583, 115.0374 -3763, 68.09648, 149.9119 -3764, 66.8815, 118.7213 -3765, 64.35721, 111.8923 -3766, 64.95432, 119.5408 -3767, 68.10575, 121.9841 -3768, 66.80947, 111.1912 -3769, 63.88864, 112.1842 -3770, 67.38665, 106.1061 -3771, 68.92239, 132.2605 -3772, 68.34907, 118.027 -3773, 65.8834, 131.8548 -3774, 65.81926, 122.7493 -3775, 67.6519, 126.4083 -3776, 69.91178, 135.567 -3777, 69.43847, 144.6145 -3778, 68.6245, 133.9108 -3779, 68.5874, 139.0597 -3780, 69.96201, 143.3765 -3781, 68.48251, 133.9215 -3782, 70.14044, 132.9707 -3783, 67.69318, 151.5436 -3784, 69.74263, 140.4279 -3785, 64.14704, 115.8887 -3786, 71.15494, 146.3078 -3787, 70.42127, 135.2438 -3788, 69.4086, 130.0152 -3789, 67.23391, 113.361 -3790, 69.52859, 109.7608 -3791, 69.78153, 155.0882 -3792, 65.86011, 116.5987 -3793, 68.53242, 115.8963 -3794, 69.43053, 123.8453 -3795, 70.51721, 132.1602 -3796, 72.46195, 150.0174 -3797, 70.57152, 123.4049 -3798, 64.81039, 113.7813 -3799, 69.14193, 124.9768 -3800, 72.59694, 140.1938 -3801, 67.29902, 125.6349 -3802, 69.3501, 124.6512 -3803, 69.0374, 115.7152 -3804, 71.50733, 147.7946 -3805, 68.58383, 123.7158 -3806, 68.9172, 137.4837 -3807, 69.94709, 119.3727 -3808, 68.63514, 111.791 -3809, 68.30987, 140.6815 -3810, 68.95399, 142.1807 -3811, 65.52576, 130.6623 -3812, 66.58753, 131.0557 -3813, 69.43486, 118.7635 -3814, 70.6428, 147.6001 -3815, 68.57866, 140.395 -3816, 68.1007, 129.3231 -3817, 70.56771, 125.4514 -3818, 64.97452, 107.0565 -3819, 67.85384, 128.0846 -3820, 71.17071, 131.245 -3821, 67.67057, 112.3113 -3822, 66.04283, 106.7968 -3823, 68.89472, 125.9164 -3824, 66.42827, 138.7008 -3825, 69.42646, 137.7593 -3826, 62.6568, 110.266 -3827, 65.79319, 128.2726 -3828, 71.35208, 150.3381 -3829, 68.54117, 120.4207 -3830, 66.64205, 118.7461 -3831, 67.1013, 132.3003 -3832, 68.09912, 122.8586 -3833, 67.44749, 116.2164 -3834, 68.5689, 105.9279 -3835, 66.74451, 111.2084 -3836, 67.91191, 115.9255 -3837, 67.61468, 132.6425 -3838, 66.79956, 128.7716 -3839, 66.08205, 105.5009 -3840, 69.43398, 130.8951 -3841, 70.06177, 159.8542 -3842, 67.34245, 113.1131 -3843, 65.68008, 104.7032 -3844, 67.65289, 130.0791 -3845, 72.35481, 146.3133 -3846, 64.56198, 117.9061 -3847, 66.56321, 125.872 -3848, 71.88064, 138.7186 -3849, 69.05855, 119.1382 -3850, 68.84729, 130.1311 -3851, 68.33558, 127.2486 -3852, 67.20373, 120.0823 -3853, 66.94024, 116.7898 -3854, 65.6925, 112.1004 -3855, 70.55858, 137.4236 -3856, 66.3239, 112.1502 -3857, 66.31961, 141.3789 -3858, 68.77019, 121.7461 -3859, 68.93596, 130.3465 -3860, 70.19784, 129.2123 -3861, 69.15846, 141.6059 -3862, 66.52917, 107.7722 -3863, 69.76951, 141.4952 -3864, 68.33707, 112.1581 -3865, 66.71052, 116.3208 -3866, 64.93669, 128.5199 -3867, 65.06581, 102.9057 -3868, 67.19588, 114.4447 -3869, 65.6155, 114.5452 -3870, 68.21154, 115.0009 -3871, 71.8127, 151.5781 -3872, 65.23439, 118.7079 -3873, 67.84537, 132.6379 -3874, 66.17647, 115.3378 -3875, 69.61315, 133.5897 -3876, 66.18245, 132.5006 -3877, 67.84508, 134.514 -3878, 69.0936, 126.1625 -3879, 66.12316, 131.3628 -3880, 65.15822, 116.0727 -3881, 69.79407, 141.3766 -3882, 67.00234, 127.3607 -3883, 69.13726, 140.2001 -3884, 65.81826, 126.6507 -3885, 68.20344, 121.9858 -3886, 66.89907, 134.2045 -3887, 65.04452, 102.086 -3888, 66.1717, 117.7314 -3889, 62.93166, 114.6211 -3890, 64.48357, 117.4963 -3891, 66.64624, 111.7542 -3892, 72.41441, 151.933 -3893, 71.79969, 122.983 -3894, 65.66078, 123.3884 -3895, 66.93932, 107.7347 -3896, 70.22759, 138.8617 -3897, 68.20998, 130.7491 -3898, 67.03876, 108.817 -3899, 70.72651, 119.7924 -3900, 67.43797, 132.67 -3901, 69.02832, 144.247 -3902, 71.08333, 130.1898 -3903, 66.59033, 119.8506 -3904, 62.84458, 112.1475 -3905, 65.01513, 112.6016 -3906, 68.89573, 126.6749 -3907, 67.52318, 120.368 -3908, 71.56209, 136.2017 -3909, 69.91081, 114.942 -3910, 65.74474, 116.1331 -3911, 67.86476, 131.3966 -3912, 69.34915, 126.219 -3913, 66.56305, 126.8313 -3914, 64.98952, 106.6708 -3915, 66.28774, 136.3548 -3916, 68.22623, 144.8283 -3917, 68.71834, 121.2425 -3918, 67.34642, 113.9096 -3919, 69.45129, 133.1979 -3920, 68.58821, 118.7312 -3921, 67.13792, 139.5328 -3922, 66.17703, 122.4766 -3923, 65.11882, 136.7334 -3924, 68.98184, 162.1526 -3925, 69.70654, 116.1377 -3926, 65.9028, 116.3873 -3927, 66.40799, 122.7559 -3928, 69.68697, 125.8107 -3929, 71.32231, 127.1985 -3930, 69.39616, 126.21 -3931, 67.10007, 127.4093 -3932, 64.84823, 121.4686 -3933, 65.97406, 120.1281 -3934, 69.40242, 130.8887 -3935, 70.24875, 148.6699 -3936, 66.76364, 108.979 -3937, 68.54135, 132.1438 -3938, 72.31585, 145.2904 -3939, 66.13369, 124.1218 -3940, 65.52533, 106.0457 -3941, 66.8421, 140.4934 -3942, 68.54828, 122.1607 -3943, 67.23496, 135.7089 -3944, 67.89102, 137.9068 -3945, 67.07543, 123.7723 -3946, 68.87056, 131.1289 -3947, 65.48833, 127.832 -3948, 66.94598, 131.0884 -3949, 67.94876, 116.698 -3950, 65.11113, 139.1882 -3951, 69.22852, 144.2813 -3952, 68.87917, 117.3348 -3953, 69.73424, 127.2578 -3954, 70.79565, 138.2181 -3955, 68.12213, 143.3238 -3956, 67.55313, 122.4926 -3957, 66.07053, 137.4736 -3958, 66.64782, 113.759 -3959, 67.54927, 135.4559 -3960, 67.41612, 111.8086 -3961, 64.1913, 123.1259 -3962, 67.52166, 133.1484 -3963, 65.95635, 107.8398 -3964, 67.61855, 125.8836 -3965, 65.95909, 129.0219 -3966, 69.49194, 113.9079 -3967, 67.69417, 134.568 -3968, 64.78748, 127.7878 -3969, 71.3001, 139.1262 -3970, 66.61133, 112.8285 -3971, 66.40129, 121.8472 -3972, 70.76906, 124.1304 -3973, 68.70195, 118.0629 -3974, 69.27545, 135.7574 -3975, 67.14179, 109.264 -3976, 69.40629, 144.7036 -3977, 69.69594, 142.5173 -3978, 67.20823, 137.1694 -3979, 67.59632, 113.3993 -3980, 70.77557, 144.7135 -3981, 66.95587, 128.8462 -3982, 67.91794, 117.0118 -3983, 65.76874, 116.0326 -3984, 69.03038, 132.8327 -3985, 67.53969, 134.5132 -3986, 64.10668, 124.705 -3987, 68.20174, 128.7712 -3988, 68.42812, 135.5603 -3989, 70.21228, 146.5841 -3990, 68.22553, 123.0704 -3991, 67.75587, 132.6394 -3992, 70.5536, 139.4887 -3993, 67.1115, 130.7106 -3994, 66.50872, 102.3817 -3995, 67.80339, 121.6264 -3996, 66.82898, 114.8121 -3997, 66.51285, 117.0249 -3998, 68.00268, 116.0381 -3999, 67.30483, 116.7343 -4000, 67.32611, 119.0783 -4001, 69.00102, 126.7983 -4002, 67.75162, 131.9365 -4003, 67.085, 135.9003 -4004, 69.0139, 151.5006 -4005, 66.13638, 143.9136 -4006, 66.74555, 131.5241 -4007, 66.32903, 130.233 -4008, 65.30345, 123.9503 -4009, 69.79829, 126.6311 -4010, 67.5243, 115.4643 -4011, 71.02928, 148.2436 -4012, 69.46091, 129.9518 -4013, 69.36777, 135.4124 -4014, 68.57098, 141.1859 -4015, 62.44964, 109.5643 -4016, 68.97793, 124.3412 -4017, 65.21731, 118.4281 -4018, 67.07967, 126.0679 -4019, 68.77673, 132.1985 -4020, 68.66629, 132.1617 -4021, 65.65796, 121.8407 -4022, 67.81659, 147.0148 -4023, 68.49369, 135.6229 -4024, 67.72209, 131.8871 -4025, 67.18182, 149.6975 -4026, 68.74487, 132.2867 -4027, 70.54344, 145.1882 -4028, 67.49034, 113.6369 -4029, 70.04011, 121.888 -4030, 66.14103, 131.9355 -4031, 63.03853, 116.7342 -4032, 65.8375, 113.1662 -4033, 70.09381, 132.9761 -4034, 65.46276, 101.8479 -4035, 66.72609, 119.4606 -4036, 67.15508, 126.3196 -4037, 67.89972, 116.5061 -4038, 66.83955, 124.3345 -4039, 66.33542, 137.2975 -4040, 69.98947, 157.9877 -4041, 69.19394, 136.793 -4042, 71.8433, 144.8892 -4043, 67.96111, 116.363 -4044, 67.8762, 125.536 -4045, 64.85023, 109.135 -4046, 71.00028, 128.7879 -4047, 68.9177, 148.7167 -4048, 68.11801, 108.4191 -4049, 68.45508, 120.7972 -4050, 66.1659, 119.9403 -4051, 68.09431, 141.8006 -4052, 67.04148, 116.4363 -4053, 67.9941, 136.4958 -4054, 70.03532, 162.0645 -4055, 69.71898, 137.99 -4056, 66.11294, 127.9705 -4057, 66.512, 124.0973 -4058, 72.14119, 147.0929 -4059, 66.26162, 136.034 -4060, 68.6341, 134.9883 -4061, 67.01999, 108.4088 -4062, 68.50946, 115.87 -4063, 66.65107, 132.7811 -4064, 69.13504, 150.0321 -4065, 66.3268, 124.4084 -4066, 69.03467, 125.2378 -4067, 68.41501, 131.125 -4068, 68.81498, 120.474 -4069, 69.71434, 126.7877 -4070, 69.71611, 119.4332 -4071, 68.46316, 121.7583 -4072, 66.76387, 127.8974 -4073, 65.40254, 113.6724 -4074, 70.56984, 123.8685 -4075, 65.94172, 123.6931 -4076, 68.02141, 122.0341 -4077, 67.1732, 114.7014 -4078, 65.497, 117.2034 -4079, 67.67185, 121.3213 -4080, 65.52488, 125.4382 -4081, 71.02076, 138.2195 -4082, 66.22083, 130.9358 -4083, 68.98001, 115.4355 -4084, 66.95762, 137.2853 -4085, 67.11276, 127.0824 -4086, 68.4405, 129.3152 -4087, 67.69709, 131.4005 -4088, 63.22395, 116.1956 -4089, 65.22711, 127.0613 -4090, 68.43, 131.3423 -4091, 66.57506, 121.9677 -4092, 63.5966, 113.2103 -4093, 67.20354, 123.3458 -4094, 66.03224, 99.66224 -4095, 67.24122, 124.0545 -4096, 66.79748, 130.086 -4097, 68.48589, 137.1664 -4098, 69.29654, 141.1792 -4099, 66.60912, 101.7777 -4100, 66.26464, 128.8128 -4101, 69.37333, 129.9046 -4102, 67.3275, 127.3943 -4103, 63.91658, 113.9444 -4104, 67.23806, 103.9784 -4105, 65.93291, 117.1245 -4106, 70.35586, 135.3823 -4107, 68.57141, 131.0931 -4108, 66.82713, 130.6498 -4109, 64.43271, 119.4229 -4110, 71.08973, 127.4216 -4111, 72.07911, 124.3172 -4112, 68.90533, 114.8714 -4113, 68.44145, 121.075 -4114, 68.46055, 115.3401 -4115, 65.13343, 106.3017 -4116, 71.17466, 131.6919 -4117, 69.39047, 139.886 -4118, 66.81513, 118.6787 -4119, 68.62714, 121.1908 -4120, 68.09304, 134.8095 -4121, 68.22911, 128.3543 -4122, 67.79469, 135.8259 -4123, 67.60704, 127.516 -4124, 70.47713, 135.5209 -4125, 68.89196, 119.3961 -4126, 67.18902, 141.7312 -4127, 69.52776, 138.0107 -4128, 64.00428, 106.2963 -4129, 67.23705, 129.0392 -4130, 66.57904, 110.0436 -4131, 73.08886, 143.597 -4132, 70.23666, 135.6427 -4133, 65.9154, 120.8619 -4134, 70.20771, 129.7829 -4135, 65.25899, 110.1349 -4136, 67.70538, 122.3278 -4137, 66.65382, 125.1019 -4138, 66.90522, 121.2072 -4139, 69.73584, 135.8864 -4140, 68.71515, 120.8681 -4141, 65.97593, 125.6805 -4142, 66.04025, 129.139 -4143, 69.22349, 147.1694 -4144, 68.01411, 124.9845 -4145, 70.44079, 141.5704 -4146, 66.62715, 138.6126 -4147, 68.47642, 126.7582 -4148, 68.20132, 134.1926 -4149, 69.18686, 148.1132 -4150, 66.55515, 122.4609 -4151, 67.24936, 125.9051 -4152, 68.23976, 134.1521 -4153, 68.93236, 140.8846 -4154, 69.16831, 127.3274 -4155, 68.15988, 127.5146 -4156, 70.47785, 135.4777 -4157, 71.46159, 134.7474 -4158, 69.56493, 139.1714 -4159, 72.04678, 147.9343 -4160, 68.11706, 122.1187 -4161, 67.11974, 136.1107 -4162, 65.25882, 112.8949 -4163, 67.9316, 127.1332 -4164, 68.62153, 134.6362 -4165, 68.96662, 110.1335 -4166, 67.70641, 137.8451 -4167, 64.82138, 132.6417 -4168, 69.74734, 130.7984 -4169, 67.83743, 126.8633 -4170, 66.47424, 119.564 -4171, 70.29564, 136.1613 -4172, 67.99529, 136.5186 -4173, 71.46156, 132.6211 -4174, 66.73734, 114.2795 -4175, 66.34826, 116.7421 -4176, 69.25165, 137.7726 -4177, 67.54427, 130.0454 -4178, 70.67379, 135.7083 -4179, 67.30702, 135.6941 -4180, 64.62951, 101.3328 -4181, 66.57405, 130.5342 -4182, 69.29679, 137.3539 -4183, 69.27554, 121.0292 -4184, 69.50607, 120.3639 -4185, 68.26403, 141.0864 -4186, 69.86553, 139.0365 -4187, 70.7672, 136.4844 -4188, 69.24893, 142.8621 -4189, 67.01021, 104.1735 -4190, 69.1245, 145.5379 -4191, 71.27947, 120.9881 -4192, 74.03777, 139.5953 -4193, 67.16426, 120.8184 -4194, 69.16282, 125.9266 -4195, 68.09796, 126.298 -4196, 67.77952, 133.2805 -4197, 71.11526, 123.3401 -4198, 64.98837, 105.6441 -4199, 70.31512, 142.3548 -4200, 69.06438, 130.4546 -4201, 65.46827, 110.4915 -4202, 65.9316, 114.9535 -4203, 68.42739, 133.4786 -4204, 70.30053, 139.3092 -4205, 67.09535, 129.4262 -4206, 68.43342, 121.8407 -4207, 65.83898, 136.3506 -4208, 67.54012, 143.6547 -4209, 68.48012, 126.9991 -4210, 71.57695, 139.6645 -4211, 69.72167, 139.1423 -4212, 66.29363, 126.9897 -4213, 68.937, 142.7584 -4214, 71.41489, 149.8921 -4215, 69.62838, 143.7861 -4216, 71.18773, 152.4615 -4217, 68.30221, 143.546 -4218, 67.75946, 152.9883 -4219, 68.11064, 133.9839 -4220, 69.47284, 135.5993 -4221, 70.16644, 134.6592 -4222, 67.64262, 124.1779 -4223, 66.81134, 118.271 -4224, 64.94018, 121.7107 -4225, 65.36721, 121.3633 -4226, 68.54428, 133.1727 -4227, 67.97819, 114.8234 -4228, 68.34252, 137.7084 -4229, 68.31923, 122.5531 -4230, 66.1507, 105.4808 -4231, 67.80629, 119.5263 -4232, 70.13434, 135.1981 -4233, 65.63247, 122.1851 -4234, 65.52678, 114.9083 -4235, 68.04573, 136.5998 -4236, 68.17956, 143.4398 -4237, 66.65253, 103.9121 -4238, 68.05725, 133.6935 -4239, 67.34998, 119.11 -4240, 70.00498, 129.4393 -4241, 66.55749, 127.0247 -4242, 66.82552, 144.7401 -4243, 70.07322, 123.0627 -4244, 65.9202, 126.0649 -4245, 69.54043, 147.8452 -4246, 63.89592, 117.0034 -4247, 69.03457, 131.5836 -4248, 67.22877, 125.3671 -4249, 66.12426, 128.6776 -4250, 67.87785, 132.3484 -4251, 66.8531, 115.879 -4252, 69.05041, 117.2786 -4253, 70.87198, 140.1922 -4254, 67.4692, 135.8756 -4255, 70.22874, 132.974 -4256, 66.93905, 117.9845 -4257, 69.928, 127.9273 -4258, 67.46962, 122.3518 -4259, 65.00765, 109.2661 -4260, 68.97698, 134.6605 -4261, 67.28864, 129.1099 -4262, 69.65152, 129.9016 -4263, 67.41038, 135.7013 -4264, 67.80162, 140.9551 -4265, 66.75484, 101.615 -4266, 67.9469, 127.0723 -4267, 65.43768, 127.1338 -4268, 68.54153, 125.4375 -4269, 66.7501, 120.7329 -4270, 66.75808, 124.1194 -4271, 67.14647, 118.2882 -4272, 64.69559, 116.7241 -4273, 69.18516, 113.5275 -4274, 66.84281, 128.2428 -4275, 66.4464, 130.5346 -4276, 69.49077, 106.2307 -4277, 68.32951, 119.3464 -4278, 68.38974, 120.9379 -4279, 69.42584, 120.7725 -4280, 64.39313, 123.2547 -4281, 66.61651, 118.437 -4282, 65.86548, 115.3497 -4283, 68.17805, 123.2437 -4284, 67.39926, 116.7036 -4285, 66.31407, 116.4127 -4286, 70.68802, 132.3031 -4287, 67.26683, 123.296 -4288, 67.1325, 117.0996 -4289, 67.61674, 132.7665 -4290, 66.91216, 122.0016 -4291, 70.58226, 146.1837 -4292, 66.47926, 132.2434 -4293, 69.5459, 146.3853 -4294, 66.60835, 119.6048 -4295, 67.34376, 137.8448 -4296, 64.77135, 124.6944 -4297, 66.46439, 128.8286 -4298, 66.64913, 119.3743 -4299, 70.56844, 123.43 -4300, 65.31528, 106.8598 -4301, 72.48479, 134.4771 -4302, 67.86837, 129.8224 -4303, 68.52634, 109.2449 -4304, 68.61738, 123.566 -4305, 66.50536, 125.5915 -4306, 70.46311, 126.8938 -4307, 64.63883, 137.3284 -4308, 64.12338, 108.9028 -4309, 69.28959, 135.4082 -4310, 66.52926, 131.7847 -4311, 69.30883, 122.2514 -4312, 68.54471, 134.4462 -4313, 67.25904, 108.6926 -4314, 67.96864, 124.3293 -4315, 65.3382, 131.6971 -4316, 68.51678, 129.4089 -4317, 68.1636, 127.5867 -4318, 64.67487, 128.3635 -4319, 66.13689, 130.3095 -4320, 68.58303, 132.5038 -4321, 68.34844, 145.901 -4322, 64.6569, 126.4447 -4323, 68.68484, 136.1093 -4324, 67.75816, 121.0123 -4325, 68.48014, 132.472 -4326, 67.7747, 126.7129 -4327, 64.7249, 115.7365 -4328, 66.6102, 118.9776 -4329, 72.2969, 145.854 -4330, 70.30878, 148.238 -4331, 66.77503, 122.7048 -4332, 66.70433, 120.42 -4333, 69.39368, 126.5408 -4334, 67.37433, 131.6976 -4335, 67.20466, 123.5504 -4336, 67.9947, 119.9449 -4337, 67.08886, 123.5117 -4338, 68.81947, 123.5561 -4339, 71.07494, 134.0842 -4340, 68.98151, 136.7907 -4341, 69.80853, 121.3415 -4342, 70.21339, 132.8196 -4343, 67.33679, 112.8553 -4344, 73.52131, 168.881 -4345, 67.45857, 131.4655 -4346, 68.65576, 121.3053 -4347, 68.77267, 126.5212 -4348, 67.03704, 125.3926 -4349, 66.86733, 114.7951 -4350, 67.01919, 134.5043 -4351, 68.52514, 133.6321 -4352, 67.69771, 121.778 -4353, 68.43487, 126.847 -4354, 67.71514, 128.0152 -4355, 70.39987, 113.918 -4356, 68.44396, 134.0367 -4357, 66.80834, 131.6397 -4358, 67.35984, 126.8163 -4359, 67.79903, 131.89 -4360, 64.83853, 115.6714 -4361, 69.57892, 126.2769 -4362, 64.85426, 102.1079 -4363, 69.318, 139.4982 -4364, 69.58868, 151.474 -4365, 66.52781, 122.1092 -4366, 67.93528, 125.7438 -4367, 66.39941, 123.1702 -4368, 68.28614, 136.4907 -4369, 68.17646, 116.4352 -4370, 65.36868, 117.4086 -4371, 67.96446, 112.4388 -4372, 69.02437, 139.9596 -4373, 68.08001, 121.2457 -4374, 67.68973, 128.3855 -4375, 67.05199, 120.0329 -4376, 65.62946, 109.3694 -4377, 64.31704, 129.4821 -4378, 69.08279, 152.901 -4379, 66.7653, 136.5692 -4380, 72.77662, 133.6427 -4381, 66.97685, 137.0715 -4382, 70.10322, 124.931 -4383, 68.92731, 131.7141 -4384, 65.24486, 119.642 -4385, 68.7959, 131.2416 -4386, 69.0613, 119.2979 -4387, 67.39122, 115.0093 -4388, 63.14333, 122.7882 -4389, 68.43035, 124.8597 -4390, 65.72614, 98.39409 -4391, 66.71343, 124.0144 -4392, 68.2317, 124.296 -4393, 67.07728, 124.0139 -4394, 68.10745, 132.0081 -4395, 67.23206, 134.8625 -4396, 69.76432, 136.0319 -4397, 66.65442, 127.9094 -4398, 67.20022, 136.8048 -4399, 71.20749, 138.9045 -4400, 71.64258, 154.3787 -4401, 68.09536, 139.4726 -4402, 68.11601, 138.099 -4403, 69.57164, 133.752 -4404, 67.897, 123.706 -4405, 68.92362, 133.4767 -4406, 68.85579, 129.4416 -4407, 66.93016, 145.6689 -4408, 71.03782, 126.1809 -4409, 66.94058, 121.4461 -4410, 69.32304, 142.2131 -4411, 67.21622, 119.7238 -4412, 64.26905, 106.7157 -4413, 67.43203, 130.1147 -4414, 68.98981, 138.5589 -4415, 67.38395, 120.821 -4416, 67.72313, 112.5397 -4417, 67.79721, 127.7983 -4418, 67.98674, 133.9054 -4419, 66.87883, 99.56439 -4420, 69.75841, 122.1663 -4421, 67.87888, 131.3067 -4422, 69.23586, 143.7584 -4423, 68.7266, 151.6764 -4424, 67.19957, 115.6396 -4425, 66.58109, 107.1456 -4426, 68.82634, 150.2899 -4427, 67.67068, 118.7544 -4428, 64.81833, 108.9651 -4429, 68.88452, 136.5556 -4430, 65.39146, 124.8106 -4431, 69.91503, 119.8377 -4432, 63.54206, 99.76986 -4433, 70.13123, 148.4142 -4434, 67.05703, 133.3179 -4435, 69.45941, 135.9285 -4436, 66.94935, 128.028 -4437, 67.81851, 122.8946 -4438, 63.65292, 127.5172 -4439, 67.11763, 127.4499 -4440, 68.64794, 136.7766 -4441, 69.3026, 132.8961 -4442, 68.60861, 122.4088 -4443, 66.80109, 113.3951 -4444, 70.87196, 115.3527 -4445, 67.90794, 136.4296 -4446, 64.88167, 131.3802 -4447, 70.78203, 151.4922 -4448, 70.35834, 112.2811 -4449, 66.99549, 129.9559 -4450, 68.83182, 116.898 -4451, 67.33693, 124.2691 -4452, 68.98465, 127.9153 -4453, 67.60913, 139.9747 -4454, 65.38645, 117.6032 -4455, 68.16769, 133.1749 -4456, 68.17351, 119.293 -4457, 69.88287, 122.8937 -4458, 67.58588, 123.5244 -4459, 68.5846, 131.1773 -4460, 67.00383, 95.88791 -4461, 69.99553, 158.3578 -4462, 72.53259, 133.576 -4463, 65.08427, 135.3471 -4464, 66.11127, 128.7408 -4465, 69.9046, 129.0113 -4466, 67.97472, 118.2064 -4467, 66.82932, 136.9731 -4468, 69.3533, 134.4424 -4469, 71.39534, 124.8929 -4470, 66.59922, 136.3075 -4471, 69.40189, 120.8579 -4472, 70.27495, 135.9954 -4473, 67.31858, 124.6169 -4474, 71.45173, 131.5614 -4475, 68.83931, 157.078 -4476, 68.99723, 124.6289 -4477, 67.73454, 132.1244 -4478, 64.8353, 118.2692 -4479, 70.74426, 139.9319 -4480, 72.26598, 149.2389 -4481, 64.72663, 126.0976 -4482, 67.5752, 119.6545 -4483, 69.51645, 140.2187 -4484, 70.48831, 111.7304 -4485, 69.32666, 128.4377 -4486, 68.52587, 109.5741 -4487, 73.16001, 135.1826 -4488, 64.28542, 119.4849 -4489, 66.65608, 135.1861 -4490, 64.71064, 111.5654 -4491, 62.99042, 115.6669 -4492, 68.70787, 123.0031 -4493, 68.12126, 126.6086 -4494, 66.77899, 122.0006 -4495, 68.23149, 119.6607 -4496, 68.42894, 122.0538 -4497, 64.0197, 127.9519 -4498, 71.09565, 117.1362 -4499, 69.87248, 147.2908 -4500, 66.51831, 125.4061 -4501, 68.57445, 123.3187 -4502, 67.46212, 139.4874 -4503, 69.61527, 137.9174 -4504, 66.86386, 119.266 -4505, 66.18998, 115.9555 -4506, 69.7905, 130.5095 -4507, 70.21174, 131.2829 -4508, 71.14846, 130.8226 -4509, 74.28376, 147.7877 -4510, 64.48835, 102.7518 -4511, 65.97201, 124.009 -4512, 66.51754, 134.4456 -4513, 67.83224, 125.095 -4514, 68.7614, 138.5499 -4515, 70.18641, 134.395 -4516, 65.12676, 118.875 -4517, 71.25743, 136.5501 -4518, 67.75602, 127.7343 -4519, 67.80062, 120.5416 -4520, 66.71286, 137.1043 -4521, 65.9331, 119.1788 -4522, 70.75201, 124.9258 -4523, 64.36337, 100.9973 -4524, 66.51439, 111.0706 -4525, 69.03382, 143.6707 -4526, 65.454, 124.8217 -4527, 68.82248, 136.6368 -4528, 69.35365, 136.1504 -4529, 68.4663, 126.8492 -4530, 69.50765, 133.1992 -4531, 67.68823, 138.961 -4532, 69.41031, 136.4148 -4533, 69.67469, 118.0784 -4534, 68.04007, 149.4074 -4535, 65.16827, 124.2854 -4536, 66.15991, 131.0075 -4537, 65.87678, 122.0955 -4538, 66.73303, 125.1468 -4539, 66.77722, 107.7781 -4540, 67.93868, 131.2999 -4541, 67.48863, 128.1304 -4542, 70.19163, 111.1449 -4543, 66.40732, 111.0917 -4544, 68.05629, 115.4242 -4545, 65.52001, 132.1594 -4546, 65.64331, 121.3271 -4547, 65.63637, 136.2254 -4548, 67.70932, 115.7406 -4549, 67.49917, 133.5066 -4550, 66.29127, 127.8453 -4551, 69.74138, 142.3054 -4552, 63.45437, 106.2611 -4553, 69.46406, 134.3778 -4554, 68.05326, 120.6881 -4555, 67.07399, 139.5754 -4556, 65.59536, 124.4232 -4557, 70.01907, 122.7936 -4558, 67.13432, 122.1132 -4559, 69.95471, 139.8142 -4560, 68.31764, 130.2584 -4561, 67.93284, 111.6216 -4562, 68.37831, 109.8238 -4563, 69.38169, 138.2864 -4564, 67.83912, 121.4831 -4565, 66.76314, 120.3041 -4566, 69.13398, 124.0916 -4567, 65.58554, 119.738 -4568, 67.12002, 132.4267 -4569, 68.20826, 126.163 -4570, 69.83352, 124.5901 -4571, 68.52243, 129.9774 -4572, 66.61883, 114.8356 -4573, 67.03413, 123.505 -4574, 68.58395, 124.7217 -4575, 68.48187, 126.5771 -4576, 68.22285, 143.9747 -4577, 70.11615, 127.6471 -4578, 64.31068, 119.6461 -4579, 68.91069, 103.7011 -4580, 68.01192, 140.6438 -4581, 68.44067, 130.1721 -4582, 69.5139, 132.2547 -4583, 69.20247, 118.3357 -4584, 66.04611, 107.3271 -4585, 66.015, 134.3205 -4586, 69.00199, 128.0736 -4587, 69.61754, 143.0774 -4588, 69.41293, 127.4879 -4589, 68.42341, 117.5081 -4590, 68.59122, 132.3095 -4591, 70.47426, 126.1309 -4592, 70.13001, 138.7704 -4593, 69.01521, 128.4133 -4594, 70.97422, 129.5877 -4595, 69.42301, 116.2255 -4596, 66.84684, 111.121 -4597, 68.37668, 118.7218 -4598, 67.80923, 131.6974 -4599, 66.4699, 141.4318 -4600, 70.23437, 138.4311 -4601, 70.16075, 139.4051 -4602, 66.23907, 109.824 -4603, 68.76154, 125.4809 -4604, 64.64843, 122.8828 -4605, 69.51686, 150.847 -4606, 67.7263, 128.1654 -4607, 68.53926, 121.0356 -4608, 68.16448, 137.2303 -4609, 70.16738, 131.504 -4610, 66.92499, 127.9481 -4611, 67.18215, 127.5982 -4612, 65.35392, 125.9641 -4613, 67.71159, 128.942 -4614, 69.35197, 123.6344 -4615, 67.54023, 132.426 -4616, 68.43556, 122.0015 -4617, 66.50187, 130.4876 -4618, 68.9358, 127.2358 -4619, 65.99168, 119.7409 -4620, 69.45486, 140.6464 -4621, 66.9045, 137.6207 -4622, 67.63969, 118.1787 -4623, 66.1437, 128.4443 -4624, 67.59159, 134.3476 -4625, 71.78019, 166.3016 -4626, 69.44107, 123.4122 -4627, 71.98935, 142.7132 -4628, 70.15393, 123.8781 -4629, 70.10971, 126.9465 -4630, 66.68738, 117.3343 -4631, 70.49701, 137.1545 -4632, 65.43499, 105.8885 -4633, 69.52902, 123.5902 -4634, 66.08382, 128.3405 -4635, 67.53462, 122.189 -4636, 66.70738, 119.1554 -4637, 67.68437, 127.9357 -4638, 64.9133, 117.8536 -4639, 66.99054, 114.2598 -4640, 66.90392, 124.3436 -4641, 68.30928, 121.873 -4642, 67.78254, 107.1698 -4643, 66.67402, 105.6942 -4644, 68.02345, 105.9209 -4645, 66.26386, 110.0377 -4646, 68.65872, 126.4691 -4647, 68.8758, 133.5623 -4648, 70.66494, 110.5288 -4649, 67.46764, 142.8422 -4650, 66.86561, 131.3179 -4651, 68.07938, 142.0148 -4652, 66.97214, 105.1855 -4653, 67.09087, 119.0616 -4654, 66.25477, 131.6159 -4655, 68.48544, 123.1869 -4656, 67.56328, 114.1342 -4657, 67.94652, 127.8594 -4658, 67.63842, 123.8136 -4659, 69.49172, 139.1029 -4660, 69.35023, 117.3644 -4661, 68.48414, 155.8502 -4662, 67.34242, 133.4692 -4663, 63.7973, 128.2173 -4664, 66.47145, 128.9056 -4665, 68.39396, 145.1997 -4666, 67.86356, 117.7852 -4667, 69.62777, 129.2314 -4668, 65.50648, 110.3151 -4669, 72.72292, 145.1721 -4670, 70.14217, 132.9902 -4671, 68.78695, 121.1068 -4672, 68.67806, 137.4109 -4673, 71.31953, 141.1587 -4674, 67.84642, 137.6199 -4675, 68.40321, 111.129 -4676, 65.63922, 129.8425 -4677, 70.43045, 130.4964 -4678, 68.00444, 124.4823 -4679, 67.39155, 138.9571 -4680, 68.0015, 136.2141 -4681, 69.24153, 131.2422 -4682, 68.36251, 106.3978 -4683, 68.48326, 124.4191 -4684, 63.36476, 110.7614 -4685, 64.47663, 125.7709 -4686, 65.29852, 114.0163 -4687, 66.60327, 135.8777 -4688, 71.58316, 133.3415 -4689, 69.32199, 138.8873 -4690, 69.28785, 132.6007 -4691, 65.72065, 123.9237 -4692, 70.17847, 127.4536 -4693, 67.75328, 148.2412 -4694, 68.02834, 122.158 -4695, 67.12107, 119.7528 -4696, 69.66713, 117.5732 -4697, 69.00275, 125.9822 -4698, 65.31244, 137.7114 -4699, 67.28896, 108.2831 -4700, 68.80003, 133.9222 -4701, 68.98651, 128.5798 -4702, 67.06068, 136.4265 -4703, 68.05695, 128.2201 -4704, 66.84523, 112.124 -4705, 68.59912, 135.1695 -4706, 67.74997, 127.2095 -4707, 67.38104, 119.7502 -4708, 69.44609, 119.5742 -4709, 66.16242, 137.4896 -4710, 68.41685, 129.0061 -4711, 71.03861, 147.6293 -4712, 66.91687, 126.9994 -4713, 68.77967, 110.6833 -4714, 69.49877, 137.0191 -4715, 65.22814, 125.0944 -4716, 66.60077, 142.9751 -4717, 69.16164, 129.2245 -4718, 67.09027, 142.6689 -4719, 67.51801, 133.2004 -4720, 63.13165, 135.8015 -4721, 73.45251, 155.9981 -4722, 63.47897, 110.1628 -4723, 67.17019, 137.8439 -4724, 66.73316, 121.0711 -4725, 67.93199, 115.9738 -4726, 70.64087, 129.3937 -4727, 65.33506, 111.071 -4728, 66.92901, 111.5159 -4729, 71.16317, 144.9723 -4730, 68.19393, 123.3543 -4731, 68.17463, 127.3197 -4732, 65.15114, 111.6275 -4733, 66.95485, 123.4444 -4734, 68.71217, 116.1338 -4735, 66.21228, 106.3145 -4736, 68.06876, 129.3926 -4737, 70.20125, 145.3962 -4738, 67.33368, 130.253 -4739, 67.63632, 144.0878 -4740, 66.23692, 122.5351 -4741, 67.59318, 133.0454 -4742, 67.82746, 107.4374 -4743, 71.17149, 149.076 -4744, 64.72317, 116.8801 -4745, 63.55844, 103.049 -4746, 69.71436, 117.5245 -4747, 68.3598, 130.8889 -4748, 68.51115, 143.0422 -4749, 66.59144, 105.2595 -4750, 68.90018, 120.1055 -4751, 68.62103, 143.016 -4752, 67.84607, 126.8695 -4753, 68.54416, 138.9043 -4754, 66.54197, 121.5207 -4755, 70.09349, 131.7383 -4756, 68.07186, 120.9546 -4757, 69.12659, 138.612 -4758, 70.69432, 147.3622 -4759, 68.92726, 130.0261 -4760, 67.10353, 124.1674 -4761, 68.07727, 143.489 -4762, 65.82037, 123.8217 -4763, 68.89326, 130.7247 -4764, 66.85902, 123.2355 -4765, 69.44484, 114.1544 -4766, 68.71047, 153.0572 -4767, 69.65196, 126.5914 -4768, 66.28558, 120.8002 -4769, 69.30112, 129.099 -4770, 70.5502, 145.7179 -4771, 67.09825, 121.1429 -4772, 66.43672, 119.0362 -4773, 68.01988, 134.8026 -4774, 65.04188, 132.806 -4775, 69.12072, 127.696 -4776, 66.70731, 131.1142 -4777, 71.77408, 129.1887 -4778, 68.2889, 114.3058 -4779, 64.9734, 114.0111 -4780, 71.4599, 141.1522 -4781, 65.03556, 113.4672 -4782, 69.05564, 136.4157 -4783, 70.76986, 134.7036 -4784, 67.74608, 129.3842 -4785, 65.393, 97.8247 -4786, 68.01276, 130.7321 -4787, 70.21576, 146.9626 -4788, 69.68073, 139.0045 -4789, 67.54382, 126.4992 -4790, 70.15526, 138.6155 -4791, 68.40203, 123.6083 -4792, 65.77722, 132.5113 -4793, 66.97553, 125.2087 -4794, 69.02762, 116.7207 -4795, 68.43486, 140.1941 -4796, 68.55513, 115.1087 -4797, 69.0732, 129.883 -4798, 68.09033, 124.4072 -4799, 69.05185, 127.8751 -4800, 66.95318, 118.9592 -4801, 69.27087, 136.2203 -4802, 64.46096, 114.2431 -4803, 64.9549, 111.1484 -4804, 66.87663, 134.4741 -4805, 68.23273, 125.8111 -4806, 69.044, 137.9178 -4807, 69.87691, 109.3782 -4808, 66.17919, 115.505 -4809, 65.71652, 120.607 -4810, 65.66691, 130.3822 -4811, 70.42201, 130.8399 -4812, 68.53986, 141.4287 -4813, 67.62274, 113.1045 -4814, 69.96111, 120.7486 -4815, 65.83646, 111.1042 -4816, 68.88975, 136.915 -4817, 66.11515, 125.3766 -4818, 68.70642, 132.7497 -4819, 65.79474, 118.1206 -4820, 68.52388, 129.7188 -4821, 70.82503, 138.2801 -4822, 69.38767, 127.8541 -4823, 64.99997, 106.3608 -4824, 67.55168, 118.5889 -4825, 67.1831, 117.5862 -4826, 68.17915, 133.4329 -4827, 69.20783, 120.0598 -4828, 69.94376, 124.5943 -4829, 64.18266, 118.6707 -4830, 68.05417, 135.4153 -4831, 66.24238, 121.9611 -4832, 69.33374, 133.7451 -4833, 67.55372, 118.1307 -4834, 67.24855, 128.5772 -4835, 66.37183, 124.8378 -4836, 66.21681, 135.8262 -4837, 68.48138, 115.2564 -4838, 65.99503, 146.0235 -4839, 68.20817, 143.0554 -4840, 64.83886, 120.4189 -4841, 69.47052, 136.1018 -4842, 70.66531, 135.2724 -4843, 65.31799, 113.9184 -4844, 73.62592, 144.2733 -4845, 65.64183, 139.218 -4846, 66.1763, 137.8042 -4847, 68.20944, 123.0101 -4848, 67.33013, 126.067 -4849, 70.70642, 148.5372 -4850, 69.27187, 110.7831 -4851, 66.49201, 120.029 -4852, 63.73844, 122.7468 -4853, 68.73929, 128.6261 -4854, 65.95611, 120.8344 -4855, 68.2791, 125.4675 -4856, 66.29813, 127.7337 -4857, 67.26906, 132.8131 -4858, 70.01685, 141.7715 -4859, 66.99124, 121.3387 -4860, 63.33461, 116.4184 -4861, 66.48133, 114.4604 -4862, 66.96424, 126.3607 -4863, 67.76229, 129.6594 -4864, 68.64237, 128.845 -4865, 70.16208, 141.6777 -4866, 70.96379, 140.0763 -4867, 69.50635, 126.771 -4868, 63.75673, 104.9152 -4869, 67.97424, 152.1104 -4870, 66.1089, 119.3998 -4871, 63.30114, 102.7788 -4872, 68.76435, 104.4743 -4873, 67.68224, 122.9173 -4874, 71.11972, 130.0384 -4875, 68.865, 121.9668 -4876, 70.02623, 131.5675 -4877, 65.6918, 107.2827 -4878, 63.3557, 117.6886 -4879, 66.86873, 143.4791 -4880, 63.65356, 102.6027 -4881, 65.50331, 116.8988 -4882, 68.61979, 123.9844 -4883, 71.06865, 136.2899 -4884, 67.90434, 123.2082 -4885, 69.04428, 144.3998 -4886, 68.23808, 145.3389 -4887, 67.60055, 119.9359 -4888, 68.72349, 131.6298 -4889, 69.72755, 133.7225 -4890, 67.39229, 146.2703 -4891, 67.19624, 119.8227 -4892, 65.56913, 107.9515 -4893, 65.93896, 109.1714 -4894, 68.3392, 134.1385 -4895, 66.37854, 130.6212 -4896, 68.06195, 116.0239 -4897, 72.14804, 134.4365 -4898, 66.3, 134.8203 -4899, 70.52384, 116.5449 -4900, 65.956, 126.3619 -4901, 69.77937, 127.6585 -4902, 68.01271, 125.5257 -4903, 71.04627, 134.624 -4904, 70.30748, 129.3855 -4905, 69.8685, 127.9899 -4906, 68.55351, 119.5254 -4907, 68.04279, 111.4427 -4908, 68.32377, 143.6406 -4909, 68.43992, 124.9 -4910, 69.70106, 125.39 -4911, 69.86274, 126.7733 -4912, 65.28588, 120.2017 -4913, 68.23316, 120.3497 -4914, 67.56772, 130.5236 -4915, 67.92319, 137.9222 -4916, 65.9763, 118.559 -4917, 66.72703, 126.2936 -4918, 67.16036, 135.8841 -4919, 67.7804, 122.1423 -4920, 64.55365, 106.3292 -4921, 67.47804, 131.5261 -4922, 67.29005, 122.7303 -4923, 66.84522, 114.8025 -4924, 63.83743, 120.2347 -4925, 64.04876, 122.1794 -4926, 69.05705, 145.6834 -4927, 66.07726, 117.709 -4928, 69.83849, 131.9638 -4929, 70.33978, 128.3473 -4930, 67.88517, 132.8351 -4931, 66.30635, 120.4227 -4932, 70.70419, 127.4847 -4933, 64.63844, 111.2536 -4934, 67.37468, 118.4249 -4935, 67.32338, 132.2462 -4936, 68.79557, 137.0621 -4937, 69.49827, 130.716 -4938, 69.18297, 133.2681 -4939, 68.05335, 120.2172 -4940, 65.60027, 124.9529 -4941, 69.84728, 135.0017 -4942, 71.20265, 155.3163 -4943, 66.1002, 114.3986 -4944, 68.91567, 143.1158 -4945, 65.88189, 111.2503 -4946, 67.45521, 121.8782 -4947, 67.21505, 122.1602 -4948, 65.97609, 124.7486 -4949, 67.96746, 130.7902 -4950, 66.85926, 128.0209 -4951, 67.62991, 120.2907 -4952, 67.1994, 125.7923 -4953, 65.68971, 131.2235 -4954, 68.65173, 131.3886 -4955, 68.37333, 126.8527 -4956, 66.48906, 112.4772 -4957, 66.03608, 126.3124 -4958, 67.01056, 118.5625 -4959, 67.52148, 141.824 -4960, 68.94504, 135.164 -4961, 65.95216, 138.0343 -4962, 68.70893, 111.9057 -4963, 64.0908, 109.4352 -4964, 66.00548, 106.1651 -4965, 70.50014, 138.7377 -4966, 69.06617, 138.8835 -4967, 67.20849, 131.6754 -4968, 68.71365, 133.501 -4969, 70.4988, 123.6003 -4970, 70.09293, 120.5015 -4971, 67.10959, 127.9008 -4972, 67.94613, 108.2182 -4973, 69.9019, 132.8392 -4974, 68.45258, 112.1406 -4975, 69.5192, 131.5346 -4976, 65.52153, 124.897 -4977, 67.62906, 115.9246 -4978, 69.24378, 138.2668 -4979, 68.39542, 131.5288 -4980, 64.77157, 110.1024 -4981, 70.23436, 137.102 -4982, 65.18062, 109.788 -4983, 66.20453, 112.9286 -4984, 70.60819, 148.2754 -4985, 65.64079, 119.3393 -4986, 69.72804, 141.9129 -4987, 67.49767, 139.6238 -4988, 69.18779, 119.7962 -4989, 66.83553, 115.7201 -4990, 67.17618, 121.334 -4991, 68.75179, 159.3608 -4992, 66.51066, 133.2151 -4993, 67.34769, 141.3034 -4994, 71.80087, 129.831 -4995, 67.69782, 120.7103 -4996, 69.0048, 141.5982 -4997, 69.06523, 125.8677 -4998, 65.88747, 112.3178 -4999, 65.84895, 118.9697 -5000, 67.18311, 112.7574 -5001, 63.79598, 111.7201 -5002, 67.47173, 110.5494 -5003, 67.15867, 103.8433 -5004, 70.38311, 159.9758 -5005, 66.68444, 130.2472 -5006, 66.66715, 123.7624 -5007, 66.82297, 125.297 -5008, 66.6039, 122.711 -5009, 70.88882, 160.0364 -5010, 70.28146, 131.6777 -5011, 68.61527, 124.199 -5012, 68.94252, 122.5949 -5013, 70.00817, 143.777 -5014, 63.92219, 106.1497 -5015, 68.18982, 135.6658 -5016, 66.93297, 112.8116 -5017, 67.12819, 118.7819 -5018, 67.29436, 119.1211 -5019, 70.49073, 121.0715 -5020, 66.8532, 113.7029 -5021, 68.51902, 116.3811 -5022, 68.68968, 128.0095 -5023, 67.64082, 116.0115 -5024, 68.69251, 133.2729 -5025, 67.6248, 127.7888 -5026, 68.8846, 123.8782 -5027, 69.76061, 139.5499 -5028, 67.56118, 126.6252 -5029, 69.78513, 141.3982 -5030, 70.21612, 151.0506 -5031, 66.27644, 126.0282 -5032, 67.40846, 148.4483 -5033, 68.20932, 129.2407 -5034, 65.79974, 132.286 -5035, 64.49618, 106.4894 -5036, 65.69093, 125.0984 -5037, 68.48055, 130.2433 -5038, 66.17897, 123.5842 -5039, 63.55273, 101.2994 -5040, 67.68025, 118.3701 -5041, 65.4426, 109.8414 -5042, 67.53819, 131.1827 -5043, 67.20388, 125.2316 -5044, 65.10901, 131.8946 -5045, 67.71775, 116.0773 -5046, 66.27965, 98.28455 -5047, 71.03656, 127.6602 -5048, 69.39922, 134.0168 -5049, 67.60067, 123.7417 -5050, 69.41439, 125.4915 -5051, 67.06842, 135.2419 -5052, 68.06961, 122.0361 -5053, 63.88211, 117.4632 -5054, 65.9194, 120.1212 -5055, 70.23642, 124.4872 -5056, 63.84676, 116.313 -5057, 68.9074, 121.8405 -5058, 64.0135, 126.9209 -5059, 67.36541, 111.5266 -5060, 69.06481, 132.1843 -5061, 67.06091, 131.9966 -5062, 68.71498, 118.7562 -5063, 70.10334, 138.9367 -5064, 70.90589, 132.6605 -5065, 66.77943, 117.0903 -5066, 69.55338, 121.8668 -5067, 68.45538, 128.6212 -5068, 68.10538, 130.0686 -5069, 64.46289, 109.0084 -5070, 67.78582, 110.3563 -5071, 65.82491, 126.3494 -5072, 66.22711, 130.879 -5073, 65.4258, 130.8643 -5074, 69.33268, 123.4765 -5075, 65.30644, 111.1681 -5076, 70.66767, 151.1334 -5077, 67.86539, 127.2278 -5078, 65.68213, 114.755 -5079, 66.27532, 131.1304 -5080, 64.15129, 117.3512 -5081, 68.93691, 126.7825 -5082, 66.77623, 130.4524 -5083, 68.66098, 110.209 -5084, 66.03851, 120.0319 -5085, 71.34562, 131.9006 -5086, 66.26107, 118.9925 -5087, 70.96703, 136.5441 -5088, 65.92505, 114.2363 -5089, 66.47783, 119.0131 -5090, 68.65041, 144.86 -5091, 68.22052, 130.8069 -5092, 69.53697, 144.8661 -5093, 71.31389, 130.7968 -5094, 68.65623, 138.8268 -5095, 63.90685, 130.0556 -5096, 69.54723, 124.231 -5097, 63.83536, 119.8695 -5098, 69.43228, 110.2776 -5099, 68.8923, 127.6997 -5100, 65.97989, 142.5486 -5101, 73.25816, 157.0989 -5102, 65.69314, 138.5876 -5103, 69.95721, 128.1607 -5104, 69.93565, 130.3446 -5105, 67.55601, 119.1028 -5106, 67.47638, 115.6698 -5107, 69.05674, 128.3985 -5108, 68.54497, 136.1737 -5109, 70.44462, 116.6906 -5110, 67.11656, 131.4909 -5111, 67.60673, 115.494 -5112, 67.76797, 116.0487 -5113, 64.22799, 116.596 -5114, 67.64933, 138.6958 -5115, 66.94828, 126.0413 -5116, 68.83697, 145.686 -5117, 69.03861, 128.7906 -5118, 67.88536, 142.1595 -5119, 69.15298, 138.9115 -5120, 65.76655, 122.0769 -5121, 66.41848, 119.0393 -5122, 69.98636, 136.7085 -5123, 69.33663, 124.8379 -5124, 68.14856, 129.218 -5125, 69.61056, 124.5365 -5126, 70.24424, 132.7187 -5127, 64.66037, 110.1455 -5128, 67.14089, 132.4193 -5129, 66.55536, 120.6308 -5130, 67.02821, 134.6226 -5131, 66.61015, 131.3866 -5132, 67.87365, 134.9717 -5133, 68.48489, 121.162 -5134, 71.46727, 146.1977 -5135, 67.52509, 130.7501 -5136, 69.14416, 123.9601 -5137, 66.34347, 105.9251 -5138, 68.8517, 147.2738 -5139, 66.59398, 128.4305 -5140, 68.79421, 116.2545 -5141, 65.60404, 128.8795 -5142, 69.60759, 124.4609 -5143, 71.79002, 131.1114 -5144, 65.39644, 133.017 -5145, 68.186, 123.0559 -5146, 70.64194, 128.8506 -5147, 69.27806, 146.6325 -5148, 65.41192, 125.2607 -5149, 69.74131, 135.9477 -5150, 69.68791, 149.0918 -5151, 67.61616, 129.9896 -5152, 65.33279, 115.5896 -5153, 68.09827, 122.5938 -5154, 67.78589, 130.5478 -5155, 66.37325, 110.4683 -5156, 70.70383, 147.9488 -5157, 67.77536, 135.435 -5158, 70.16781, 132.2276 -5159, 65.08294, 124.8522 -5160, 68.09864, 139.5397 -5161, 69.72378, 127.9841 -5162, 66.10587, 129.5105 -5163, 68.81614, 128.4016 -5164, 66.34879, 136.5927 -5165, 68.85181, 131.0471 -5166, 67.88949, 135.8495 -5167, 67.3565, 124.7415 -5168, 67.87392, 123.9916 -5169, 67.82355, 120.0348 -5170, 68.93013, 119.6138 -5171, 66.72655, 104.4695 -5172, 69.96413, 141.4657 -5173, 70.92472, 133.859 -5174, 68.15966, 130.2032 -5175, 65.71158, 120.7602 -5176, 66.88241, 116.1838 -5177, 67.87445, 129.3543 -5178, 69.77941, 140.2507 -5179, 65.39579, 114.7891 -5180, 70.51058, 117.7705 -5181, 66.56644, 121.7629 -5182, 68.74163, 146.386 -5183, 68.50865, 142.5118 -5184, 67.86683, 136.538 -5185, 65.68959, 108.1989 -5186, 68.1756, 126.6541 -5187, 67.27204, 128.769 -5188, 65.3007, 130.2829 -5189, 68.37952, 126.2574 -5190, 70.39798, 119.4655 -5191, 65.3603, 112.0012 -5192, 68.8706, 129.9499 -5193, 66.21022, 116.362 -5194, 68.94788, 142.8095 -5195, 68.04951, 123.9961 -5196, 66.09906, 118.4749 -5197, 65.89673, 138.4134 -5198, 67.19993, 111.4001 -5199, 69.40899, 105.0894 -5200, 69.07487, 129.1519 -5201, 67.65384, 120.3397 -5202, 68.48956, 120.7475 -5203, 68.34723, 124.124 -5204, 69.67407, 140.3264 -5205, 65.19464, 119.1674 -5206, 69.81691, 139.3101 -5207, 64.26605, 115.7719 -5208, 68.77984, 128.1583 -5209, 64.94194, 119.9868 -5210, 69.40853, 136.2726 -5211, 66.60982, 120.7165 -5212, 68.74031, 143.4148 -5213, 72.8443, 146.7131 -5214, 65.56742, 114.1088 -5215, 67.30672, 119.2437 -5216, 67.87438, 129.1951 -5217, 67.37272, 110.0987 -5218, 68.52976, 132.8156 -5219, 67.2006, 120.7292 -5220, 71.326, 133.6295 -5221, 66.99797, 113.5302 -5222, 70.15071, 144.6167 -5223, 67.56198, 111.4511 -5224, 67.84632, 131.1354 -5225, 67.99597, 124.7397 -5226, 71.45949, 136.4103 -5227, 65.98938, 133.9456 -5228, 70.30094, 148.0703 -5229, 69.63548, 118.8671 -5230, 68.12716, 130.0225 -5231, 67.19533, 117.8517 -5232, 69.96297, 131.029 -5233, 70.75433, 139.7372 -5234, 64.90027, 99.29265 -5235, 67.53863, 122.6701 -5236, 66.93918, 112.5864 -5237, 66.74599, 114.6931 -5238, 67.53267, 124.3523 -5239, 67.03579, 113.4992 -5240, 66.19745, 119.4549 -5241, 66.16514, 116.2537 -5242, 70.4784, 141.2563 -5243, 66.71437, 112.926 -5244, 67.52916, 120.8297 -5245, 70.87923, 144.9908 -5246, 70.87713, 120.3404 -5247, 62.52373, 101.0402 -5248, 67.78636, 136.2587 -5249, 67.1394, 121.6793 -5250, 67.39241, 124.8535 -5251, 65.87821, 127.8471 -5252, 66.55073, 137.5442 -5253, 65.77153, 103.9089 -5254, 67.98557, 141.2212 -5255, 66.84341, 115.4613 -5256, 69.21199, 128.5016 -5257, 66.35945, 122.8733 -5258, 69.23369, 130.3051 -5259, 68.82616, 133.9048 -5260, 69.36336, 139.0361 -5261, 70.20959, 134.7929 -5262, 68.15011, 136.8965 -5263, 68.06755, 112.9757 -5264, 66.61783, 113.0753 -5265, 66.84021, 131.2762 -5266, 70.60805, 145.9398 -5267, 70.98349, 143.2473 -5268, 68.09578, 136.2662 -5269, 68.63828, 134.4078 -5270, 69.50947, 135.2759 -5271, 67.27908, 118.9625 -5272, 67.62248, 106.5357 -5273, 65.98498, 124.1788 -5274, 70.60025, 143.1552 -5275, 65.18921, 118.4354 -5276, 66.32422, 120.6698 -5277, 67.62091, 136.1237 -5278, 69.19727, 113.7928 -5279, 66.1129, 124.6016 -5280, 68.12418, 133.7479 -5281, 69.48945, 143.7332 -5282, 67.16699, 122.6097 -5283, 66.45846, 127.9224 -5284, 68.57463, 119.9155 -5285, 70.02842, 158.2521 -5286, 65.46377, 101.8393 -5287, 66.48352, 125.5619 -5288, 65.78847, 112.7934 -5289, 69.14324, 113.9947 -5290, 66.10192, 120.5016 -5291, 68.5156, 110.4182 -5292, 64.2164, 129.756 -5293, 69.15358, 129.065 -5294, 66.83911, 126.2087 -5295, 64.05746, 109.798 -5296, 67.80361, 134.8236 -5297, 67.78006, 146.6249 -5298, 66.0792, 121.5591 -5299, 67.54866, 119.1681 -5300, 67.18499, 111.7433 -5301, 66.36282, 123.4684 -5302, 66.21209, 120.9058 -5303, 69.61635, 123.0992 -5304, 66.83693, 123.2452 -5305, 71.80311, 132.7094 -5306, 67.0625, 126.7332 -5307, 72.96339, 135.2564 -5308, 70.34828, 151.3674 -5309, 70.09653, 150.9294 -5310, 69.20104, 140.2394 -5311, 70.35624, 132.7655 -5312, 69.78453, 144.8798 -5313, 71.39937, 129.2934 -5314, 67.0059, 116.8217 -5315, 66.79299, 124.906 -5316, 67.86676, 125.3757 -5317, 67.25419, 103.8437 -5318, 68.56236, 122.4352 -5319, 66.43275, 136.132 -5320, 68.91151, 125.792 -5321, 67.50477, 126.8799 -5322, 69.08511, 145.0689 -5323, 68.7803, 148.623 -5324, 66.66053, 135.6636 -5325, 68.66602, 114.7145 -5326, 68.47595, 114.8512 -5327, 67.53608, 128.0852 -5328, 66.23142, 121.6196 -5329, 69.17542, 124.7148 -5330, 67.34508, 120.9551 -5331, 67.77776, 117.0167 -5332, 66.91716, 115.5379 -5333, 68.65138, 130.497 -5334, 66.97762, 136.012 -5335, 69.11727, 140.2511 -5336, 65.2278, 132.8841 -5337, 66.3529, 126.9573 -5338, 67.90441, 122.0685 -5339, 67.14182, 107.8829 -5340, 69.26936, 139.1728 -5341, 67.55353, 123.1504 -5342, 69.1191, 127.1047 -5343, 66.5787, 130.5048 -5344, 68.34422, 126.8956 -5345, 70.87732, 142.4991 -5346, 66.25515, 109.9755 -5347, 70.20374, 142.2116 -5348, 65.37244, 119.6729 -5349, 69.21393, 139.5979 -5350, 66.65743, 125.0117 -5351, 70.90598, 144.8867 -5352, 67.63273, 116.9137 -5353, 67.44579, 133.6929 -5354, 69.61543, 149.4255 -5355, 70.72786, 134.2975 -5356, 67.81233, 134.3642 -5357, 68.88371, 130.2664 -5358, 67.59685, 128.0565 -5359, 66.18908, 129.8912 -5360, 67.0619, 122.516 -5361, 71.40566, 142.8255 -5362, 69.94381, 144.2052 -5363, 68.12088, 129.3957 -5364, 70.07833, 132.5733 -5365, 69.21921, 138.4788 -5366, 65.07625, 120.4977 -5367, 66.64317, 86.982 -5368, 69.09678, 136.2561 -5369, 67.29797, 128.014 -5370, 70.07962, 138.1994 -5371, 68.17719, 128.9954 -5372, 70.62613, 147.3147 -5373, 72.75675, 155.6063 -5374, 65.50945, 114.2107 -5375, 69.80503, 118.0632 -5376, 68.48037, 122.2135 -5377, 69.39191, 132.1548 -5378, 69.89743, 132.8384 -5379, 71.03366, 120.7296 -5380, 64.18042, 105.3415 -5381, 67.25981, 115.6019 -5382, 69.88668, 133.1821 -5383, 68.77416, 143.2226 -5384, 70.75119, 132.8196 -5385, 69.77175, 140.4321 -5386, 66.47653, 135.1056 -5387, 68.16365, 127.6326 -5388, 66.4353, 134.5752 -5389, 70.13482, 122.9368 -5390, 71.70658, 136.632 -5391, 66.92527, 123.4431 -5392, 67.12563, 123.5752 -5393, 69.16564, 125.887 -5394, 68.8406, 125.7733 -5395, 70.75604, 166.2812 -5396, 71.42444, 131.7763 -5397, 69.45553, 134.4084 -5398, 67.59746, 131.5971 -5399, 69.20977, 129.3553 -5400, 68.55325, 132.7205 -5401, 68.57877, 120.9452 -5402, 66.26275, 100.455 -5403, 65.96056, 113.3895 -5404, 69.5447, 134.9309 -5405, 69.03723, 121.8168 -5406, 70.25581, 149.6514 -5407, 65.24262, 118.8877 -5408, 66.61174, 123.9036 -5409, 65.44916, 129.4155 -5410, 68.46313, 115.2733 -5411, 70.08288, 130.4398 -5412, 68.28223, 134.7568 -5413, 67.00556, 125.5138 -5414, 66.02293, 109.5969 -5415, 69.16478, 135.6481 -5416, 67.21577, 131.9731 -5417, 69.00086, 135.9877 -5418, 70.75525, 135.7754 -5419, 69.25232, 127.8223 -5420, 67.57183, 119.3432 -5421, 67.67452, 132.6705 -5422, 67.40515, 124.2707 -5423, 64.86031, 100.9173 -5424, 69.39033, 112.2069 -5425, 65.9698, 129.9153 -5426, 67.55171, 123.0908 -5427, 68.46426, 116.498 -5428, 66.23821, 104.1053 -5429, 70.6257, 119.2626 -5430, 66.61423, 116.9318 -5431, 70.66932, 148.9742 -5432, 67.57132, 119.5476 -5433, 69.45353, 117.3488 -5434, 66.26159, 125.5437 -5435, 68.73293, 124.2368 -5436, 68.82534, 133.8431 -5437, 70.13099, 131.2805 -5438, 71.82375, 146.9215 -5439, 65.90074, 103.4218 -5440, 63.727, 120.0775 -5441, 66.99543, 121.7611 -5442, 67.3499, 132.3056 -5443, 67.16004, 112.2736 -5444, 70.5283, 128.9156 -5445, 68.45206, 121.7201 -5446, 66.09346, 105.8554 -5447, 64.7808, 125.8367 -5448, 68.29845, 132.8929 -5449, 66.31173, 125.5959 -5450, 64.36944, 122.6652 -5451, 69.23895, 132.3741 -5452, 70.56453, 122.723 -5453, 63.44115, 93.29146 -5454, 67.49847, 113.1057 -5455, 69.85577, 118.0316 -5456, 69.07982, 130.5538 -5457, 69.56211, 137.4123 -5458, 68.17484, 142.9581 -5459, 70.23972, 137.4064 -5460, 70.6554, 143.3564 -5461, 66.4574, 122.5937 -5462, 64.31855, 119.3805 -5463, 65.49751, 110.3743 -5464, 69.47428, 139.4867 -5465, 67.88158, 125.4501 -5466, 69.53913, 124.3466 -5467, 63.83987, 92.65767 -5468, 69.07601, 123.9516 -5469, 69.47709, 126.9161 -5470, 67.08504, 121.9957 -5471, 70.95488, 139.7854 -5472, 68.64084, 123.2444 -5473, 65.86462, 113.0349 -5474, 67.72662, 119.5902 -5475, 65.32212, 102.5086 -5476, 69.00392, 128.9232 -5477, 69.63523, 132.2697 -5478, 66.71665, 128.5803 -5479, 69.5893, 127.2246 -5480, 68.66987, 120.1516 -5481, 67.85418, 113.5575 -5482, 68.78852, 120.1342 -5483, 68.2002, 134.9707 -5484, 63.0824, 109.7702 -5485, 67.2833, 122.8477 -5486, 71.21834, 131.494 -5487, 71.01583, 138.9013 -5488, 69.88229, 143.1039 -5489, 67.19375, 121.1828 -5490, 68.76347, 130.2964 -5491, 66.83011, 120.5375 -5492, 70.56089, 132.0461 -5493, 69.67899, 140.8938 -5494, 66.96319, 122.3291 -5495, 68.67573, 115.6268 -5496, 66.39372, 121.1097 -5497, 69.81996, 125.3109 -5498, 68.00995, 124.8272 -5499, 66.95032, 118.4744 -5500, 70.96239, 144.0736 -5501, 66.27024, 126.7344 -5502, 68.21726, 115.0624 -5503, 66.56206, 112.4637 -5504, 69.03964, 137.6269 -5505, 68.68271, 131.7407 -5506, 68.91258, 115.3276 -5507, 68.02805, 123.1233 -5508, 68.64452, 111.4743 -5509, 67.98404, 120.7929 -5510, 65.72168, 123.0248 -5511, 68.50899, 125.2258 -5512, 68.74484, 118.5521 -5513, 65.70055, 121.1912 -5514, 68.13231, 126.9522 -5515, 69.1712, 102.8732 -5516, 70.67886, 122.3412 -5517, 68.837, 118.7874 -5518, 69.60496, 130.4536 -5519, 67.41523, 126.8208 -5520, 71.4, 154.97 -5521, 69.57502, 130.0883 -5522, 69.04149, 116.7796 -5523, 68.5837, 143.8448 -5524, 66.89024, 126.5347 -5525, 67.12473, 111.1866 -5526, 67.83542, 111.946 -5527, 70.46759, 138.7422 -5528, 67.7864, 142.7435 -5529, 69.58276, 143.2414 -5530, 67.16684, 125.1273 -5531, 67.13791, 108.6479 -5532, 68.79915, 132.8302 -5533, 67.64203, 127.7226 -5534, 64.70508, 111.3172 -5535, 68.08348, 133.8261 -5536, 67.56671, 124.2366 -5537, 64.28754, 102.4825 -5538, 64.85395, 111.9585 -5539, 73.24733, 138.1346 -5540, 64.89302, 114.3071 -5541, 67.43272, 133.0682 -5542, 65.7765, 118.0115 -5543, 70.7064, 145.9957 -5544, 67.52445, 125.9386 -5545, 67.01528, 116.8078 -5546, 68.16565, 113.8239 -5547, 67.99779, 149.3131 -5548, 68.52996, 110.5189 -5549, 67.53327, 120.1058 -5550, 67.30047, 123.1704 -5551, 67.63847, 134.5804 -5552, 68.52047, 138.8459 -5553, 68.03264, 127.8527 -5554, 67.28722, 118.5444 -5555, 68.42927, 127.9474 -5556, 69.7329, 125.5398 -5557, 69.72725, 127.1998 -5558, 69.73079, 152.3984 -5559, 69.97947, 137.3347 -5560, 68.9122, 119.5773 -5561, 66.70355, 122.2617 -5562, 68.64652, 136.3536 -5563, 67.56584, 136.2134 -5564, 67.35146, 123.6386 -5565, 66.98205, 107.619 -5566, 65.44633, 135.5837 -5567, 68.81325, 129.6697 -5568, 67.16659, 107.8736 -5569, 70.28813, 150.9046 -5570, 66.62449, 139.4685 -5571, 64.39542, 115.1983 -5572, 67.23695, 112.4262 -5573, 69.67397, 156.7309 -5574, 68.43681, 127.8894 -5575, 68.00999, 131.2092 -5576, 70.8081, 135.2499 -5577, 70.50871, 122.7718 -5578, 70.00808, 117.6198 -5579, 66.06797, 101.461 -5580, 67.87768, 116.3499 -5581, 69.36261, 126.9441 -5582, 69.29301, 139.7644 -5583, 67.3539, 133.1416 -5584, 66.1525, 110.9469 -5585, 67.47153, 115.3734 -5586, 68.56556, 121.8413 -5587, 72.40237, 157.4235 -5588, 67.28205, 128.5724 -5589, 65.7493, 122.6496 -5590, 65.90868, 132.421 -5591, 67.32651, 133.7645 -5592, 67.04617, 112.1093 -5593, 67.21086, 122.6801 -5594, 66.49245, 109.2367 -5595, 69.2678, 122.5007 -5596, 70.07489, 149.6391 -5597, 69.74977, 141.1522 -5598, 66.75226, 139.719 -5599, 65.50834, 114.5278 -5600, 73.13491, 127.8612 -5601, 65.37072, 125.7601 -5602, 72.07311, 142.2552 -5603, 67.65702, 120.8003 -5604, 71.13971, 149.4626 -5605, 69.56951, 138.5706 -5606, 68.47465, 116.2406 -5607, 68.65104, 135.3612 -5608, 69.29567, 146.4768 -5609, 65.94966, 131.8327 -5610, 67.88775, 137.3897 -5611, 66.01091, 107.5225 -5612, 64.69531, 124.1449 -5613, 68.76234, 111.5343 -5614, 70.14278, 129.6087 -5615, 65.29027, 126.534 -5616, 67.02973, 130.5432 -5617, 72.18645, 153.9204 -5618, 68.32435, 130.9603 -5619, 65.37779, 114.4 -5620, 70.98789, 126.8208 -5621, 69.32981, 125.881 -5622, 68.08517, 125.3363 -5623, 67.72864, 117.6713 -5624, 69.41996, 126.183 -5625, 65.86211, 112.0669 -5626, 69.96526, 151.6467 -5627, 67.91088, 124.1618 -5628, 68.78786, 130.6754 -5629, 65.74585, 119.2501 -5630, 72.368, 132.7354 -5631, 68.18716, 129.4416 -5632, 69.84822, 130.4897 -5633, 68.77683, 132.0897 -5634, 69.84154, 117.5002 -5635, 68.21258, 108.6233 -5636, 66.95108, 127.1378 -5637, 66.85975, 122.3951 -5638, 66.15618, 118.9815 -5639, 67.45204, 125.2554 -5640, 67.60013, 121.8996 -5641, 66.75233, 120.7738 -5642, 60.8634, 106.1939 -5643, 66.19796, 107.8874 -5644, 65.67776, 122.0686 -5645, 68.99828, 117.3948 -5646, 68.02827, 140.866 -5647, 70.31743, 149.3078 -5648, 64.89375, 125.5845 -5649, 65.54201, 131.28 -5650, 68.67927, 120.8432 -5651, 66.50307, 123.0181 -5652, 67.06639, 143.1561 -5653, 68.34809, 122.9334 -5654, 67.7237, 118.4002 -5655, 71.2729, 133.799 -5656, 66.02325, 115.9951 -5657, 67.64412, 117.6164 -5658, 70.5122, 133.0952 -5659, 65.81299, 111.2517 -5660, 67.72994, 134.9223 -5661, 70.37065, 142.7071 -5662, 67.12868, 128.8292 -5663, 67.7056, 126.9298 -5664, 67.17205, 115.2964 -5665, 68.10555, 136.4014 -5666, 70.02968, 139.6796 -5667, 67.74365, 132.6488 -5668, 64.0239, 131.5816 -5669, 65.72062, 109.6616 -5670, 72.30502, 138.1492 -5671, 68.49538, 132.5811 -5672, 68.88875, 126.3917 -5673, 66.99923, 133.9106 -5674, 68.12136, 137.1759 -5675, 69.35409, 135.8339 -5676, 65.94423, 130.5612 -5677, 69.1535, 134.0018 -5678, 68.9858, 133.0763 -5679, 66.5432, 109.9605 -5680, 67.00921, 132.5041 -5681, 71.09758, 126.9142 -5682, 68.07213, 124.4069 -5683, 69.49666, 146.5182 -5684, 70.21782, 140.9199 -5685, 67.58857, 133.1095 -5686, 67.57075, 138.0985 -5687, 69.42517, 137.6923 -5688, 68.28537, 136.6422 -5689, 69.72848, 149.467 -5690, 69.92365, 138.0429 -5691, 68.79953, 113.512 -5692, 69.09202, 130.8401 -5693, 68.82166, 125.858 -5694, 68.79217, 113.7784 -5695, 68.20921, 118.9215 -5696, 64.85301, 114.4354 -5697, 68.43265, 123.9837 -5698, 68.41712, 135.6646 -5699, 68.48985, 97.85054 -5700, 67.77927, 130.3916 -5701, 66.72234, 138.3614 -5702, 66.17694, 125.4018 -5703, 68.07653, 118.6076 -5704, 68.39248, 109.8622 -5705, 66.36527, 120.0788 -5706, 62.87732, 86.669 -5707, 68.7832, 142.6252 -5708, 70.32779, 135.5365 -5709, 65.23714, 130.1058 -5710, 70.09673, 141.5957 -5711, 72.58203, 125.2756 -5712, 68.95451, 131.6178 -5713, 70.08286, 129.0769 -5714, 66.60565, 108.4805 -5715, 70.12381, 139.1288 -5716, 68.9783, 145.3523 -5717, 65.41373, 125.9004 -5718, 70.84046, 126.4751 -5719, 65.25996, 119.209 -5720, 67.59199, 123.0037 -5721, 69.34865, 129.4727 -5722, 69.39296, 141.9344 -5723, 63.75403, 108.9765 -5724, 67.96208, 118.2419 -5725, 70.15448, 141.4635 -5726, 70.04724, 136.5986 -5727, 66.06389, 105.223 -5728, 71.07997, 127.8639 -5729, 66.6113, 134.331 -5730, 66.86237, 140.5931 -5731, 70.25969, 127.8158 -5732, 65.89945, 110.9553 -5733, 68.29227, 112.17 -5734, 64.95871, 117.7368 -5735, 67.1086, 133.5058 -5736, 67.39014, 119.9727 -5737, 64.25871, 115.9128 -5738, 69.27316, 131.0059 -5739, 67.87387, 121.2352 -5740, 65.53554, 121.5301 -5741, 71.08776, 130.4852 -5742, 67.36554, 127.386 -5743, 65.41184, 115.7506 -5744, 68.03292, 127.3987 -5745, 66.72356, 134.9064 -5746, 68.02466, 131.4015 -5747, 67.36662, 117.1467 -5748, 68.93518, 116.5689 -5749, 68.578, 127.307 -5750, 64.74187, 115.184 -5751, 66.2743, 114.0988 -5752, 69.71458, 131.5924 -5753, 68.54427, 137.3566 -5754, 71.35055, 135.1059 -5755, 67.21472, 137.3314 -5756, 65.09449, 113.229 -5757, 67.50111, 111.4446 -5758, 70.80356, 138.282 -5759, 66.74779, 126.8547 -5760, 67.30525, 135.6227 -5761, 69.16712, 128.8532 -5762, 69.35292, 139.9225 -5763, 64.91373, 101.2648 -5764, 67.68617, 132.6457 -5765, 69.23168, 133.9763 -5766, 67.53083, 138.6939 -5767, 73.47519, 156.5556 -5768, 68.0664, 128.1673 -5769, 65.82069, 125.261 -5770, 69.01169, 132.9188 -5771, 69.72285, 134.5923 -5772, 70.52947, 114.1222 -5773, 67.2635, 114.8907 -5774, 69.0027, 132.8863 -5775, 67.91407, 133.1336 -5776, 66.94962, 137.487 -5777, 68.04101, 118.2847 -5778, 71.93262, 133.1505 -5779, 68.266, 127.4658 -5780, 67.22047, 133.3136 -5781, 70.82076, 151.6654 -5782, 67.97316, 131.4318 -5783, 67.86163, 116.9394 -5784, 66.75865, 130.2682 -5785, 68.68619, 122.1336 -5786, 68.55174, 118.5602 -5787, 70.64074, 136.0448 -5788, 64.54667, 101.3587 -5789, 70.20971, 139.6653 -5790, 65.24926, 122.592 -5791, 70.56077, 142.8022 -5792, 70.2161, 119.6591 -5793, 69.26794, 130.0904 -5794, 68.71495, 142.531 -5795, 69.83226, 150.4973 -5796, 67.95044, 125.4476 -5797, 66.69106, 132.6528 -5798, 66.69388, 109.0486 -5799, 68.85787, 108.4688 -5800, 66.75904, 113.7091 -5801, 69.47691, 125.2285 -5802, 69.16535, 135.7451 -5803, 66.17003, 125.3914 -5804, 65.52416, 120.5974 -5805, 65.51245, 124.223 -5806, 67.09453, 131.6406 -5807, 70.25624, 130.8484 -5808, 66.23165, 123.4666 -5809, 68.47727, 125.3201 -5810, 69.71255, 135.4164 -5811, 67.91161, 135.2628 -5812, 66.40266, 127.9538 -5813, 67.8244, 117.6057 -5814, 66.18945, 120.9807 -5815, 67.43176, 122.2844 -5816, 69.20081, 120.9584 -5817, 66.10694, 124.0101 -5818, 65.78863, 113.8094 -5819, 70.78459, 145.5794 -5820, 68.58712, 124.2324 -5821, 68.57242, 106.2736 -5822, 66.9078, 114.6637 -5823, 68.24046, 116.8464 -5824, 70.33099, 137.315 -5825, 66.34712, 121.422 -5826, 69.51991, 139.1533 -5827, 68.24002, 138.3138 -5828, 68.81582, 128.7253 -5829, 67.46373, 140.8966 -5830, 68.39019, 144.1242 -5831, 66.67797, 128.4131 -5832, 68.80968, 126.858 -5833, 69.4337, 131.1752 -5834, 66.65083, 125.386 -5835, 66.85582, 122.8987 -5836, 68.77332, 146.0516 -5837, 64.63102, 113.7093 -5838, 68.71508, 143.0982 -5839, 68.75348, 133.4762 -5840, 66.51489, 113.0104 -5841, 68.37401, 106.2333 -5842, 62.34907, 92.08858 -5843, 68.92916, 129.1092 -5844, 71.68363, 129.1334 -5845, 66.322, 110.1751 -5846, 69.50661, 131.645 -5847, 67.40328, 139.6598 -5848, 67.19077, 112.4249 -5849, 67.19175, 135.4273 -5850, 69.88968, 135.0597 -5851, 67.71483, 131.9399 -5852, 69.1943, 123.0009 -5853, 68.43015, 126.813 -5854, 71.52141, 135.1442 -5855, 66.03545, 124.7625 -5856, 66.75322, 110.7626 -5857, 67.97544, 132.68 -5858, 70.43693, 148.038 -5859, 66.97159, 129.2555 -5860, 64.39987, 122.562 -5861, 67.69987, 128.6123 -5862, 68.06251, 125.5895 -5863, 69.63558, 124.3082 -5864, 67.44679, 116.4591 -5865, 65.89161, 115.974 -5866, 69.51355, 124.6651 -5867, 63.64185, 117.6007 -5868, 66.78862, 117.3315 -5869, 67.36831, 144.5431 -5870, 64.77625, 146.0965 -5871, 69.18543, 122.701 -5872, 66.26194, 118.7813 -5873, 68.65178, 121.752 -5874, 69.14357, 161.7266 -5875, 68.66398, 123.2472 -5876, 70.5741, 132.7715 -5877, 67.54965, 126.7619 -5878, 68.71849, 130.7257 -5879, 67.01063, 120.9484 -5880, 67.36634, 127.3686 -5881, 68.16669, 147.874 -5882, 69.81134, 141.3724 -5883, 66.73085, 115.7089 -5884, 65.96768, 114.223 -5885, 66.26164, 125.0622 -5886, 70.12583, 124.0039 -5887, 66.31984, 120.267 -5888, 68.89732, 124.8329 -5889, 69.22677, 128.9729 -5890, 71.16343, 143.5928 -5891, 64.12514, 134.7727 -5892, 71.17117, 152.651 -5893, 66.91345, 120.0058 -5894, 66.64158, 118.8403 -5895, 66.52425, 123.8263 -5896, 70.46871, 145.1333 -5897, 65.93944, 122.5218 -5898, 66.70213, 133.2482 -5899, 64.60008, 113.2583 -5900, 67.22989, 124.304 -5901, 67.76131, 140.08 -5902, 65.63379, 111.9369 -5903, 69.74489, 135.7224 -5904, 69.74892, 125.5452 -5905, 66.1265, 121.3924 -5906, 69.56993, 134.1461 -5907, 69.4781, 129.5945 -5908, 69.251, 135.8543 -5909, 65.88081, 116.0534 -5910, 65.85276, 117.3475 -5911, 69.53098, 138.892 -5912, 67.702, 119.1475 -5913, 66.31858, 132.1847 -5914, 65.68324, 111.7099 -5915, 66.8561, 142.4656 -5916, 69.0744, 120.1102 -5917, 66.66269, 110.537 -5918, 66.5834, 127.299 -5919, 67.70926, 132.0492 -5920, 68.19135, 116.3223 -5921, 66.85165, 117.069 -5922, 68.99365, 124.2528 -5923, 68.96601, 130.3402 -5924, 70.93465, 137.3957 -5925, 69.53833, 133.2753 -5926, 66.13819, 107.2152 -5927, 66.02829, 110.0063 -5928, 70.24533, 149.8284 -5929, 67.86194, 117.9091 -5930, 67.23322, 126.0349 -5931, 67.50164, 113.9574 -5932, 71.23342, 140.2096 -5933, 69.88821, 151.7165 -5934, 67.85973, 117.4995 -5935, 69.22897, 129.2885 -5936, 65.35526, 120.6695 -5937, 65.52588, 112.762 -5938, 70.8509, 130.0362 -5939, 65.17021, 111.9882 -5940, 65.35895, 107.5214 -5941, 64.77466, 127.5588 -5942, 65.07433, 119.1591 -5943, 66.32264, 109.9997 -5944, 70.25829, 129.6662 -5945, 68.46057, 135.197 -5946, 67.32406, 133.8561 -5947, 69.53655, 132.6168 -5948, 66.72552, 111.4197 -5949, 69.04313, 109.6263 -5950, 67.63395, 123.3522 -5951, 67.68225, 130.9284 -5952, 67.20527, 132.5174 -5953, 68.57727, 113.3802 -5954, 69.81593, 124.0074 -5955, 67.27727, 111.7334 -5956, 70.77213, 140.6956 -5957, 64.39879, 112.6936 -5958, 67.32911, 119.5627 -5959, 68.56564, 137.7463 -5960, 70.12937, 128.2247 -5961, 70.50405, 111.7906 -5962, 67.69242, 135.8347 -5963, 66.15337, 123.5173 -5964, 67.04967, 121.4366 -5965, 67.14891, 132.7812 -5966, 68.06454, 131.8433 -5967, 66.40213, 141.9992 -5968, 68.74408, 123.0744 -5969, 68.28835, 129.5032 -5970, 68.49705, 148.1317 -5971, 69.61735, 131.6342 -5972, 65.46622, 118.5369 -5973, 68.4357, 102.342 -5974, 66.21604, 118.1429 -5975, 71.1547, 137.0264 -5976, 65.50148, 106.2971 -5977, 70.46899, 140.2618 -5978, 67.60018, 123 -5979, 69.30591, 123.2186 -5980, 65.67069, 122.2368 -5981, 67.36778, 117.442 -5982, 68.47589, 137.8969 -5983, 69.72743, 134.3279 -5984, 68.84393, 117.6781 -5985, 69.19121, 129.7261 -5986, 68.51219, 133.2155 -5987, 66.30328, 113.0214 -5988, 72.1518, 124.9451 -5989, 68.31371, 128.7378 -5990, 66.21908, 99.78213 -5991, 64.60633, 120.786 -5992, 70.23266, 127.1388 -5993, 68.73753, 144.4456 -5994, 69.49503, 132.1904 -5995, 67.25261, 137.7559 -5996, 71.46246, 141.305 -5997, 67.7491, 139.5633 -5998, 68.80025, 128.2314 -5999, 66.8725, 119.1075 -6000, 68.4765, 120.8274 -6001, 64.86316, 116.4621 -6002, 67.91753, 139.5891 -6003, 67.84233, 138.0376 -6004, 69.38148, 124.8913 -6005, 66.94613, 127.2921 -6006, 67.45924, 117.4689 -6007, 69.99586, 132.8246 -6008, 67.45856, 123.6045 -6009, 64.09151, 138.3749 -6010, 66.37835, 122.9717 -6011, 70.12316, 122.3759 -6012, 67.34219, 121.3154 -6013, 70.14728, 136.3431 -6014, 69.0379, 123.907 -6015, 67.0297, 107.5287 -6016, 64.85652, 130.1924 -6017, 65.94007, 109.5656 -6018, 64.69116, 115.9239 -6019, 62.53019, 109.5766 -6020, 67.78541, 124.236 -6021, 68.27657, 133.3359 -6022, 65.93553, 118.4802 -6023, 67.48252, 120.3425 -6024, 67.80949, 131.0862 -6025, 70.04498, 129.9862 -6026, 66.0988, 121.7657 -6027, 67.87462, 145.1821 -6028, 65.04519, 134.0519 -6029, 64.96125, 105.489 -6030, 64.82767, 112.1873 -6031, 70.08844, 137.1698 -6032, 70.70944, 142.7307 -6033, 66.80032, 123.4484 -6034, 67.14141, 120.8645 -6035, 67.04259, 135.9558 -6036, 68.48662, 148.4587 -6037, 72.31757, 144.881 -6038, 66.47968, 139.3578 -6039, 66.82557, 109.1264 -6040, 70.06934, 135.3785 -6041, 67.217, 113.8089 -6042, 67.12457, 148.5183 -6043, 68.4131, 144.8827 -6044, 66.02919, 114.9248 -6045, 66.84654, 114.9225 -6046, 68.94666, 122.8046 -6047, 68.91853, 133.5443 -6048, 65.5914, 131.9386 -6049, 65.51261, 120.6623 -6050, 69.27083, 145.653 -6051, 69.57316, 130.7801 -6052, 67.86325, 118.8413 -6053, 72.33364, 133.6214 -6054, 67.21175, 104.1953 -6055, 68.83481, 117.464 -6056, 68.46136, 145.8766 -6057, 68.1713, 135.6227 -6058, 69.69391, 129.1389 -6059, 67.12571, 149.7706 -6060, 70.36279, 134.1039 -6061, 71.4732, 143.9365 -6062, 68.51565, 132.4801 -6063, 70.06817, 149.4329 -6064, 68.04516, 132.5979 -6065, 67.47227, 133.6407 -6066, 70.56501, 147.4583 -6067, 67.64197, 100.025 -6068, 72.23026, 140.2179 -6069, 67.45255, 120.8849 -6070, 66.97768, 109.3834 -6071, 67.28894, 136.1833 -6072, 66.02667, 115.1345 -6073, 64.15728, 130.0889 -6074, 67.78574, 131.8054 -6075, 71.05897, 125.119 -6076, 68.55136, 149.0059 -6077, 71.11228, 129.2335 -6078, 65.22518, 120.5247 -6079, 67.13777, 123.2162 -6080, 67.98084, 117.4022 -6081, 67.45039, 106.9632 -6082, 67.58732, 119.6435 -6083, 67.40106, 134.1122 -6084, 69.75732, 129.9282 -6085, 67.78374, 130.1554 -6086, 65.01631, 106.8729 -6087, 68.98708, 126.6898 -6088, 67.84236, 115.7457 -6089, 70.91418, 130.1665 -6090, 68.44803, 110.8115 -6091, 63.23903, 119.8366 -6092, 66.75371, 113.1127 -6093, 66.13148, 118.4705 -6094, 66.57052, 135.6863 -6095, 68.43743, 111.4731 -6096, 68.12826, 129.3106 -6097, 65.66194, 116.9965 -6098, 68.64587, 128.6098 -6099, 67.01908, 137.8634 -6100, 66.3869, 135.486 -6101, 67.43419, 112.9047 -6102, 67.0218, 143.1287 -6103, 70.98964, 136.9279 -6104, 64.47574, 113.9935 -6105, 66.48783, 121.2945 -6106, 68.28864, 130.4347 -6107, 66.11987, 133.8865 -6108, 68.73539, 153.3002 -6109, 67.61776, 123.3522 -6110, 65.99257, 105.2183 -6111, 71.79273, 144.2173 -6112, 69.76151, 155.9849 -6113, 67.65103, 111.6875 -6114, 64.82727, 125.8154 -6115, 68.38678, 121.5078 -6116, 68.35981, 129.6506 -6117, 67.56773, 116.2672 -6118, 67.70372, 125.3254 -6119, 70.42781, 165.7172 -6120, 66.27416, 133.3637 -6121, 68.61263, 145.4779 -6122, 69.9746, 135.8348 -6123, 69.38629, 130.2342 -6124, 63.38805, 114.0297 -6125, 68.40181, 117.6173 -6126, 65.89607, 123.5651 -6127, 66.25442, 124.9826 -6128, 68.43563, 131.054 -6129, 68.43069, 152.1767 -6130, 67.44333, 118.6275 -6131, 68.75899, 112.2566 -6132, 65.87903, 127.7575 -6133, 67.3794, 120.4361 -6134, 67.20197, 104.816 -6135, 71.72566, 119.2446 -6136, 68.326, 125.8377 -6137, 69.07214, 131.3704 -6138, 70.39663, 125.35 -6139, 68.46942, 118.3351 -6140, 70.75069, 129.7989 -6141, 68.25077, 126.6471 -6142, 69.4218, 129.0352 -6143, 67.75693, 134.8437 -6144, 68.78237, 150.5262 -6145, 68.93468, 132.4508 -6146, 64.36411, 131.0136 -6147, 69.45069, 151.8922 -6148, 68.70335, 122.5303 -6149, 69.17716, 127.2585 -6150, 73.32701, 147.9296 -6151, 69.01245, 108.8242 -6152, 65.2012, 127.7629 -6153, 67.65215, 130.3 -6154, 68.59028, 124.4653 -6155, 70.1527, 159.2435 -6156, 70.35282, 130.4261 -6157, 67.14863, 144.1876 -6158, 72.11654, 136.8595 -6159, 64.54112, 105.9232 -6160, 68.94058, 131.888 -6161, 68.18651, 129.5985 -6162, 72.69199, 121.7006 -6163, 68.2263, 128.3129 -6164, 70.40403, 130.5713 -6165, 65.32887, 126.0176 -6166, 65.29057, 109.782 -6167, 65.58939, 109.7956 -6168, 65.28916, 128.021 -6169, 69.91649, 132.3785 -6170, 66.59848, 127.7981 -6171, 69.24885, 133.7892 -6172, 68.81944, 124.2264 -6173, 68.79688, 122.0913 -6174, 67.19139, 127.5538 -6175, 68.40568, 142.3945 -6176, 70.58364, 135.3762 -6177, 68.401, 143.1102 -6178, 70.95629, 139.016 -6179, 69.85706, 120.7675 -6180, 65.61593, 129.3528 -6181, 65.39064, 96.54815 -6182, 67.95175, 128.2412 -6183, 70.05209, 123.2307 -6184, 68.18199, 134.9267 -6185, 68.79938, 116.6928 -6186, 67.36607, 118.689 -6187, 70.62204, 125.7371 -6188, 71.7953, 158.2326 -6189, 66.53015, 117.0002 -6190, 65.09768, 134.3973 -6191, 64.76077, 128.8129 -6192, 69.03578, 130.8927 -6193, 65.44403, 109.9232 -6194, 66.15236, 110.353 -6195, 69.55012, 138.8793 -6196, 64.92792, 116.1101 -6197, 67.75727, 122.6048 -6198, 69.05062, 143.6487 -6199, 64.93136, 94.59876 -6200, 70.18691, 130.8536 -6201, 67.72971, 148.7955 -6202, 67.32869, 130.6884 -6203, 69.70995, 151.1615 -6204, 71.38761, 144.922 -6205, 67.33116, 132.6171 -6206, 68.52212, 120.6801 -6207, 70.20145, 117.236 -6208, 66.58931, 117.0805 -6209, 69.02084, 131.2609 -6210, 68.78726, 123.945 -6211, 69.06258, 120.0654 -6212, 70.13521, 126.9799 -6213, 69.71943, 136.3826 -6214, 69.37398, 131.2544 -6215, 69.05735, 132.3124 -6216, 70.05472, 132.6614 -6217, 68.34561, 133.09 -6218, 67.52209, 121.4611 -6219, 70.0784, 133.6073 -6220, 68.1606, 142.0494 -6221, 66.76219, 133.1326 -6222, 67.39828, 119.6178 -6223, 69.23848, 129.4479 -6224, 63.37741, 121.7897 -6225, 68.52886, 129.8267 -6226, 66.21498, 131.2149 -6227, 66.87539, 136.5157 -6228, 67.37879, 113.5019 -6229, 66.66129, 133.4427 -6230, 68.08244, 133.4736 -6231, 65.97344, 135.5212 -6232, 65.8609, 122.3441 -6233, 67.68464, 124.7005 -6234, 69.1243, 126.6651 -6235, 71.24086, 127.2719 -6236, 69.075, 125.6317 -6237, 69.07254, 128.9997 -6238, 65.76779, 121.7671 -6239, 69.5003, 142.9457 -6240, 69.21009, 129.2261 -6241, 66.131, 128.9078 -6242, 66.45404, 109.0055 -6243, 65.43012, 129.1382 -6244, 68.37789, 132.0082 -6245, 69.25871, 126.1872 -6246, 68.55917, 131.6865 -6247, 69.82956, 152.9133 -6248, 68.56366, 135.9443 -6249, 69.89716, 135.4161 -6250, 67.22911, 126.9908 -6251, 68.27784, 151.4986 -6252, 67.70956, 120.9284 -6253, 68.63497, 143.909 -6254, 66.24494, 148.3015 -6255, 65.9282, 98.38391 -6256, 68.6507, 134.6537 -6257, 67.66363, 91.26068 -6258, 68.1538, 129.1524 -6259, 63.79264, 116.3877 -6260, 65.46251, 128.8832 -6261, 70.75386, 135.3328 -6262, 66.29608, 119.843 -6263, 66.17127, 132.3032 -6264, 70.22032, 129.6479 -6265, 68.38254, 135.7889 -6266, 68.72417, 119.4445 -6267, 69.03554, 131.3376 -6268, 69.23422, 119.5137 -6269, 68.75012, 142.7779 -6270, 68.70768, 142.0977 -6271, 67.9005, 125.3087 -6272, 69.60629, 146.4574 -6273, 66.8099, 129.1352 -6274, 65.01465, 100.5445 -6275, 67.35337, 131.1702 -6276, 63.03599, 112.098 -6277, 68.79753, 117.0905 -6278, 68.69337, 132.2144 -6279, 66.37421, 123.5625 -6280, 68.3918, 123.9172 -6281, 66.86315, 123.8108 -6282, 69.64423, 130.3421 -6283, 68.98795, 128.7153 -6284, 68.7025, 131.4076 -6285, 67.0616, 110.9624 -6286, 67.14099, 120.8645 -6287, 66.31361, 127.8163 -6288, 69.6794, 140.4675 -6289, 66.24529, 117.5554 -6290, 66.79284, 138.8735 -6291, 69.9798, 132.5518 -6292, 68.20436, 144.968 -6293, 67.80794, 141.1958 -6294, 71.49761, 146.9498 -6295, 71.80853, 136.9644 -6296, 67.83517, 137.1286 -6297, 68.34113, 129.0216 -6298, 69.08567, 117.0247 -6299, 66.75809, 141.0586 -6300, 65.40628, 126.6997 -6301, 65.53954, 119.8531 -6302, 69.0588, 111.6993 -6303, 67.7959, 117.9009 -6304, 71.39265, 118.7488 -6305, 66.70088, 131.8821 -6306, 69.67472, 140.8053 -6307, 69.23373, 138.6932 -6308, 70.9753, 143.1101 -6309, 67.65321, 129.5612 -6310, 65.60536, 117.7563 -6311, 67.32889, 135.7928 -6312, 69.521, 128.0812 -6313, 67.66563, 121.5679 -6314, 67.22662, 130.5827 -6315, 67.13201, 118.4574 -6316, 67.2819, 119.473 -6317, 66.45431, 116.4503 -6318, 68.42039, 142.5478 -6319, 67.14612, 122.8747 -6320, 62.98619, 113.4143 -6321, 63.66845, 131.0824 -6322, 65.28612, 104.5026 -6323, 64.30048, 106.3191 -6324, 66.10993, 103.9913 -6325, 65.91527, 125.8579 -6326, 67.82866, 125.7767 -6327, 69.87356, 131.063 -6328, 66.24116, 112.8657 -6329, 66.05187, 121.3259 -6330, 65.53557, 119.5436 -6331, 67.6665, 144.1403 -6332, 68.3058, 119.0695 -6333, 70.74075, 137.7395 -6334, 67.06837, 122.4245 -6335, 69.88488, 145.2255 -6336, 69.24424, 141.3037 -6337, 68.25133, 115.4675 -6338, 67.09232, 138.4092 -6339, 69.06273, 112.7855 -6340, 68.33125, 131.4942 -6341, 68.94119, 134.7967 -6342, 69.59518, 115.4751 -6343, 71.28803, 157.5443 -6344, 66.42491, 127.2222 -6345, 68.63305, 131.8311 -6346, 66.21553, 111.216 -6347, 67.47736, 116.7243 -6348, 64.51185, 86.49925 -6349, 67.33792, 126.9632 -6350, 67.41203, 125.8066 -6351, 67.89703, 126.1505 -6352, 65.08935, 122.4771 -6353, 70.58024, 139.0572 -6354, 70.26786, 124.0146 -6355, 68.09574, 138.602 -6356, 70.04702, 133.2217 -6357, 67.1535, 115.3322 -6358, 67.87558, 127.5807 -6359, 72.24161, 144.0286 -6360, 70.21055, 131.3894 -6361, 68.77272, 134.0195 -6362, 68.96749, 122.9673 -6363, 66.95136, 111.7026 -6364, 69.70156, 132.0676 -6365, 64.13956, 93.09256 -6366, 71.56149, 153.1117 -6367, 68.86042, 153.6386 -6368, 66.79593, 127.4353 -6369, 64.54504, 113.8478 -6370, 70.00599, 142.7425 -6371, 69.19904, 145.2462 -6372, 69.09444, 140.8653 -6373, 67.19525, 105.4341 -6374, 67.96947, 105.7521 -6375, 70.02533, 139.9395 -6376, 66.87761, 122.6013 -6377, 64.45014, 131.0252 -6378, 68.24912, 135.3378 -6379, 70.07101, 152.8499 -6380, 66.9759, 113.9803 -6381, 70.36787, 140.2859 -6382, 68.6591, 146.4581 -6383, 69.95361, 141.0113 -6384, 68.48425, 128.0158 -6385, 71.25946, 164.5588 -6386, 67.80922, 130.3115 -6387, 63.58671, 117.3091 -6388, 67.40848, 135.3097 -6389, 68.20701, 128.4742 -6390, 68.89247, 124.929 -6391, 66.05981, 117.8305 -6392, 65.66067, 123.4769 -6393, 69.39748, 133.3201 -6394, 65.92174, 108.8612 -6395, 64.78001, 102.3802 -6396, 67.59062, 117.6786 -6397, 71.00127, 149.2434 -6398, 69.48254, 121.6221 -6399, 68.48246, 159.2052 -6400, 68.09616, 133.6355 -6401, 69.48115, 122.3265 -6402, 70.50577, 141.2895 -6403, 69.5883, 140.0531 -6404, 69.31491, 124.1149 -6405, 68.39399, 139.9906 -6406, 62.23548, 94.80998 -6407, 69.8972, 148.2548 -6408, 68.06989, 146.5246 -6409, 69.12319, 111.1013 -6410, 69.95192, 126.322 -6411, 67.93156, 137.8815 -6412, 69.32167, 130.0449 -6413, 66.67312, 141.5919 -6414, 67.96604, 123.8124 -6415, 69.19829, 130.9459 -6416, 68.15828, 114.9747 -6417, 68.03235, 116.2177 -6418, 68.43761, 102.8575 -6419, 67.34517, 103.4353 -6420, 68.64435, 127.6291 -6421, 64.83459, 112.7336 -6422, 64.11121, 111.5238 -6423, 67.52032, 101.0851 -6424, 66.72676, 128.6718 -6425, 68.76169, 132.1914 -6426, 68.50268, 123.0143 -6427, 67.35174, 122.898 -6428, 66.64565, 123.7642 -6429, 67.11109, 120.5121 -6430, 67.92539, 140.0124 -6431, 65.7078, 116.2137 -6432, 67.65793, 138.142 -6433, 68.60162, 134.1922 -6434, 69.30603, 130.9022 -6435, 67.1095, 137.4821 -6436, 65.59186, 103.921 -6437, 67.66742, 139.2905 -6438, 68.63966, 112.1105 -6439, 64.7652, 92.20107 -6440, 67.60131, 120.6972 -6441, 67.31966, 126.8577 -6442, 66.51157, 122.8182 -6443, 69.93026, 135.7746 -6444, 67.60868, 131.5309 -6445, 65.7309, 121.011 -6446, 67.29622, 118.9762 -6447, 66.84201, 120.7153 -6448, 67.91374, 137.0166 -6449, 65.33921, 109.9667 -6450, 67.10739, 127.3581 -6451, 66.39279, 131.2489 -6452, 65.77143, 118.5557 -6453, 66.08581, 122.4064 -6454, 67.95467, 136.8644 -6455, 63.31058, 113.5932 -6456, 70.10242, 123.0639 -6457, 69.72937, 130.3103 -6458, 67.62461, 118.9278 -6459, 69.23113, 111.379 -6460, 67.38459, 116.0054 -6461, 70.68647, 146.7535 -6462, 71.42291, 141.3565 -6463, 68.60167, 112.7169 -6464, 65.01908, 120.2538 -6465, 68.22216, 137.5639 -6466, 66.18504, 122.2857 -6467, 67.34507, 122.5287 -6468, 69.8637, 134.646 -6469, 68.63027, 121.5066 -6470, 69.01165, 130.7259 -6471, 68.57992, 116.8032 -6472, 70.02954, 135.12 -6473, 67.8609, 130.8429 -6474, 67.071, 128.6312 -6475, 67.25316, 121.6315 -6476, 68.45752, 138.1129 -6477, 66.08131, 110.8231 -6478, 65.5926, 104.7464 -6479, 68.56861, 118.8964 -6480, 69.69795, 143.2327 -6481, 66.67277, 108.3892 -6482, 61.59011, 99.81074 -6483, 65.40277, 114.1857 -6484, 68.44756, 127.5778 -6485, 66.73714, 118.4245 -6486, 72.205, 154.2642 -6487, 68.46802, 121.7574 -6488, 70.10294, 142.4799 -6489, 66.48949, 112.2608 -6490, 67.19112, 121.4096 -6491, 65.22879, 121.375 -6492, 67.00396, 127.1951 -6493, 67.72317, 107.6196 -6494, 70.09165, 152.4262 -6495, 66.07538, 128.1418 -6496, 66.91173, 146.0408 -6497, 68.65328, 117.6621 -6498, 67.75543, 135.4845 -6499, 66.36233, 131.4949 -6500, 67.6272, 127.833 -6501, 68.21944, 123.405 -6502, 67.57571, 136.8255 -6503, 67.02379, 137.789 -6504, 67.57237, 141.6039 -6505, 65.6522, 109.4063 -6506, 65.44991, 102.5063 -6507, 70.32828, 163.8992 -6508, 69.08622, 118.9012 -6509, 68.33335, 126.7698 -6510, 66.29224, 134.6024 -6511, 68.16586, 120.86 -6512, 66.04152, 136.2559 -6513, 70.48553, 147.5044 -6514, 66.67757, 125.5265 -6515, 66.65461, 115.3878 -6516, 69.63744, 140.8728 -6517, 67.68649, 108.0794 -6518, 66.58507, 98.00565 -6519, 68.3482, 119.2853 -6520, 68.92806, 112.4171 -6521, 68.53403, 146.0566 -6522, 71.3806, 133.3801 -6523, 70.11959, 152.4782 -6524, 66.25934, 130.2875 -6525, 69.53489, 155.4037 -6526, 67.46936, 139.8139 -6527, 66.51039, 119.1722 -6528, 69.92009, 138.286 -6529, 67.79021, 107.2949 -6530, 66.83271, 108.3566 -6531, 70.99707, 117.9595 -6532, 66.68384, 130.0104 -6533, 65.32131, 105.6657 -6534, 67.3587, 115.0555 -6535, 64.04389, 103.6805 -6536, 67.25724, 117.0895 -6537, 70.83582, 129.5163 -6538, 69.2102, 129.1965 -6539, 65.91382, 119.2019 -6540, 68.89983, 128.3612 -6541, 68.6346, 133.2154 -6542, 65.36955, 121.3485 -6543, 66.25718, 109.8669 -6544, 69.18027, 130.5783 -6545, 69.53816, 118.921 -6546, 66.66547, 122.2455 -6547, 69.35299, 131.5557 -6548, 65.99078, 103.7061 -6549, 67.55311, 134.4433 -6550, 65.95292, 130.1628 -6551, 69.74893, 109.4178 -6552, 68.13165, 120.4415 -6553, 64.53068, 114.9703 -6554, 65.95702, 132.643 -6555, 70.27411, 120.3263 -6556, 68.30787, 132.9732 -6557, 69.93158, 136.795 -6558, 68.76325, 128.7979 -6559, 68.68206, 142.8603 -6560, 68.32988, 133.13 -6561, 68.04129, 143.2981 -6562, 67.9522, 117.0683 -6563, 65.7157, 118.3454 -6564, 72.12643, 124.3554 -6565, 66.79918, 118.7239 -6566, 67.49036, 123.5892 -6567, 66.88022, 126.7582 -6568, 68.25984, 137.6865 -6569, 66.6257, 130.5098 -6570, 64.15701, 113.9842 -6571, 65.30643, 110.9035 -6572, 71.83145, 146.3799 -6573, 68.43502, 128.2374 -6574, 64.79043, 115.6001 -6575, 69.24446, 129.4057 -6576, 70.28435, 125.6591 -6577, 72.99453, 126.8912 -6578, 70.41651, 131.3277 -6579, 65.79611, 132.5054 -6580, 69.49913, 129.3703 -6581, 65.87009, 110.5038 -6582, 65.0852, 106.2354 -6583, 70.61194, 129.5963 -6584, 71.39877, 131.9176 -6585, 66.29704, 122.9437 -6586, 65.64143, 121.4597 -6587, 69.78249, 138.3473 -6588, 68.32625, 135.247 -6589, 69.02806, 100.8881 -6590, 68.87437, 122.2625 -6591, 66.7959, 119.0778 -6592, 68.62814, 139.7986 -6593, 71.19139, 136.2042 -6594, 65.4116, 122.3825 -6595, 68.84184, 134.2696 -6596, 68.8806, 123.1216 -6597, 65.73631, 127.6449 -6598, 69.30987, 131.7523 -6599, 64.15534, 114.2796 -6600, 72.89442, 133.7642 -6601, 66.41814, 142.6604 -6602, 65.886, 119.2969 -6603, 69.06664, 131.9619 -6604, 67.96217, 125.9612 -6605, 68.68041, 131.3237 -6606, 68.515, 118.9934 -6607, 67.37231, 127.9334 -6608, 63.67556, 114.3381 -6609, 65.76516, 123.8141 -6610, 68.71711, 137.0437 -6611, 69.62402, 119.3894 -6612, 66.8157, 107.8753 -6613, 64.54403, 123.3058 -6614, 68.37687, 116.9408 -6615, 67.70961, 120.4639 -6616, 69.79282, 107.1216 -6617, 70.33109, 134.1242 -6618, 71.11525, 142.3554 -6619, 70.50683, 131.8652 -6620, 67.3265, 117.8718 -6621, 70.37423, 134.2731 -6622, 68.93535, 136.6499 -6623, 68.74748, 139.4778 -6624, 66.31697, 126.7884 -6625, 67.96141, 137.7632 -6626, 68.02516, 125.7112 -6627, 68.54611, 134.6283 -6628, 73.72628, 142.811 -6629, 66.30109, 124.8609 -6630, 69.84513, 134.2394 -6631, 66.34608, 112.6472 -6632, 69.22406, 120.5706 -6633, 65.20241, 126.6356 -6634, 68.16207, 122.2711 -6635, 66.17376, 114.6814 -6636, 65.82561, 137.7805 -6637, 70.49243, 122.7935 -6638, 66.86335, 129.0675 -6639, 69.00819, 121.8091 -6640, 69.09268, 139.8642 -6641, 68.4858, 137.6952 -6642, 70.05821, 124.648 -6643, 63.92011, 136.3251 -6644, 69.10662, 124.9316 -6645, 68.37383, 124.5664 -6646, 67.81685, 147.8495 -6647, 68.35014, 121.062 -6648, 66.20868, 134.3163 -6649, 69.82296, 145.8658 -6650, 69.83591, 128.6599 -6651, 70.09777, 148.3039 -6652, 65.74923, 118.5265 -6653, 67.2496, 121.1303 -6654, 67.01302, 106.3264 -6655, 67.86604, 142.5205 -6656, 69.51352, 143.2796 -6657, 68.79671, 119.9716 -6658, 71.3044, 142.1026 -6659, 68.74348, 130.4 -6660, 68.21948, 129.4293 -6661, 72.8674, 128.4835 -6662, 67.8235, 113.0689 -6663, 65.2038, 116.4099 -6664, 64.55504, 115.4541 -6665, 68.46274, 121.7866 -6666, 66.08879, 114.1458 -6667, 66.53332, 109.2672 -6668, 66.75524, 102.657 -6669, 68.20629, 130.9008 -6670, 69.60968, 141.8457 -6671, 65.68272, 138.0014 -6672, 66.5195, 122.4759 -6673, 63.30338, 120.175 -6674, 67.19227, 115.3758 -6675, 64.59287, 115.1326 -6676, 67.61165, 134.6538 -6677, 69.54174, 123.5377 -6678, 72.4977, 133.2865 -6679, 68.60441, 135.2291 -6680, 68.26375, 118.0737 -6681, 66.51715, 125.0585 -6682, 66.7498, 134.2382 -6683, 68.57715, 126.5512 -6684, 68.15554, 118.1801 -6685, 67.67131, 116.6818 -6686, 69.25188, 149.0548 -6687, 67.63059, 122.7405 -6688, 70.5553, 128.8346 -6689, 66.51049, 122.1635 -6690, 70.06291, 134.2863 -6691, 68.95425, 140.8941 -6692, 67.76337, 115.7462 -6693, 66.16295, 122.7829 -6694, 70.23017, 148.6758 -6695, 66.85157, 128.1767 -6696, 69.98998, 135.2626 -6697, 69.57826, 129.3778 -6698, 67.82307, 113.7661 -6699, 66.16931, 118.1876 -6700, 64.97487, 119.7272 -6701, 66.75172, 111.0794 -6702, 67.03147, 122.6207 -6703, 70.78522, 149.449 -6704, 69.08702, 127.2521 -6705, 66.56877, 140.5165 -6706, 65.65581, 103.6644 -6707, 69.91828, 129.1403 -6708, 68.10072, 143.8415 -6709, 65.21574, 115.4829 -6710, 65.92987, 131.1892 -6711, 66.78368, 134.2093 -6712, 66.63773, 137.8539 -6713, 70.115, 136.2478 -6714, 71.87742, 145.386 -6715, 69.37969, 143.8422 -6716, 67.09682, 120.5931 -6717, 68.90441, 122.8529 -6718, 67.59411, 124.496 -6719, 69.73864, 107.3653 -6720, 66.47251, 136.4277 -6721, 68.96672, 149.0714 -6722, 69.183, 137.1885 -6723, 69.12592, 137.31 -6724, 67.06716, 139.6149 -6725, 66.43504, 116.7063 -6726, 68.03354, 133.7463 -6727, 70.66473, 134.2961 -6728, 66.95512, 118.338 -6729, 71.13236, 144.4866 -6730, 64.10697, 120.6126 -6731, 69.43162, 145.1667 -6732, 67.23457, 113.2283 -6733, 70.20178, 112.7536 -6734, 65.73987, 123.1815 -6735, 66.55121, 121.9317 -6736, 67.72679, 119.4187 -6737, 71.22324, 132.9604 -6738, 64.72674, 127.4027 -6739, 67.36195, 122.3824 -6740, 68.42406, 132.2244 -6741, 69.81064, 124.3983 -6742, 70.14812, 111.3963 -6743, 66.31497, 123.1817 -6744, 67.25945, 103.6091 -6745, 66.24777, 123.5493 -6746, 67.13633, 142.1095 -6747, 68.44022, 129.7913 -6748, 72.07034, 136.4478 -6749, 68.48039, 120.6969 -6750, 67.12369, 122.3988 -6751, 67.94203, 138.1901 -6752, 68.01522, 119.8895 -6753, 67.83753, 110.6977 -6754, 67.08281, 131.6536 -6755, 66.13397, 125.3077 -6756, 70.17398, 138.519 -6757, 73.12686, 139.2637 -6758, 66.29478, 132.4121 -6759, 67.48723, 128.3885 -6760, 63.84013, 127.6618 -6761, 71.23226, 137.9139 -6762, 68.93456, 131.205 -6763, 65.31508, 126.5417 -6764, 72.89094, 144.8666 -6765, 66.85445, 123.4989 -6766, 67.71429, 129.7462 -6767, 66.99515, 145.3356 -6768, 62.48643, 115.2889 -6769, 68.4545, 119.9549 -6770, 66.18029, 112.1502 -6771, 68.29449, 127.8367 -6772, 68.5935, 137.6326 -6773, 68.13211, 121.9201 -6774, 70.55532, 131.9945 -6775, 71.26895, 135.8511 -6776, 70.71689, 133.3027 -6777, 68.27433, 123.0711 -6778, 65.85545, 125.7077 -6779, 67.19789, 130.9707 -6780, 69.03473, 143.7162 -6781, 70.96078, 138.1647 -6782, 68.99354, 146.7285 -6783, 66.75706, 133.1515 -6784, 67.73694, 123.5134 -6785, 68.31951, 129.2444 -6786, 66.24969, 121.9078 -6787, 68.70678, 128.4009 -6788, 68.0356, 140.9392 -6789, 68.96343, 137.3493 -6790, 67.50309, 129.5348 -6791, 65.02611, 131.0273 -6792, 70.0671, 146.3213 -6793, 65.36984, 97.06459 -6794, 66.73719, 119.8514 -6795, 68.25009, 124.1159 -6796, 68.91447, 144.9636 -6797, 69.42874, 117.0746 -6798, 69.11436, 126.7865 -6799, 67.99857, 112.9692 -6800, 70.26098, 141.588 -6801, 68.64432, 124.0298 -6802, 66.17354, 125.5482 -6803, 70.00471, 122.1783 -6804, 66.31189, 118.2902 -6805, 65.90206, 116.5597 -6806, 68.25885, 116.5077 -6807, 70.75448, 147.473 -6808, 67.08351, 131.7851 -6809, 67.02122, 132.2825 -6810, 70.51041, 134.3807 -6811, 67.60778, 119.8518 -6812, 68.83486, 136.1642 -6813, 64.254, 114.5097 -6814, 71.91722, 138.2213 -6815, 67.82529, 133.2127 -6816, 66.34443, 126.5382 -6817, 69.22459, 129.8661 -6818, 65.53683, 122.7073 -6819, 66.65738, 111.8648 -6820, 69.74106, 128.2887 -6821, 68.77304, 120.5732 -6822, 67.66713, 122.1059 -6823, 71.04389, 145.6585 -6824, 67.97438, 116.155 -6825, 69.01111, 137.4236 -6826, 70.97446, 137.894 -6827, 66.09937, 114.8329 -6828, 68.2026, 136.3654 -6829, 71.18778, 148.7839 -6830, 70.10012, 118.7125 -6831, 67.40562, 118.3544 -6832, 71.0495, 152.5436 -6833, 69.10354, 128.9651 -6834, 66.99674, 124.5497 -6835, 67.55177, 118.077 -6836, 66.04561, 100.3573 -6837, 69.97684, 120.8445 -6838, 69.59421, 136.3666 -6839, 69.50004, 129.3228 -6840, 66.70728, 129.9114 -6841, 67.74378, 116.261 -6842, 69.52156, 137.5933 -6843, 68.65583, 106.9772 -6844, 66.58063, 118.7891 -6845, 67.31123, 127.0282 -6846, 69.21023, 135.7681 -6847, 69.76802, 127.8121 -6848, 71.36846, 127.9637 -6849, 64.91466, 121.4664 -6850, 65.91717, 100.2395 -6851, 68.79172, 115.6267 -6852, 66.86831, 124.0965 -6853, 68.85311, 124.2217 -6854, 64.99322, 112.2167 -6855, 70.31634, 132.5438 -6856, 65.07995, 107.1524 -6857, 68.55692, 119.8364 -6858, 65.03755, 123.5259 -6859, 68.97846, 134.4521 -6860, 68.1677, 125.5112 -6861, 70.25241, 133.5386 -6862, 68.35771, 133.3158 -6863, 71.59998, 144.3195 -6864, 67.62775, 140.8419 -6865, 71.9168, 147.5959 -6866, 64.91759, 114.7572 -6867, 68.03944, 117.7686 -6868, 68.83719, 140.7958 -6869, 68.42447, 134.2855 -6870, 67.19277, 110.2144 -6871, 67.95936, 107.3158 -6872, 69.13031, 122.8845 -6873, 66.53698, 118.2503 -6874, 69.3362, 125.8938 -6875, 69.66919, 127.4892 -6876, 69.32642, 153.3295 -6877, 71.67815, 124.592 -6878, 66.81763, 106.8565 -6879, 67.96098, 133.7046 -6880, 70.27599, 124.6664 -6881, 70.83387, 132.0587 -6882, 71.95684, 138.0874 -6883, 65.53739, 130.3727 -6884, 67.20098, 118.1746 -6885, 66.84158, 134.8257 -6886, 72.22081, 123.7257 -6887, 68.23933, 128.9637 -6888, 69.34904, 151.0629 -6889, 67.54027, 126.6496 -6890, 66.55953, 114.8614 -6891, 69.42919, 133.6709 -6892, 68.77479, 137.1665 -6893, 67.11564, 139.5681 -6894, 69.7283, 127.7704 -6895, 69.71847, 119.206 -6896, 67.00926, 131.5259 -6897, 70.23583, 124.1454 -6898, 68.05243, 140.9604 -6899, 66.81973, 111.675 -6900, 64.33826, 131.6378 -6901, 69.21901, 133.7032 -6902, 70.30269, 133.0611 -6903, 67.7681, 115.596 -6904, 68.28813, 127.7475 -6905, 70.67229, 136.774 -6906, 67.56648, 135.1199 -6907, 68.2033, 117.4256 -6908, 70.82652, 128.3953 -6909, 68.76882, 124.6462 -6910, 66.21644, 140.4212 -6911, 69.94665, 129.9599 -6912, 66.82673, 116.1417 -6913, 70.62106, 138.8435 -6914, 65.96267, 131.9172 -6915, 68.32852, 120.174 -6916, 68.14281, 117.9655 -6917, 67.68342, 132.2259 -6918, 62.29058, 100.38 -6919, 66.56289, 112.8575 -6920, 67.53601, 127.3499 -6921, 69.9728, 128.0357 -6922, 71.62721, 148.2612 -6923, 68.87831, 118.697 -6924, 68.90985, 125.1128 -6925, 68.48804, 126.9495 -6926, 64.492, 116.0879 -6927, 68.05258, 130.1563 -6928, 70.97223, 128.6877 -6929, 67.73294, 124.8016 -6930, 64.42714, 122.3703 -6931, 66.89249, 121.6673 -6932, 72.00652, 126.211 -6933, 67.8034, 127.3033 -6934, 70.31843, 133.3873 -6935, 69.6285, 136.3986 -6936, 68.90652, 112.0078 -6937, 71.01122, 146.1389 -6938, 69.03379, 126.0906 -6939, 64.16792, 100.7711 -6940, 67.46005, 132.1034 -6941, 66.31981, 142.7429 -6942, 61.4055, 119.2652 -6943, 69.07292, 123.567 -6944, 69.04136, 129.2791 -6945, 65.63933, 130.0454 -6946, 68.98367, 146.821 -6947, 67.08789, 102.0192 -6948, 66.9645, 122.3346 -6949, 64.88959, 113.4712 -6950, 70.18743, 134.5754 -6951, 70.24701, 136.6864 -6952, 68.65855, 127.6595 -6953, 66.65856, 112.9117 -6954, 70.81437, 139.8524 -6955, 62.86676, 100.8983 -6956, 70.1981, 134.0086 -6957, 67.74387, 134.1832 -6958, 67.78774, 124.2984 -6959, 66.8155, 113.8397 -6960, 70.47312, 126.8411 -6961, 67.28529, 138.4671 -6962, 67.63923, 135.8226 -6963, 69.54133, 134.1394 -6964, 72.09163, 147.1709 -6965, 69.40312, 124.7091 -6966, 66.90419, 128.6304 -6967, 64.77967, 126.6038 -6968, 67.71305, 117.6067 -6969, 67.98558, 131.2976 -6970, 67.39091, 130.2718 -6971, 66.59739, 123.9308 -6972, 66.03491, 111.1245 -6973, 71.32563, 150.9399 -6974, 70.89299, 138.5366 -6975, 69.29039, 123.6542 -6976, 72.50612, 135.4202 -6977, 66.39209, 131.7184 -6978, 70.22429, 148.9964 -6979, 70.61033, 129.818 -6980, 67.43213, 113.7404 -6981, 67.08964, 142.8879 -6982, 69.52539, 133.248 -6983, 64.80112, 123.5309 -6984, 69.50292, 131.3393 -6985, 68.89136, 138.7052 -6986, 69.82676, 121.5695 -6987, 66.19549, 134.9518 -6988, 67.74861, 107.9783 -6989, 66.53997, 122.5054 -6990, 67.32858, 140.5876 -6991, 65.01159, 113.4278 -6992, 68.85847, 115.1244 -6993, 67.21657, 126.9035 -6994, 68.82472, 122.0827 -6995, 68.38527, 117.6941 -6996, 67.5943, 112.418 -6997, 67.82269, 110.7359 -6998, 67.83166, 134.7077 -6999, 66.31882, 124.513 -7000, 66.99476, 100.1673 -7001, 66.87892, 122.5671 -7002, 68.38919, 139.537 -7003, 66.4759, 123.509 -7004, 68.5542, 137.4336 -7005, 67.83647, 131.4485 -7006, 70.39431, 148.3386 -7007, 67.58981, 127.5607 -7008, 65.26024, 107.7349 -7009, 66.7406, 119.5494 -7010, 68.93702, 135.9338 -7011, 66.45697, 129.6703 -7012, 67.80572, 138.3332 -7013, 65.5528, 111.1973 -7014, 66.09202, 109.7177 -7015, 67.50397, 138.7697 -7016, 68.11816, 117.8952 -7017, 67.24076, 118.436 -7018, 66.5412, 139.4789 -7019, 71.02195, 140.13 -7020, 68.32773, 106.9353 -7021, 69.9594, 123.1594 -7022, 68.32581, 130.2541 -7023, 69.1247, 127.0935 -7024, 66.52031, 141.2168 -7025, 66.54596, 106.5251 -7026, 68.83517, 135.2336 -7027, 69.46929, 116.2368 -7028, 63.84823, 107.2539 -7029, 67.369, 125.2445 -7030, 66.46618, 126.7497 -7031, 68.00188, 124.7855 -7032, 66.55544, 130.3081 -7033, 67.93518, 129.0813 -7034, 71.09441, 136.352 -7035, 71.90701, 127.3129 -7036, 66.45996, 115.5565 -7037, 66.28668, 122.6641 -7038, 67.60595, 121.1687 -7039, 66.90904, 123.3812 -7040, 66.93917, 138.1009 -7041, 68.73882, 142.0686 -7042, 69.22875, 140.783 -7043, 67.50325, 118.1483 -7044, 68.374, 116.9901 -7045, 65.04856, 134.1878 -7046, 67.64236, 128.8601 -7047, 66.68778, 127.995 -7048, 68.92306, 110.6146 -7049, 68.29892, 147.2812 -7050, 69.50429, 124.4182 -7051, 71.313, 154.0956 -7052, 68.43807, 138.7187 -7053, 67.13923, 118.2185 -7054, 71.65034, 129.9864 -7055, 65.08982, 108.6521 -7056, 65.9342, 121.5126 -7057, 69.09728, 131.8032 -7058, 67.26581, 122.3023 -7059, 64.38799, 117.6848 -7060, 66.66263, 123.165 -7061, 69.12113, 128.1987 -7062, 68.00116, 120.519 -7063, 66.01521, 132.6177 -7064, 69.06381, 153.8047 -7065, 65.36307, 114.7964 -7066, 68.5666, 120.8603 -7067, 64.96461, 110.8094 -7068, 68.04672, 116.8675 -7069, 68.55896, 140.4034 -7070, 68.99092, 118.0107 -7071, 66.53254, 116.871 -7072, 65.54329, 99.65617 -7073, 66.37032, 123.1376 -7074, 67.35006, 131.78 -7075, 67.37973, 107.3991 -7076, 68.37168, 125.2837 -7077, 69.43348, 140.256 -7078, 68.83415, 126.4995 -7079, 68.35128, 132.1206 -7080, 69.7299, 126.5069 -7081, 66.76921, 116.9988 -7082, 68.59913, 113.4002 -7083, 66.77606, 114.8109 -7084, 66.92936, 108.9786 -7085, 69.08265, 137.5979 -7086, 69.06212, 122.6742 -7087, 66.44597, 120.8244 -7088, 70.37422, 139.8095 -7089, 64.52265, 117.7043 -7090, 67.58351, 149.6098 -7091, 70.31109, 139.4191 -7092, 70.50002, 137.8864 -7093, 66.50098, 113.2406 -7094, 65.35631, 117.0282 -7095, 67.80355, 129.6957 -7096, 66.06759, 137.8167 -7097, 68.51708, 125.1696 -7098, 64.11949, 112.7134 -7099, 66.96134, 122.761 -7100, 67.96643, 118.005 -7101, 67.0344, 143.2701 -7102, 70.02335, 122.6553 -7103, 68.2267, 139.9412 -7104, 68.92581, 110.0091 -7105, 66.98588, 136.5209 -7106, 66.60277, 126.6768 -7107, 71.395, 133.8678 -7108, 67.86413, 136.4188 -7109, 69.13237, 126.8823 -7110, 67.87654, 117.7937 -7111, 68.76083, 132.8404 -7112, 67.36789, 116.0168 -7113, 65.16072, 135.585 -7114, 70.55072, 125.9307 -7115, 66.4049, 121.0867 -7116, 66.83446, 136.2764 -7117, 67.26086, 120.1009 -7118, 70.00579, 133.7637 -7119, 70.13397, 138.0896 -7120, 67.04961, 127.2923 -7121, 67.13933, 116.9931 -7122, 68.39594, 143.1639 -7123, 67.26621, 138.2081 -7124, 70.70541, 140.5597 -7125, 64.81425, 117.1367 -7126, 67.63186, 134.8175 -7127, 63.99001, 130.4298 -7128, 67.89236, 120.5148 -7129, 65.72178, 118.9157 -7130, 67.34324, 124.2062 -7131, 71.7701, 143.3808 -7132, 65.51898, 102.0683 -7133, 67.25056, 120.3717 -7134, 68.26108, 134.7602 -7135, 67.88764, 133.5285 -7136, 69.86454, 151.4865 -7137, 68.69896, 125.0424 -7138, 70.16294, 133.275 -7139, 64.9089, 114.8393 -7140, 69.99566, 136.6724 -7141, 66.28872, 124.6184 -7142, 71.21582, 153.9191 -7143, 67.42305, 130.0958 -7144, 68.73146, 126.8497 -7145, 67.73615, 130.1305 -7146, 68.15963, 137.0062 -7147, 69.62686, 143.488 -7148, 68.1477, 139.4233 -7149, 67.65882, 111.2477 -7150, 64.6576, 115.7454 -7151, 71.4186, 152.3875 -7152, 66.99874, 101.7823 -7153, 70.37822, 138.2295 -7154, 66.51704, 144.9564 -7155, 67.18007, 126.0652 -7156, 68.03524, 129.5533 -7157, 63.49286, 100.8383 -7158, 67.48731, 135.685 -7159, 68.98253, 130.124 -7160, 68.48716, 114.3281 -7161, 68.43382, 119.7082 -7162, 66.82633, 117.9674 -7163, 68.58959, 136.604 -7164, 68.21922, 126.5181 -7165, 68.79074, 139.2679 -7166, 66.59109, 132.4449 -7167, 65.72831, 129.9469 -7168, 69.45052, 105.7793 -7169, 67.07052, 120.3329 -7170, 66.06131, 110.5079 -7171, 64.13507, 122.0272 -7172, 65.8497, 121.6887 -7173, 68.81954, 140.3287 -7174, 68.01948, 130.2994 -7175, 66.17253, 130.1025 -7176, 69.20803, 133.1917 -7177, 69.09409, 128.1301 -7178, 69.50502, 137.3243 -7179, 69.27992, 139.0344 -7180, 69.8233, 152.5737 -7181, 69.33597, 145.3588 -7182, 69.64967, 131.4688 -7183, 68.92694, 135.01 -7184, 67.99845, 120.3701 -7185, 66.80329, 131.1969 -7186, 64.69195, 116.3957 -7187, 69.49096, 133.2719 -7188, 68.30048, 114.0233 -7189, 65.80058, 110.1396 -7190, 69.8954, 127.7667 -7191, 68.42628, 122.4339 -7192, 69.50113, 130.9145 -7193, 69.29251, 143.7263 -7194, 67.7469, 140.5105 -7195, 68.04911, 117.309 -7196, 69.58269, 128.3045 -7197, 66.98591, 132.42 -7198, 70.06189, 151.3699 -7199, 67.95494, 103.0898 -7200, 69.72035, 135.2409 -7201, 67.76978, 125.5754 -7202, 71.50252, 134.2854 -7203, 66.8927, 116.1475 -7204, 69.78987, 145.157 -7205, 69.18094, 97.38482 -7206, 69.55195, 141.5296 -7207, 66.76773, 124.1834 -7208, 70.68901, 119.41 -7209, 67.44662, 110.9564 -7210, 70.43882, 152.882 -7211, 69.38655, 133.4961 -7212, 67.25475, 131.5363 -7213, 70.51274, 147.9493 -7214, 68.07194, 107.2294 -7215, 66.82279, 123.3618 -7216, 72.79602, 119.6208 -7217, 66.80265, 109.7922 -7218, 68.40038, 130.909 -7219, 66.53305, 135.1808 -7220, 66.19168, 110.6117 -7221, 70.86937, 145.8197 -7222, 67.03655, 118.0754 -7223, 70.32482, 136.9369 -7224, 63.52966, 111.5511 -7225, 65.38477, 125.863 -7226, 67.61447, 126.7202 -7227, 69.8557, 157.414 -7228, 64.02049, 108.3825 -7229, 64.67575, 112.1651 -7230, 67.23841, 118.3111 -7231, 65.11543, 108.6568 -7232, 66.20656, 119.9807 -7233, 69.70118, 126.3537 -7234, 70.47463, 119.7988 -7235, 68.64678, 126.5725 -7236, 67.34344, 119.4016 -7237, 65.62668, 120.6734 -7238, 66.96462, 122.5543 -7239, 68.23983, 119.0203 -7240, 69.3839, 126.4594 -7241, 66.51058, 112.3129 -7242, 66.37135, 118.6985 -7243, 71.9533, 132.4024 -7244, 70.8278, 136.0832 -7245, 69.65515, 129.2316 -7246, 67.97516, 137.9614 -7247, 67.6667, 131.5778 -7248, 69.76989, 141.3806 -7249, 68.36656, 134.1194 -7250, 68.80647, 118.5526 -7251, 67.12544, 116.3449 -7252, 68.11498, 136.6981 -7253, 67.29381, 131.0281 -7254, 70.70649, 112.1012 -7255, 65.08928, 131.0829 -7256, 71.1406, 127.4022 -7257, 70.56025, 150.4959 -7258, 68.47391, 130.8527 -7259, 68.99078, 147.5658 -7260, 70.76446, 128.8298 -7261, 69.76717, 131.0973 -7262, 65.74663, 118.725 -7263, 66.98775, 143.9424 -7264, 64.41271, 112.5632 -7265, 67.19909, 125.5583 -7266, 67.00659, 136.9352 -7267, 67.64628, 132.7607 -7268, 67.50257, 142.7019 -7269, 67.6803, 139.2383 -7270, 73.81695, 140.0915 -7271, 64.48825, 134.3808 -7272, 64.58578, 120.986 -7273, 66.58703, 114.208 -7274, 68.7568, 128.8771 -7275, 67.84196, 127.669 -7276, 69.0289, 129.4355 -7277, 70.24106, 122.759 -7278, 66.48991, 126.8856 -7279, 69.47393, 132.2408 -7280, 66.15579, 132.3362 -7281, 66.50286, 137.7408 -7282, 71.5695, 148.1165 -7283, 67.4536, 119.7771 -7284, 65.97892, 122.5452 -7285, 68.36647, 147.1068 -7286, 67.64033, 142.18 -7287, 68.45333, 134.8398 -7288, 67.641, 131.9221 -7289, 65.33383, 135.0619 -7290, 71.61624, 140.3879 -7291, 69.96497, 144.7957 -7292, 70.31945, 133.4026 -7293, 68.04474, 134.0615 -7294, 70.72336, 140.8089 -7295, 68.49315, 136.7987 -7296, 67.94018, 117.5218 -7297, 66.67637, 125.0994 -7298, 66.33467, 120.3094 -7299, 68.4344, 131.5393 -7300, 66.06591, 128.7348 -7301, 68.27948, 145.317 -7302, 71.13503, 139.9063 -7303, 65.90755, 111.1929 -7304, 66.34423, 134.0435 -7305, 65.3504, 109.4509 -7306, 66.77512, 125.6017 -7307, 70.15968, 125.4635 -7308, 64.87603, 108.8633 -7309, 66.39882, 122.1298 -7310, 70.19458, 134.7721 -7311, 65.14868, 118.2586 -7312, 69.13566, 134.8389 -7313, 68.66753, 149.9199 -7314, 68.58656, 120.5065 -7315, 68.54078, 131.3163 -7316, 69.04324, 120.7318 -7317, 67.79093, 145.3154 -7318, 70.54534, 128.9349 -7319, 67.88231, 132.4517 -7320, 66.60399, 125.7715 -7321, 65.36397, 88.81051 -7322, 69.68018, 138.3541 -7323, 68.57678, 127.8418 -7324, 66.22321, 127.7406 -7325, 68.5423, 117.28 -7326, 67.7995, 133.4251 -7327, 68.63948, 140.4405 -7328, 67.95206, 131.4384 -7329, 67.73545, 111.3263 -7330, 67.6113, 115.9311 -7331, 70.69283, 141.2872 -7332, 68.26736, 129.9806 -7333, 65.89008, 134.8798 -7334, 73.01042, 156.0944 -7335, 67.67587, 134.7738 -7336, 66.78503, 135.5158 -7337, 68.32888, 120.9929 -7338, 70.73417, 133.0843 -7339, 69.43571, 128.0102 -7340, 69.95298, 111.8821 -7341, 68.38192, 108.5709 -7342, 66.70985, 141.8568 -7343, 70.25069, 134.9127 -7344, 67.62069, 118.2398 -7345, 67.58186, 123.5611 -7346, 65.98681, 110.9755 -7347, 68.78521, 121.7078 -7348, 68.62075, 128.9687 -7349, 67.27841, 132.6356 -7350, 65.34695, 111.0262 -7351, 69.76109, 143.2576 -7352, 69.89052, 125.2298 -7353, 69.03762, 136.3245 -7354, 67.52712, 126.3744 -7355, 69.42798, 133.2845 -7356, 69.25325, 122.813 -7357, 67.20804, 121.3649 -7358, 68.00991, 139.8288 -7359, 72.35641, 130.8996 -7360, 65.18365, 137.4973 -7361, 67.18597, 124.8715 -7362, 67.76811, 122.6361 -7363, 69.67532, 128.1323 -7364, 68.04481, 110.4944 -7365, 70.36942, 130.4623 -7366, 64.41718, 124.1877 -7367, 66.85948, 140.3651 -7368, 70.20287, 132.4583 -7369, 67.02928, 129.9706 -7370, 69.26978, 144.3226 -7371, 67.42833, 118.4512 -7372, 70.54165, 133.0559 -7373, 64.53151, 123.7602 -7374, 68.24766, 125.6892 -7375, 65.98542, 129.7971 -7376, 66.86053, 106.1024 -7377, 66.122, 139.3225 -7378, 67.34277, 130.4799 -7379, 67.62678, 119.9616 -7380, 67.02834, 124.4751 -7381, 67.42969, 126.0978 -7382, 66.99899, 128.2102 -7383, 69.26638, 136.238 -7384, 67.67848, 121.8698 -7385, 68.48995, 112.3066 -7386, 69.15514, 134.703 -7387, 69.54796, 127.4389 -7388, 67.40434, 106.6406 -7389, 66.14023, 107.8906 -7390, 63.61758, 117.2843 -7391, 65.16034, 110.2457 -7392, 68.08398, 121.0482 -7393, 67.93785, 124.3501 -7394, 67.52815, 128.1553 -7395, 68.97399, 121.222 -7396, 63.48592, 121.0895 -7397, 66.16304, 117.5089 -7398, 64.82835, 97.5369 -7399, 66.42971, 119.6172 -7400, 68.43495, 118.9727 -7401, 66.52114, 137.8509 -7402, 68.74805, 121.5155 -7403, 65.97323, 132.5458 -7404, 67.03314, 100.0056 -7405, 68.58693, 141.2024 -7406, 66.32704, 126.5394 -7407, 72.83685, 155.3977 -7408, 70.3984, 134.7797 -7409, 68.05803, 125.6942 -7410, 65.14364, 115.004 -7411, 69.14854, 125.904 -7412, 64.25558, 123.25 -7413, 63.75162, 117.198 -7414, 72.02677, 148.7849 -7415, 65.65417, 128.8653 -7416, 67.21431, 118.7941 -7417, 69.10937, 123.3988 -7418, 64.55084, 90.03145 -7419, 69.84948, 120.5746 -7420, 70.64157, 126.2191 -7421, 67.02268, 126.7902 -7422, 66.05177, 124.9625 -7423, 67.36082, 143.185 -7424, 67.63802, 129.4889 -7425, 67.75642, 131.3101 -7426, 69.01775, 139.614 -7427, 66.81603, 120.3352 -7428, 68.1264, 128.0491 -7429, 69.39699, 144.2164 -7430, 68.0198, 107.2461 -7431, 71.13762, 140.6199 -7432, 66.92045, 110.6346 -7433, 68.51978, 123.7867 -7434, 67.49444, 134.2646 -7435, 67.69485, 135.7343 -7436, 70.48607, 132.574 -7437, 64.47721, 101.3696 -7438, 69.08046, 138.2492 -7439, 67.60168, 131.9158 -7440, 68.3217, 99.18847 -7441, 68.73792, 104.5348 -7442, 65.82668, 108.8067 -7443, 67.5949, 129.1996 -7444, 69.82714, 132.2253 -7445, 69.24298, 132.0935 -7446, 66.8406, 121.3455 -7447, 69.53579, 120.1047 -7448, 66.37498, 122.0791 -7449, 66.07098, 125.3647 -7450, 64.61507, 112.5542 -7451, 68.42049, 121.1324 -7452, 69.56459, 115.4338 -7453, 69.39142, 140.7167 -7454, 68.43529, 123.0205 -7455, 67.05497, 127.0142 -7456, 67.7922, 130.0494 -7457, 71.94893, 144.1957 -7458, 69.63726, 129.699 -7459, 72.0813, 143.083 -7460, 68.45988, 117.2453 -7461, 65.46367, 139.3682 -7462, 67.27282, 106.0456 -7463, 68.18818, 131.0038 -7464, 67.28198, 119.6203 -7465, 63.91125, 112.35 -7466, 67.71167, 132.679 -7467, 72.1432, 139.7611 -7468, 68.25521, 135.8145 -7469, 67.53778, 133.3183 -7470, 68.60468, 121.2002 -7471, 67.59235, 111.6109 -7472, 65.19918, 114.0807 -7473, 62.40921, 110.2593 -7474, 70.58047, 122.8997 -7475, 68.8901, 134.8572 -7476, 68.74666, 119.1949 -7477, 66.29907, 118.4403 -7478, 66.65775, 134.1269 -7479, 66.55058, 125.0959 -7480, 67.70659, 123.8787 -7481, 69.75302, 125.8733 -7482, 67.72124, 114.2514 -7483, 69.36439, 135.5384 -7484, 66.44274, 115.7687 -7485, 67.19566, 119.574 -7486, 66.4343, 114.6366 -7487, 65.08244, 117.4341 -7488, 70.47208, 153.8939 -7489, 67.66172, 107.8835 -7490, 67.5012, 113.0245 -7491, 68.91253, 131.5965 -7492, 67.64257, 131.1377 -7493, 68.50697, 139.4594 -7494, 67.21841, 133.7691 -7495, 65.88687, 113.0185 -7496, 69.8779, 118.3424 -7497, 70.37038, 138.2626 -7498, 68.66927, 139.6973 -7499, 68.70197, 132.6589 -7500, 69.8006, 141.7412 -7501, 70.90949, 150.0568 -7502, 65.1748, 118.2564 -7503, 66.21658, 118.9631 -7504, 69.61605, 135.4832 -7505, 69.87508, 154.3167 -7506, 65.58734, 133.1199 -7507, 66.083, 115.4637 -7508, 70.48212, 135.9939 -7509, 67.84056, 112.9479 -7510, 68.47217, 136.3002 -7511, 66.79221, 128.7134 -7512, 68.54694, 124.5508 -7513, 64.80177, 114.0726 -7514, 66.60203, 106.2728 -7515, 67.21014, 121.7322 -7516, 66.73678, 114.8589 -7517, 66.53306, 110.7923 -7518, 68.6929, 132.2393 -7519, 68.19062, 141.1859 -7520, 63.92606, 121.3297 -7521, 69.5829, 117.6169 -7522, 70.98816, 140.1896 -7523, 70.76388, 141.9068 -7524, 65.02684, 126.1456 -7525, 66.90201, 128.0042 -7526, 69.23204, 130.8349 -7527, 66.09344, 143.7256 -7528, 69.49427, 138.9172 -7529, 68.05, 140.3419 -7530, 67.49402, 131.6908 -7531, 68.85025, 140.8144 -7532, 68.23896, 125.7072 -7533, 68.38393, 116.0417 -7534, 68.95408, 113.6366 -7535, 67.65103, 125.5184 -7536, 66.20531, 111.8929 -7537, 68.93726, 134.5124 -7538, 67.80014, 127.1 -7539, 65.2647, 121.8737 -7540, 68.09232, 130.421 -7541, 68.65955, 115.7811 -7542, 67.81543, 120.4567 -7543, 65.20035, 133.6623 -7544, 65.84472, 105.3131 -7545, 67.38545, 141.2867 -7546, 67.92876, 124.5046 -7547, 66.27859, 120.0427 -7548, 70.74889, 121.0602 -7549, 69.97731, 147.2286 -7550, 67.20964, 125.5631 -7551, 67.31481, 126.7142 -7552, 70.24038, 147.5274 -7553, 68.99325, 134.3203 -7554, 68.59389, 131.2151 -7555, 67.98396, 137.5212 -7556, 70.36114, 149.4448 -7557, 68.91001, 125.7485 -7558, 66.87767, 123.1591 -7559, 66.79704, 122.6614 -7560, 66.1317, 107.0973 -7561, 72.32421, 126.4469 -7562, 68.51105, 130.1897 -7563, 68.79547, 128.0733 -7564, 70.50895, 147.6337 -7565, 67.21348, 124.8905 -7566, 67.40794, 140.4072 -7567, 67.35628, 135.5266 -7568, 68.38489, 129.793 -7569, 71.91894, 140.7337 -7570, 68.43062, 121.2177 -7571, 67.77666, 139.6088 -7572, 68.99119, 117.0843 -7573, 66.21266, 129.6054 -7574, 67.7385, 123.8408 -7575, 70.30638, 129.3636 -7576, 68.12954, 118.034 -7577, 69.86354, 127.871 -7578, 68.46795, 129.2263 -7579, 70.82723, 130.3162 -7580, 70.53312, 125.3443 -7581, 66.68491, 114.5746 -7582, 67.9728, 123.6368 -7583, 67.22708, 111.5203 -7584, 69.68289, 135.3127 -7585, 66.59604, 126.2811 -7586, 66.10015, 128.3855 -7587, 67.86074, 110.5005 -7588, 68.01097, 125.1627 -7589, 67.5839, 131.7113 -7590, 67.5159, 129.2797 -7591, 68.53632, 127.2682 -7592, 65.53007, 116.1557 -7593, 67.01862, 115.6411 -7594, 71.70261, 130.089 -7595, 67.42779, 119.1357 -7596, 67.40744, 138.6263 -7597, 70.61318, 132.1391 -7598, 71.40194, 133.7259 -7599, 64.09089, 103.413 -7600, 68.57917, 140.5224 -7601, 70.44562, 139.2476 -7602, 68.78892, 137.1816 -7603, 68.17666, 128.6937 -7604, 67.25766, 119.6812 -7605, 69.58706, 134.283 -7606, 65.62971, 117.5826 -7607, 70.16689, 149.014 -7608, 66.6029, 125.2519 -7609, 66.8357, 137.9874 -7610, 67.74481, 114.0989 -7611, 67.01471, 105.5528 -7612, 68.82323, 129.1214 -7613, 66.53189, 121.6671 -7614, 64.95852, 125.6806 -7615, 66.39552, 106.5133 -7616, 69.15387, 145.4679 -7617, 67.3919, 137.8311 -7618, 66.46185, 108.3132 -7619, 66.04052, 117.8311 -7620, 70.38614, 137.0213 -7621, 65.65727, 94.93893 -7622, 67.33538, 121.7877 -7623, 69.28239, 127.8304 -7624, 70.2126, 136.728 -7625, 64.3484, 113.3811 -7626, 69.31893, 139.7068 -7627, 71.18364, 137.8162 -7628, 66.69679, 104.8015 -7629, 69.94556, 129.3583 -7630, 66.51505, 138.6321 -7631, 64.14991, 116.5963 -7632, 69.92795, 124.8835 -7633, 66.73025, 137.4516 -7634, 68.51984, 140.2377 -7635, 67.32388, 136.2189 -7636, 64.05124, 104.3901 -7637, 68.15534, 119.4984 -7638, 67.71709, 118.2663 -7639, 66.70415, 130.1457 -7640, 67.41672, 129.0666 -7641, 68.76344, 132.7511 -7642, 67.84973, 117.4982 -7643, 67.26853, 130.8403 -7644, 68.45943, 125.5251 -7645, 67.22402, 115.863 -7646, 66.8748, 128.8302 -7647, 66.74881, 109.3304 -7648, 69.44453, 125.8588 -7649, 65.4609, 107.2491 -7650, 68.67207, 125.2769 -7651, 69.85604, 129.2856 -7652, 69.12214, 122.2752 -7653, 69.21372, 130.3915 -7654, 67.02625, 132.8653 -7655, 67.69648, 130.4108 -7656, 70.06564, 154.3757 -7657, 69.36177, 137.7144 -7658, 69.0855, 123.928 -7659, 68.21874, 127.1621 -7660, 68.60997, 126.3357 -7661, 66.55127, 114.9381 -7662, 68.71959, 118.2746 -7663, 68.58571, 122.5043 -7664, 69.08825, 120.3915 -7665, 66.85375, 98.47908 -7666, 68.56317, 131.2951 -7667, 66.72783, 116.8011 -7668, 66.73504, 131.919 -7669, 68.65369, 118.3939 -7670, 66.11318, 120.0249 -7671, 66.7098, 126.7391 -7672, 67.44065, 152.5009 -7673, 69.25731, 120.6596 -7674, 68.75465, 130.2 -7675, 70.94505, 138.8221 -7676, 67.77684, 136.6213 -7677, 66.24745, 105.4542 -7678, 62.64956, 130.3208 -7679, 67.42044, 129.5017 -7680, 64.44748, 112.1223 -7681, 67.88848, 107.7735 -7682, 70.5403, 142.2364 -7683, 70.31573, 130.1736 -7684, 67.8145, 133.648 -7685, 64.61064, 106.9745 -7686, 68.75828, 127.1369 -7687, 70.67508, 141.6155 -7688, 64.79201, 123.8881 -7689, 67.22238, 124.7274 -7690, 66.7514, 133.492 -7691, 69.90536, 140.1252 -7692, 71.96265, 135.2445 -7693, 65.42972, 129.5831 -7694, 66.60135, 120.7322 -7695, 66.4318, 133.7433 -7696, 66.34089, 104.3528 -7697, 69.96979, 140.0099 -7698, 71.64134, 120.8264 -7699, 66.24195, 115.9752 -7700, 68.69749, 117.0558 -7701, 67.15067, 129.4873 -7702, 71.9673, 133.6015 -7703, 68.5542, 126.6594 -7704, 67.05171, 122.6178 -7705, 67.50469, 132.9071 -7706, 68.78436, 125.2964 -7707, 67.07846, 114.7138 -7708, 65.46411, 131.4842 -7709, 69.49787, 123.4755 -7710, 64.67323, 120.1682 -7711, 69.32483, 134.088 -7712, 64.39847, 121.9653 -7713, 67.9694, 103.3546 -7714, 68.17004, 112.4828 -7715, 66.87249, 105.3961 -7716, 67.30874, 135.062 -7717, 68.26251, 132.1296 -7718, 65.36754, 127.2412 -7719, 68.94823, 125.0147 -7720, 67.50617, 113.585 -7721, 64.29247, 120.1023 -7722, 65.5634, 129.7442 -7723, 68.65306, 128.7635 -7724, 67.66637, 104.2348 -7725, 66.46271, 125.962 -7726, 69.61949, 138.3373 -7727, 70.151, 144.0366 -7728, 68.00747, 137.1058 -7729, 68.85235, 130.6387 -7730, 70.34804, 124.7815 -7731, 65.0196, 134.4502 -7732, 67.58782, 132.8462 -7733, 67.96341, 135.425 -7734, 64.23356, 124.1334 -7735, 71.82677, 143.9272 -7736, 68.40776, 124.9954 -7737, 72.92705, 155.452 -7738, 68.2634, 124.8133 -7739, 71.32032, 128.3211 -7740, 69.04566, 142.9052 -7741, 65.18871, 115.9 -7742, 66.94576, 121.9962 -7743, 69.21635, 136.23 -7744, 65.53434, 120.8577 -7745, 64.91416, 107.684 -7746, 66.40921, 104.361 -7747, 66.51021, 130.011 -7748, 68.98924, 127.6238 -7749, 70.39002, 142.0184 -7750, 67.27302, 134.5354 -7751, 68.27392, 124.1453 -7752, 66.13665, 125.066 -7753, 69.8415, 138.2726 -7754, 69.24298, 125.4025 -7755, 69.49259, 107.8487 -7756, 68.01659, 138.7248 -7757, 67.14071, 126.4965 -7758, 67.32799, 122.5994 -7759, 67.22067, 117.1647 -7760, 67.2075, 122.9325 -7761, 71.22072, 133.3385 -7762, 62.61388, 127.7046 -7763, 66.05642, 112.4733 -7764, 68.6259, 111.0985 -7765, 66.42125, 128.5118 -7766, 67.66226, 122.9677 -7767, 67.87257, 125.7629 -7768, 69.43314, 142.9565 -7769, 66.91873, 108.1239 -7770, 67.0773, 131.3885 -7771, 66.38627, 123.3667 -7772, 66.88154, 118.5143 -7773, 70.13999, 135.2062 -7774, 65.0467, 129.3282 -7775, 67.94255, 147.0635 -7776, 65.69521, 126.7902 -7777, 65.69631, 123.84 -7778, 68.06505, 118.6554 -7779, 65.57689, 127.0804 -7780, 69.51367, 137.4305 -7781, 68.01036, 132.4546 -7782, 65.97185, 113.2777 -7783, 68.50408, 117.6372 -7784, 68.6578, 125.8654 -7785, 64.90631, 128.857 -7786, 66.86878, 121.5519 -7787, 67.45601, 101.7983 -7788, 70.57507, 136.4959 -7789, 65.50493, 113.2549 -7790, 68.03809, 139.6333 -7791, 70.44638, 132.7411 -7792, 66.83931, 111.3947 -7793, 66.38356, 102.0057 -7794, 68.33698, 124.0644 -7795, 69.41356, 137.8685 -7796, 67.82728, 134.7202 -7797, 69.1966, 139.0328 -7798, 66.58126, 118.1128 -7799, 65.86804, 132.2918 -7800, 67.92387, 127.8828 -7801, 67.65969, 114.3964 -7802, 69.00849, 135.8661 -7803, 68.02905, 110.9974 -7804, 67.90776, 113.0832 -7805, 67.89813, 102.687 -7806, 70.78714, 159.3967 -7807, 66.32968, 129.7132 -7808, 71.20406, 141.4122 -7809, 67.87705, 129.9013 -7810, 65.94546, 116.2096 -7811, 69.87679, 126.6121 -7812, 65.79065, 114.8391 -7813, 70.22362, 130.9476 -7814, 68.85931, 117.224 -7815, 67.99466, 128.0368 -7816, 67.08757, 129.2199 -7817, 68.85889, 124.9153 -7818, 66.06887, 119.7681 -7819, 70.41331, 137.758 -7820, 68.26431, 124.0211 -7821, 70.00963, 125.9789 -7822, 65.69038, 125.507 -7823, 70.94803, 118.2146 -7824, 70.40454, 152.6344 -7825, 67.93137, 124.0016 -7826, 67.24148, 130.8507 -7827, 67.43967, 132.5789 -7828, 67.97769, 137.5606 -7829, 69.69329, 134.532 -7830, 68.88, 120.9022 -7831, 66.22857, 117.7639 -7832, 64.74463, 113.2767 -7833, 71.14304, 147.1355 -7834, 65.97479, 113.5152 -7835, 69.43298, 159.7844 -7836, 65.39464, 125.1913 -7837, 68.47642, 127.5662 -7838, 67.68893, 125.6505 -7839, 69.77827, 118.6649 -7840, 73.85521, 136.0667 -7841, 68.65677, 122.8314 -7842, 68.88401, 133.0347 -7843, 66.74014, 136.451 -7844, 68.04482, 126.3811 -7845, 64.85449, 114.2042 -7846, 67.03991, 120.3379 -7847, 65.56486, 119.8795 -7848, 68.13322, 134.1961 -7849, 65.6523, 125.6206 -7850, 72.22353, 138.8165 -7851, 67.93045, 126.3497 -7852, 70.43116, 135.7442 -7853, 68.08474, 138.0519 -7854, 69.8667, 126.1461 -7855, 68.70872, 120.9616 -7856, 68.58329, 139.8337 -7857, 66.67676, 122.2411 -7858, 69.96239, 129.7149 -7859, 66.29991, 137.1631 -7860, 65.76482, 104.5086 -7861, 69.11191, 135.7377 -7862, 66.87869, 111.5493 -7863, 67.36932, 147.7067 -7864, 69.93728, 150.4786 -7865, 69.81301, 133.0872 -7866, 66.56086, 140.7383 -7867, 70.95923, 130.441 -7868, 69.19946, 127.5606 -7869, 70.28687, 133.9221 -7870, 69.97118, 145.462 -7871, 69.9306, 133.8265 -7872, 67.23945, 126.2885 -7873, 67.2735, 117.1077 -7874, 66.48165, 128.5263 -7875, 68.44572, 120.2431 -7876, 66.89716, 114.7654 -7877, 65.29685, 132.424 -7878, 69.06524, 132.1972 -7879, 68.02311, 135.255 -7880, 70.02667, 113.9045 -7881, 65.82948, 117.297 -7882, 70.21039, 150.618 -7883, 68.55081, 143.2179 -7884, 66.17612, 132.1823 -7885, 67.36138, 134.9196 -7886, 69.98058, 122.1659 -7887, 65.49847, 122.904 -7888, 67.22664, 108.7074 -7889, 67.28114, 132.6449 -7890, 66.27424, 121.0436 -7891, 67.20346, 117.715 -7892, 69.96933, 133.341 -7893, 70.33173, 138.2921 -7894, 67.60168, 130.4579 -7895, 70.12592, 117.4415 -7896, 65.79449, 107.1855 -7897, 67.9113, 128.3023 -7898, 66.60677, 114.237 -7899, 66.36069, 116.3676 -7900, 69.37216, 124.5841 -7901, 69.08983, 131.53 -7902, 68.03826, 137.6548 -7903, 66.72346, 127.1615 -7904, 65.5982, 110.4732 -7905, 66.56595, 125.4882 -7906, 68.54091, 124.8483 -7907, 71.80497, 136.4508 -7908, 69.41584, 123.6033 -7909, 67.91457, 126.7841 -7910, 66.63057, 141.1367 -7911, 70.00844, 127.3606 -7912, 67.21345, 134.9724 -7913, 69.9974, 135.8397 -7914, 70.44321, 142.7681 -7915, 69.99219, 126.5143 -7916, 71.11277, 131.7103 -7917, 68.42954, 126.6811 -7918, 71.73402, 122.6931 -7919, 68.25089, 134.2315 -7920, 72.13361, 120.9306 -7921, 69.0911, 132.2909 -7922, 66.02501, 132.287 -7923, 65.3813, 126.1785 -7924, 67.27872, 118.2022 -7925, 68.98874, 126.4329 -7926, 68.9963, 120.3791 -7927, 66.75512, 103.6353 -7928, 66.09072, 112.3691 -7929, 68.70395, 119.6693 -7930, 64.72417, 106.3895 -7931, 69.53108, 120.2067 -7932, 71.32029, 156.5971 -7933, 69.25388, 132.4808 -7934, 70.01373, 132.0505 -7935, 72.0594, 148.9722 -7936, 68.49943, 128.9143 -7937, 67.20711, 109.9494 -7938, 67.4277, 121.8319 -7939, 67.38905, 136.4146 -7940, 68.81456, 154.4947 -7941, 65.56306, 116.8189 -7942, 68.86564, 123.4374 -7943, 67.63208, 128.5252 -7944, 63.64527, 114.5546 -7945, 69.12102, 142.8329 -7946, 70.19208, 124.5284 -7947, 68.62725, 109.5514 -7948, 68.58176, 137.4034 -7949, 66.78338, 119.4607 -7950, 67.68417, 122.7447 -7951, 68.79943, 143.4836 -7952, 66.72578, 116.2868 -7953, 67.68983, 120.3912 -7954, 67.24673, 117.8198 -7955, 70.80139, 131.9536 -7956, 69.81422, 128.8624 -7957, 67.41926, 118.315 -7958, 68.10832, 140.7132 -7959, 69.52176, 138.7414 -7960, 66.44673, 123.6693 -7961, 66.50938, 104.0396 -7962, 68.27624, 122.9904 -7963, 67.51054, 131.6367 -7964, 68.2331, 122.1745 -7965, 69.20004, 128.2344 -7966, 68.22569, 135.757 -7967, 69.67618, 116.2938 -7968, 69.15372, 134.0076 -7969, 67.44681, 127.5092 -7970, 71.4192, 145.7932 -7971, 66.01984, 141.9976 -7972, 67.5773, 127.9425 -7973, 64.49893, 140.2004 -7974, 70.19674, 126.914 -7975, 67.51149, 123.7364 -7976, 66.75836, 119.0958 -7977, 66.36645, 132.4222 -7978, 65.96947, 126.7739 -7979, 67.47588, 138.5358 -7980, 65.8521, 115.0837 -7981, 67.1238, 122.7868 -7982, 69.1103, 138.6654 -7983, 64.77536, 113.5556 -7984, 68.77562, 126.086 -7985, 69.56475, 128.952 -7986, 66.86676, 137.0564 -7987, 67.45183, 142.6514 -7988, 66.7056, 127.0386 -7989, 69.45967, 130.8347 -7990, 67.83848, 120.0967 -7991, 67.65053, 137.3509 -7992, 69.02638, 135.0166 -7993, 68.05329, 125.4398 -7994, 65.0137, 113.7752 -7995, 67.74935, 128.7894 -7996, 67.3018, 110.3175 -7997, 69.57329, 169.1268 -7998, 66.46916, 127.2647 -7999, 67.37618, 121.7823 -8000, 66.03128, 123.2914 -8001, 67.88652, 126.5258 -8002, 66.60311, 124.1856 -8003, 67.72857, 119.5459 -8004, 66.20895, 125.1912 -8005, 69.24463, 126.2716 -8006, 68.69724, 110.894 -8007, 66.70205, 120.3019 -8008, 71.16914, 135.0369 -8009, 65.43614, 152.6168 -8010, 67.25401, 130.5463 -8011, 68.05015, 123.7466 -8012, 70.48365, 134.9316 -8013, 69.03379, 129.6641 -8014, 65.4187, 118.1433 -8015, 68.94762, 136.9932 -8016, 68.75178, 107.7319 -8017, 69.54295, 135.5159 -8018, 66.34532, 123.7345 -8019, 69.9271, 146.4336 -8020, 66.65813, 127.9335 -8021, 68.55262, 123.4302 -8022, 65.96412, 122.5101 -8023, 69.48892, 119.1983 -8024, 66.3432, 137.1607 -8025, 68.28599, 123.3591 -8026, 68.39674, 126.1915 -8027, 65.75868, 111.5519 -8028, 68.36155, 133.9494 -8029, 69.21078, 134.4253 -8030, 67.22096, 114.8024 -8031, 68.65998, 124.7691 -8032, 68.44603, 110.3778 -8033, 70.35705, 125.9397 -8034, 71.52468, 137.9496 -8035, 67.94061, 141.0108 -8036, 70.04339, 127.3467 -8037, 64.54078, 130.1828 -8038, 66.18181, 127.6085 -8039, 68.11241, 124.1533 -8040, 69.5091, 151.7634 -8041, 71.46618, 135.5982 -8042, 67.79009, 131.2158 -8043, 64.8491, 121.2608 -8044, 66.50511, 137.4995 -8045, 70.0677, 144.6209 -8046, 69.80295, 116.8405 -8047, 70.14185, 131.8359 -8048, 67.22436, 133.605 -8049, 71.97836, 138.1052 -8050, 69.32003, 136.5839 -8051, 67.41409, 123.8328 -8052, 68.08026, 131.0779 -8053, 68.13257, 136.8494 -8054, 70.37547, 130.5691 -8055, 70.31686, 132.9542 -8056, 65.5543, 121.2351 -8057, 64.65127, 118.3996 -8058, 69.73363, 122.1652 -8059, 67.69405, 121.728 -8060, 70.20483, 118.4049 -8061, 64.46691, 120.621 -8062, 69.64553, 134.4838 -8063, 69.29407, 131.2404 -8064, 68.98608, 121.228 -8065, 67.32147, 110.6602 -8066, 69.65674, 134.4204 -8067, 69.91295, 148.5606 -8068, 70.938, 129.7384 -8069, 68.91523, 109.4881 -8070, 68.55359, 131.1947 -8071, 66.76524, 121.931 -8072, 70.89744, 138.8549 -8073, 73.09657, 134.9595 -8074, 69.22647, 145.0718 -8075, 63.65093, 116.5654 -8076, 66.46411, 129.734 -8077, 68.35474, 123.7944 -8078, 67.57134, 124.2097 -8079, 66.83183, 135.5006 -8080, 69.62922, 143.0166 -8081, 68.05903, 126.0365 -8082, 67.54296, 134.5517 -8083, 69.303, 116.7611 -8084, 67.38937, 128.9351 -8085, 71.45669, 134.6404 -8086, 68.49029, 128.3649 -8087, 65.84126, 125.7087 -8088, 69.25123, 133.4489 -8089, 64.51431, 103.0865 -8090, 67.82414, 127.065 -8091, 65.84897, 118.2251 -8092, 70.67116, 122.6757 -8093, 67.11351, 124.6458 -8094, 67.59487, 138.5996 -8095, 66.33295, 116.4343 -8096, 69.89298, 140.0236 -8097, 66.38557, 142.4689 -8098, 67.1027, 125.1139 -8099, 66.43884, 113.1903 -8100, 66.12177, 120.4629 -8101, 67.00531, 133.6411 -8102, 64.16307, 101.9669 -8103, 67.32597, 135.9051 -8104, 66.94272, 121.8755 -8105, 69.08751, 142.7891 -8106, 70.44232, 132.9498 -8107, 67.9102, 125.3998 -8108, 66.51569, 119.5183 -8109, 67.3862, 128.4407 -8110, 68.10423, 120.9619 -8111, 67.51842, 110.0212 -8112, 68.2832, 108.7627 -8113, 67.79292, 128.0636 -8114, 68.30939, 121.2109 -8115, 66.19976, 113.9021 -8116, 65.84849, 142.3934 -8117, 68.82083, 135.0981 -8118, 68.96333, 135.9867 -8119, 69.04066, 133.625 -8120, 64.90924, 123.5221 -8121, 64.53827, 121.1495 -8122, 71.75047, 139.379 -8123, 66.93045, 132.2175 -8124, 65.54236, 129.4864 -8125, 64.84131, 91.8085 -8126, 66.98431, 130.0474 -8127, 66.14261, 118.8111 -8128, 70.81757, 145.2176 -8129, 68.91444, 152.0833 -8130, 66.66634, 100.2743 -8131, 70.48203, 137.6556 -8132, 69.91213, 135.5083 -8133, 66.64902, 118.6405 -8134, 69.01354, 145.8844 -8135, 66.26097, 115.3104 -8136, 68.89543, 119.3074 -8137, 71.22325, 132.1547 -8138, 68.68597, 124.6849 -8139, 69.89911, 135.1557 -8140, 68.69947, 116.0361 -8141, 69.8535, 136.027 -8142, 63.44123, 112.1713 -8143, 64.11532, 133.1515 -8144, 71.75025, 132.088 -8145, 66.19729, 135.4905 -8146, 65.72997, 126.827 -8147, 72.16986, 137.5684 -8148, 66.48739, 127.293 -8149, 69.31215, 124.2118 -8150, 68.02947, 119.5556 -8151, 65.97774, 91.25752 -8152, 71.29851, 142.5115 -8153, 71.5143, 127.7847 -8154, 68.60076, 128.8566 -8155, 68.18368, 135.9276 -8156, 69.8811, 151.879 -8157, 67.93999, 132.0277 -8158, 69.80319, 123.1697 -8159, 65.19641, 117.6912 -8160, 67.8403, 127.0545 -8161, 68.50897, 137.9252 -8162, 65.14879, 115.1881 -8163, 66.95341, 120.6277 -8164, 68.25949, 136.41 -8165, 68.03615, 149.0647 -8166, 64.54579, 111.3072 -8167, 71.52318, 127.8014 -8168, 69.57994, 137.7495 -8169, 66.84427, 129.9887 -8170, 68.5828, 123.3208 -8171, 69.51119, 146.7832 -8172, 67.49702, 135.4823 -8173, 67.20475, 129.0149 -8174, 67.66461, 136.768 -8175, 70.03691, 122.5324 -8176, 68.89205, 118.0131 -8177, 68.85894, 135.317 -8178, 68.40447, 143.2456 -8179, 69.51754, 137.8977 -8180, 69.63896, 135.0191 -8181, 68.27563, 135.026 -8182, 65.59198, 122.9795 -8183, 64.35791, 120.4781 -8184, 67.63682, 135.534 -8185, 69.47515, 137.0927 -8186, 68.93408, 133.3871 -8187, 65.98502, 133.4505 -8188, 67.65672, 124.4906 -8189, 68.79529, 144.5481 -8190, 66.82439, 133.8378 -8191, 68.7321, 109.9033 -8192, 66.33945, 122.7443 -8193, 67.47277, 99.0744 -8194, 67.72698, 134.7996 -8195, 65.20132, 116.8893 -8196, 71.49103, 135.6049 -8197, 65.24026, 113.6473 -8198, 69.99307, 139.7899 -8199, 65.18268, 121.4679 -8200, 70.06241, 134.3005 -8201, 68.61652, 125.2 -8202, 68.15831, 124.9999 -8203, 63.48187, 117.5449 -8204, 71.29462, 142.6142 -8205, 70.11496, 143.9751 -8206, 68.83929, 141.5128 -8207, 70.15775, 113.8639 -8208, 69.59681, 133.7791 -8209, 65.83263, 122.5777 -8210, 71.32785, 135.4846 -8211, 68.20864, 143.309 -8212, 71.87288, 134.3715 -8213, 69.35277, 128.963 -8214, 67.94055, 142.3413 -8215, 69.71919, 138.7374 -8216, 64.67334, 113.3238 -8217, 65.33432, 118.6681 -8218, 67.46316, 144.152 -8219, 71.08038, 155.0439 -8220, 66.66043, 135.3184 -8221, 67.7645, 109.9437 -8222, 67.23122, 124.4395 -8223, 67.43133, 134.417 -8224, 69.74968, 130.7336 -8225, 68.14016, 128.6113 -8226, 68.9402, 133.3423 -8227, 69.35342, 136.4262 -8228, 69.8643, 140.5089 -8229, 69.31822, 136.0998 -8230, 65.9301, 105.284 -8231, 68.42378, 127.227 -8232, 65.94139, 120.6136 -8233, 68.18063, 115.003 -8234, 70.25983, 129.9544 -8235, 66.05596, 104.3081 -8236, 67.73703, 131.4725 -8237, 65.29545, 126.3612 -8238, 68.16479, 121.2363 -8239, 68.95501, 140.2805 -8240, 68.19061, 129.2682 -8241, 69.5707, 126.2858 -8242, 70.02356, 137.4431 -8243, 69.14845, 117.2798 -8244, 70.24309, 121.0725 -8245, 70.66018, 142.7478 -8246, 67.45148, 125.9385 -8247, 65.03584, 114.225 -8248, 70.45839, 133.1533 -8249, 67.11299, 120.7303 -8250, 68.24423, 137.3349 -8251, 66.7588, 105.3169 -8252, 68.7307, 116.3236 -8253, 63.45132, 118.147 -8254, 69.32305, 133.6457 -8255, 69.07258, 123.9537 -8256, 70.51044, 143.4905 -8257, 67.29369, 117.9183 -8258, 69.33952, 142.08 -8259, 67.33993, 136.4499 -8260, 66.34535, 120.6503 -8261, 64.39297, 125.5261 -8262, 66.67639, 113.1137 -8263, 72.36601, 134.7475 -8264, 68.24893, 111.0142 -8265, 65.53245, 122.3297 -8266, 67.60693, 130.4762 -8267, 68.68598, 124.5562 -8268, 68.61117, 129.6617 -8269, 70.92173, 141.8458 -8270, 69.31458, 123.953 -8271, 68.56604, 130.441 -8272, 68.63936, 127.0952 -8273, 66.36369, 136.0598 -8274, 68.99555, 114.0398 -8275, 67.46519, 122.2341 -8276, 67.80467, 123.7772 -8277, 71.52782, 116.7279 -8278, 72.49367, 154.5031 -8279, 66.60755, 123.1233 -8280, 71.07038, 138.9521 -8281, 66.33447, 150.3119 -8282, 71.17232, 129.6463 -8283, 69.03651, 138.4825 -8284, 69.34919, 137.7115 -8285, 68.05366, 126.4259 -8286, 71.4948, 132.8622 -8287, 69.06112, 115.3726 -8288, 68.23732, 110.6226 -8289, 67.93276, 120.392 -8290, 68.55485, 130.1554 -8291, 67.5741, 125.7973 -8292, 66.36239, 117.4231 -8293, 70.76127, 133.7229 -8294, 67.10716, 131.2588 -8295, 64.5143, 127.8143 -8296, 67.47838, 120.9216 -8297, 67.23335, 141.0636 -8298, 67.99254, 144.1656 -8299, 67.458, 121.6819 -8300, 66.80866, 121.3264 -8301, 66.09963, 124.8608 -8302, 66.12053, 124.1474 -8303, 64.70924, 130.2642 -8304, 69.01541, 119.7938 -8305, 67.46277, 137.7862 -8306, 71.60898, 137.8791 -8307, 69.08877, 130.997 -8308, 67.81669, 115.8327 -8309, 70.74181, 128.5074 -8310, 64.4356, 119.3601 -8311, 70.81481, 139.7362 -8312, 64.90712, 129.5891 -8313, 68.30316, 126.8148 -8314, 68.41201, 132.9198 -8315, 66.35212, 99.69835 -8316, 67.27049, 124.5827 -8317, 66.63726, 120.3137 -8318, 65.00921, 84.26295 -8319, 67.69319, 124.4028 -8320, 70.26676, 128.8174 -8321, 66.19211, 121.0948 -8322, 65.62693, 126.6962 -8323, 71.58993, 135.744 -8324, 68.54869, 108.706 -8325, 68.52266, 122.0975 -8326, 66.21562, 109.3178 -8327, 65.71102, 113.8038 -8328, 72.23909, 159.4608 -8329, 66.533, 139.0226 -8330, 67.42805, 125.9181 -8331, 64.33729, 123.4824 -8332, 68.29721, 140.0057 -8333, 69.15487, 128.4365 -8334, 69.50939, 132.4955 -8335, 65.75398, 112.9736 -8336, 67.22359, 155.7617 -8337, 66.0023, 116.0386 -8338, 67.83406, 115.5906 -8339, 71.42677, 138.3516 -8340, 68.93168, 112.8601 -8341, 68.26056, 133.5413 -8342, 65.24947, 112.2883 -8343, 66.60071, 137.7297 -8344, 69.48187, 122.6836 -8345, 66.24301, 108.3135 -8346, 65.05662, 139.3953 -8347, 69.89977, 119.9003 -8348, 69.30058, 149.1915 -8349, 72.0775, 127.4068 -8350, 65.99698, 118.3092 -8351, 68.87245, 135.0451 -8352, 68.64611, 120.4317 -8353, 67.65677, 131.041 -8354, 69.15197, 128.0926 -8355, 70.05894, 141.614 -8356, 71.40809, 135.1406 -8357, 69.03498, 147.5304 -8358, 66.53406, 104.5216 -8359, 67.71834, 124.1642 -8360, 67.63519, 130.3102 -8361, 66.43601, 120.5525 -8362, 68.15413, 117.8028 -8363, 68.81782, 124.0657 -8364, 70.69194, 140.2734 -8365, 66.05342, 124.0408 -8366, 72.41769, 143.68 -8367, 66.93146, 117.7358 -8368, 65.53734, 118.2815 -8369, 67.54175, 127.8454 -8370, 67.76318, 136.177 -8371, 66.14528, 113.1378 -8372, 66.70349, 117.5526 -8373, 65.09221, 133.8826 -8374, 68.49307, 131.2102 -8375, 65.16644, 94.21964 -8376, 67.50707, 127.7961 -8377, 65.76724, 100.2388 -8378, 67.14094, 124.5368 -8379, 67.34801, 139.8293 -8380, 68.64599, 129.0105 -8381, 69.94177, 125.379 -8382, 67.30477, 123.9033 -8383, 68.78142, 147.1507 -8384, 66.12327, 113.5479 -8385, 66.30368, 117.2405 -8386, 69.18567, 128.0275 -8387, 66.90853, 118.8067 -8388, 68.70313, 124.6767 -8389, 71.08677, 148.1246 -8390, 65.52597, 122.9936 -8391, 66.20537, 116.068 -8392, 66.6718, 107.6202 -8393, 68.72702, 137.0353 -8394, 66.7039, 120.6447 -8395, 64.89628, 118.8854 -8396, 68.21209, 129.5464 -8397, 70.50017, 134.0139 -8398, 66.65252, 127.2599 -8399, 68.51303, 135.6923 -8400, 68.45497, 142.98 -8401, 68.61334, 110.3751 -8402, 67.78067, 116.6516 -8403, 68.61734, 130.0152 -8404, 70.42853, 142.6604 -8405, 65.45001, 108.0995 -8406, 70.69777, 119.4805 -8407, 67.28034, 111.5318 -8408, 66.4768, 129.6186 -8409, 65.08921, 125.0064 -8410, 66.56312, 119.046 -8411, 65.84797, 129.5537 -8412, 69.45763, 133.2109 -8413, 70.28788, 144.2612 -8414, 65.38017, 131.5842 -8415, 66.49187, 90.16983 -8416, 67.43263, 135.136 -8417, 68.81347, 125.0421 -8418, 62.92771, 95.73883 -8419, 69.3757, 135.4546 -8420, 64.73432, 112.0029 -8421, 68.97699, 143.0838 -8422, 69.37021, 133.1309 -8423, 65.63449, 110.4167 -8424, 68.33529, 129.8376 -8425, 65.0522, 122.3385 -8426, 68.70485, 122.1685 -8427, 66.64719, 150.0087 -8428, 67.91847, 135.8583 -8429, 64.00018, 128.5779 -8430, 68.90973, 127.6864 -8431, 67.83403, 116.6157 -8432, 72.14918, 161.6214 -8433, 65.93135, 119.386 -8434, 66.35334, 121.8461 -8435, 68.14895, 130.6059 -8436, 65.85562, 124.2612 -8437, 65.85908, 126.2855 -8438, 67.61041, 111.3166 -8439, 67.74703, 131.1387 -8440, 67.43873, 118.814 -8441, 68.20254, 130.0191 -8442, 67.42837, 127.2159 -8443, 69.06903, 140.8074 -8444, 67.77306, 138.4305 -8445, 67.11898, 129.8077 -8446, 69.69668, 141.0015 -8447, 62.6775, 102.6498 -8448, 67.26069, 130.2661 -8449, 70.02024, 140.0166 -8450, 67.30077, 134.2776 -8451, 69.78242, 144.6739 -8452, 68.96031, 123.3616 -8453, 68.86806, 129.4534 -8454, 67.56025, 110.1402 -8455, 65.08546, 130.6182 -8456, 67.17754, 117.2168 -8457, 69.77675, 125.558 -8458, 69.57213, 137.4401 -8459, 69.81071, 132.9983 -8460, 69.44528, 112.1204 -8461, 69.4941, 140.3979 -8462, 67.71518, 133.3581 -8463, 71.37261, 123.5644 -8464, 67.94484, 111.4393 -8465, 71.28888, 134.7116 -8466, 68.26826, 128.6627 -8467, 68.89648, 127.3814 -8468, 67.72198, 123.9987 -8469, 69.5539, 126.974 -8470, 65.2832, 130.2877 -8471, 65.05616, 118.9465 -8472, 69.57506, 125.9928 -8473, 73.95409, 145.2695 -8474, 64.67156, 131.8694 -8475, 67.41711, 135.8198 -8476, 72.83837, 143.4551 -8477, 66.35943, 147.1762 -8478, 70.21614, 134.6977 -8479, 67.76837, 135.6669 -8480, 68.21712, 123.9896 -8481, 70.10091, 140.0683 -8482, 67.59479, 118.0146 -8483, 70.12489, 132.4516 -8484, 64.55975, 128.829 -8485, 69.18894, 142.5893 -8486, 64.18631, 108.3347 -8487, 67.82633, 139.2589 -8488, 67.78211, 112.3772 -8489, 68.12769, 115.3454 -8490, 66.9149, 122.5675 -8491, 69.55254, 107.2211 -8492, 67.09352, 114.081 -8493, 71.3619, 124.5166 -8494, 71.16679, 137.383 -8495, 69.36125, 133.1983 -8496, 65.62974, 116.7798 -8497, 67.50367, 153.339 -8498, 71.06365, 136.3467 -8499, 66.49246, 117.7597 -8500, 69.98023, 135.4338 -8501, 66.36915, 120.7832 -8502, 65.72799, 129.9118 -8503, 67.22453, 138.4072 -8504, 69.6795, 128.9191 -8505, 66.91326, 111.703 -8506, 68.26178, 128.2739 -8507, 64.98478, 119.1325 -8508, 68.0698, 104.76 -8509, 68.61422, 136.6399 -8510, 66.30294, 132.3913 -8511, 68.38352, 142.0639 -8512, 65.93684, 130.2864 -8513, 69.26443, 144.1251 -8514, 69.85744, 132.3308 -8515, 67.08825, 127.413 -8516, 63.19953, 106.8324 -8517, 72.94152, 125.7713 -8518, 70.37958, 151.8206 -8519, 66.63283, 118.6562 -8520, 72.50855, 141.1954 -8521, 71.36999, 125.1979 -8522, 68.75583, 138.7086 -8523, 69.62903, 120.2989 -8524, 68.16407, 117.9536 -8525, 66.83708, 122.0631 -8526, 70.18194, 156.4056 -8527, 67.86367, 114.9246 -8528, 71.10272, 130.4239 -8529, 73.58262, 141.6525 -8530, 68.32952, 134.7504 -8531, 66.44661, 121.6314 -8532, 67.18734, 118.6352 -8533, 67.49287, 122.4953 -8534, 66.38595, 119.4673 -8535, 67.25681, 121.2471 -8536, 69.31111, 136.4983 -8537, 68.14806, 117.3852 -8538, 68.12645, 115.4428 -8539, 66.38526, 135.9818 -8540, 67.65899, 127.3092 -8541, 69.58252, 114.6022 -8542, 67.4652, 125.8834 -8543, 66.54185, 121.2715 -8544, 67.20255, 143.0669 -8545, 67.9341, 106.4818 -8546, 64.97055, 113.4885 -8547, 69.56655, 133.0219 -8548, 70.30948, 141.6156 -8549, 69.61829, 138.6939 -8550, 65.59094, 104.0323 -8551, 67.8259, 119.8473 -8552, 68.03804, 119.9125 -8553, 68.19362, 125.7243 -8554, 68.25109, 115.4595 -8555, 68.43965, 121.7398 -8556, 66.34605, 150.4439 -8557, 68.58532, 138.1689 -8558, 68.55442, 141.2293 -8559, 71.03808, 129.7799 -8560, 64.47771, 122.9159 -8561, 64.58247, 122.8109 -8562, 70.13052, 117.7137 -8563, 64.90601, 125.232 -8564, 68.99646, 124.495 -8565, 67.61832, 115.7638 -8566, 69.63195, 140.8429 -8567, 66.05471, 111.8194 -8568, 71.32499, 127.1661 -8569, 67.85806, 138.4063 -8570, 69.45941, 135.9299 -8571, 66.64834, 127.7205 -8572, 64.97782, 110.4212 -8573, 67.87711, 122.438 -8574, 72.31294, 136.5598 -8575, 67.14057, 134.0436 -8576, 64.43728, 114.5911 -8577, 66.67002, 117.9921 -8578, 68.59476, 128.0073 -8579, 71.47766, 129.924 -8580, 68.63009, 125.5075 -8581, 67.6305, 120.5523 -8582, 70.06317, 126.4208 -8583, 67.44197, 123.631 -8584, 68.03318, 115.4171 -8585, 67.4692, 129.6403 -8586, 68.92912, 110.1478 -8587, 67.31979, 115.8672 -8588, 68.047, 133.8044 -8589, 67.90838, 136.5008 -8590, 69.6925, 124.0748 -8591, 68.62706, 130.6542 -8592, 68.84882, 148.3087 -8593, 66.59651, 123.5118 -8594, 68.15322, 133.3485 -8595, 68.66291, 110.1892 -8596, 69.21557, 124.0764 -8597, 67.36, 129.7241 -8598, 68.07738, 104.7027 -8599, 66.52751, 134.1397 -8600, 70.42237, 136.6591 -8601, 67.07823, 132.8673 -8602, 66.43387, 126.4911 -8603, 67.98753, 114.7128 -8604, 71.27188, 158.4771 -8605, 68.04701, 123.3098 -8606, 72.61099, 142.6713 -8607, 64.68513, 115.842 -8608, 68.43352, 97.83008 -8609, 67.27211, 125.707 -8610, 68.75891, 138.2249 -8611, 68.49528, 116.3683 -8612, 69.2542, 151.8387 -8613, 68.77305, 127.9952 -8614, 65.17589, 111.4943 -8615, 68.21604, 119.0602 -8616, 67.30043, 120.3285 -8617, 67.86067, 115.128 -8618, 66.00059, 120.3097 -8619, 66.6625, 120.4223 -8620, 67.60112, 129.1886 -8621, 69.01782, 125.8767 -8622, 65.7622, 111.3564 -8623, 66.63706, 127.3243 -8624, 68.11546, 130.3186 -8625, 66.70442, 127.4867 -8626, 70.22831, 144.6741 -8627, 66.28448, 126.7203 -8628, 71.60477, 141.1438 -8629, 68.82431, 135.5828 -8630, 69.98686, 138.3058 -8631, 68.30179, 129.9339 -8632, 66.6512, 119.0595 -8633, 63.50812, 129.557 -8634, 69.5967, 136.7802 -8635, 64.89411, 124.4031 -8636, 67.67866, 129.976 -8637, 66.70638, 116.4489 -8638, 67.10993, 102.8583 -8639, 69.90802, 140.878 -8640, 67.71135, 122.7092 -8641, 67.5598, 119.3298 -8642, 64.20492, 103.6839 -8643, 71.00101, 135.5008 -8644, 68.81199, 109.4734 -8645, 67.94764, 108.1062 -8646, 68.21642, 131.4376 -8647, 66.17682, 125.3836 -8648, 68.69922, 144.3117 -8649, 68.70501, 109.3633 -8650, 69.61334, 125.4205 -8651, 69.75186, 122.5754 -8652, 71.46053, 148.6212 -8653, 69.36257, 111.1764 -8654, 67.40368, 109.3832 -8655, 69.81058, 119.4349 -8656, 70.47149, 140.3522 -8657, 66.7402, 143.1496 -8658, 63.91222, 105.8021 -8659, 67.8694, 136.8885 -8660, 66.84936, 116.9535 -8661, 66.07377, 115.9419 -8662, 68.48646, 133.3074 -8663, 71.77202, 141.7503 -8664, 67.55856, 137.7559 -8665, 66.28302, 134.3729 -8666, 68.43875, 119.3438 -8667, 67.07508, 115.6909 -8668, 70.60636, 122.1442 -8669, 68.8942, 135.3984 -8670, 69.88244, 134.3577 -8671, 68.93627, 138.0941 -8672, 65.14713, 117.9849 -8673, 68.68398, 136.8724 -8674, 67.56665, 117.9312 -8675, 68.73881, 145.8697 -8676, 68.96333, 119.0578 -8677, 68.5465, 121.7189 -8678, 67.85396, 121.6697 -8679, 64.96046, 127.6795 -8680, 68.58674, 129.2295 -8681, 67.92544, 110.8076 -8682, 69.3629, 118.6172 -8683, 70.90905, 146.5188 -8684, 69.28772, 132.6966 -8685, 69.06553, 119.9738 -8686, 66.60716, 109.856 -8687, 69.19515, 118.2264 -8688, 69.42865, 128.6528 -8689, 70.09399, 127.3597 -8690, 64.50077, 103.3027 -8691, 65.72099, 115.9257 -8692, 66.05702, 112.889 -8693, 62.40403, 118.5959 -8694, 72.90965, 148.6113 -8695, 66.22193, 131.9039 -8696, 65.97161, 129.6126 -8697, 67.82515, 122.1707 -8698, 71.16689, 152.1123 -8699, 65.46284, 101.8952 -8700, 68.92267, 144.0831 -8701, 68.57821, 137.295 -8702, 68.53972, 141.0431 -8703, 66.17685, 131.7326 -8704, 70.90225, 143.3108 -8705, 69.42553, 114.8461 -8706, 67.5235, 107.4208 -8707, 67.09865, 110.2544 -8708, 66.84169, 121.8217 -8709, 67.80772, 126.529 -8710, 67.14173, 121.3218 -8711, 70.57017, 137.4274 -8712, 65.05533, 125.8786 -8713, 70.03645, 139.6533 -8714, 66.21546, 118.4718 -8715, 63.142, 127.3112 -8716, 64.01004, 105.3351 -8717, 69.0029, 124.9629 -8718, 65.635, 105.3681 -8719, 68.59588, 121.1566 -8720, 68.8021, 142.3453 -8721, 69.03779, 122.1038 -8722, 67.04484, 116.5428 -8723, 66.03639, 117.0908 -8724, 69.62664, 127.3049 -8725, 67.3924, 113.4762 -8726, 71.00376, 134.5287 -8727, 67.93633, 114.9908 -8728, 68.63648, 129.2673 -8729, 68.62805, 126.3473 -8730, 67.83335, 142.6824 -8731, 67.39028, 122.0253 -8732, 68.46455, 114.5964 -8733, 70.16762, 123.31 -8734, 68.79997, 144.323 -8735, 68.04005, 117.5716 -8736, 68.0575, 144.1516 -8737, 69.66688, 128.3014 -8738, 67.88892, 138.9831 -8739, 69.43039, 128.4548 -8740, 68.70589, 151.2938 -8741, 66.73086, 116.8306 -8742, 69.36545, 128.6177 -8743, 68.02714, 145.0769 -8744, 65.88695, 111.8354 -8745, 68.57752, 146.3214 -8746, 67.04267, 116.0189 -8747, 69.64171, 135.2526 -8748, 69.28691, 124.1958 -8749, 68.2993, 122.8095 -8750, 66.59117, 112.9433 -8751, 66.00152, 119.4182 -8752, 69.62369, 135.4419 -8753, 70.40944, 160.9728 -8754, 68.23792, 132.3743 -8755, 71.33673, 144.0178 -8756, 68.26044, 128.1884 -8757, 65.19386, 118.5785 -8758, 64.97013, 128.0257 -8759, 65.48129, 117.1136 -8760, 70.81532, 136.8483 -8761, 69.65288, 132.9662 -8762, 70.7431, 124.3004 -8763, 66.577, 132.3608 -8764, 68.31897, 108.4509 -8765, 69.58153, 136.53 -8766, 70.24671, 121.6743 -8767, 69.53121, 126.6608 -8768, 71.23578, 121.6717 -8769, 66.48996, 115.6813 -8770, 67.1513, 130.6168 -8771, 69.49518, 131.1111 -8772, 65.40644, 123.0377 -8773, 68.65428, 134.1447 -8774, 65.08665, 120.4446 -8775, 70.78233, 122.2947 -8776, 62.42388, 113.2646 -8777, 66.71211, 116.8734 -8778, 69.29174, 117.5564 -8779, 63.91813, 114.1919 -8780, 65.76518, 117.0031 -8781, 70.68956, 135.662 -8782, 69.1483, 139.0431 -8783, 71.15854, 131.258 -8784, 66.39543, 116.2256 -8785, 69.95913, 132.8145 -8786, 68.85974, 134.8338 -8787, 70.30886, 134.2011 -8788, 66.47109, 113.7779 -8789, 67.99054, 138.8971 -8790, 67.72173, 136.0789 -8791, 67.42949, 135.9047 -8792, 65.98761, 110.2969 -8793, 68.0763, 117.3088 -8794, 67.58576, 113.3246 -8795, 67.71976, 97.61996 -8796, 65.7482, 99.90975 -8797, 69.3897, 133.682 -8798, 66.36935, 129.6092 -8799, 69.79204, 140.811 -8800, 67.75389, 126.4157 -8801, 70.21143, 131.9105 -8802, 68.67792, 122.0728 -8803, 71.14142, 130.5105 -8804, 66.40101, 130.5867 -8805, 67.0502, 143.097 -8806, 66.77997, 117.1269 -8807, 64.5675, 100.9 -8808, 66.79296, 116.9012 -8809, 69.70535, 119.1882 -8810, 67.51715, 133.8952 -8811, 66.77383, 112.0133 -8812, 69.09905, 132.1341 -8813, 67.74778, 117.103 -8814, 67.68924, 111.3426 -8815, 65.58171, 115.5257 -8816, 69.80522, 139.7323 -8817, 67.47119, 141.2489 -8818, 65.65515, 131.7992 -8819, 67.37904, 112.7464 -8820, 69.71522, 125.2627 -8821, 68.11911, 114.1017 -8822, 68.59547, 117.342 -8823, 66.91329, 119.7384 -8824, 72.74978, 139.9267 -8825, 67.06735, 124.2893 -8826, 71.35418, 132.9339 -8827, 67.5378, 129.0482 -8828, 68.37558, 125.9097 -8829, 74.2727, 144.66 -8830, 68.70571, 132.7107 -8831, 67.62161, 132.7596 -8832, 68.57034, 125.0608 -8833, 67.58944, 131.7524 -8834, 64.2441, 112.828 -8835, 72.21166, 122.8259 -8836, 68.45109, 112.7446 -8837, 65.7402, 117.7157 -8838, 67.53807, 118.2423 -8839, 69.22881, 125.0318 -8840, 69.15576, 131.5739 -8841, 67.69635, 125.4574 -8842, 68.38781, 120.6513 -8843, 71.73727, 140.9432 -8844, 66.9098, 127.8661 -8845, 70.38323, 152.929 -8846, 69.616, 135.0082 -8847, 65.52145, 113.0211 -8848, 69.55694, 136.8874 -8849, 65.82438, 121.7984 -8850, 69.7416, 135.4599 -8851, 67.47711, 115.5446 -8852, 68.09913, 124.585 -8853, 68.20718, 122.9659 -8854, 68.15528, 129.7591 -8855, 67.63533, 121.6332 -8856, 70.15607, 144.7042 -8857, 64.91503, 114.1893 -8858, 69.0054, 119.5523 -8859, 68.26633, 126.4766 -8860, 68.81612, 140.2813 -8861, 67.72767, 134.104 -8862, 66.56438, 132.7397 -8863, 68.46206, 133.381 -8864, 69.6475, 146.482 -8865, 62.35553, 102.9535 -8866, 67.59977, 125.9471 -8867, 67.51383, 129.5542 -8868, 66.45122, 108.2905 -8869, 70.00417, 140.7597 -8870, 65.68838, 119.2997 -8871, 67.84561, 142.0715 -8872, 70.29979, 138.4229 -8873, 67.12263, 136.7691 -8874, 70.32632, 127.1832 -8875, 67.38624, 143.2195 -8876, 67.12831, 130.1144 -8877, 69.37649, 135.3031 -8878, 68.40369, 144.1206 -8879, 65.88697, 128.0762 -8880, 66.24954, 102.3152 -8881, 66.20872, 121.6419 -8882, 65.47065, 120.9183 -8883, 70.80619, 130.7321 -8884, 69.68347, 120.7878 -8885, 68.57948, 111.95 -8886, 66.70391, 125.3796 -8887, 66.30788, 114.9262 -8888, 69.067, 129.1566 -8889, 65.69589, 125.6365 -8890, 67.3335, 128.6592 -8891, 67.26527, 115.5412 -8892, 65.87646, 136.2664 -8893, 68.78703, 133.1355 -8894, 68.46685, 133.7184 -8895, 68.17238, 123.3582 -8896, 68.00351, 129.994 -8897, 66.43891, 119.1959 -8898, 63.11944, 114.2425 -8899, 66.48446, 134.239 -8900, 66.55759, 108.1273 -8901, 68.58831, 141.7279 -8902, 65.54854, 128.616 -8903, 71.75568, 121.5435 -8904, 70.01805, 131.2352 -8905, 69.30459, 129.3077 -8906, 64.5266, 109.4324 -8907, 67.82493, 110.6918 -8908, 69.30746, 129.188 -8909, 67.17495, 123.1006 -8910, 67.19047, 111.219 -8911, 65.90544, 115.406 -8912, 67.25979, 131.1541 -8913, 66.3908, 118.4527 -8914, 67.37297, 113.7344 -8915, 70.31688, 134.466 -8916, 66.97896, 103.6181 -8917, 71.16515, 136.0685 -8918, 66.52982, 123.7617 -8919, 70.51065, 135.3067 -8920, 66.86786, 123.6055 -8921, 66.87611, 93.44279 -8922, 69.98701, 124.1901 -8923, 66.47468, 119.4661 -8924, 68.24878, 143.1334 -8925, 64.20728, 115.7541 -8926, 66.79236, 122.1444 -8927, 67.78383, 115.3515 -8928, 67.66018, 131.4295 -8929, 67.83249, 114.4112 -8930, 68.97089, 128.8479 -8931, 68.67746, 130.8949 -8932, 65.63126, 139.7057 -8933, 69.17205, 132.7823 -8934, 66.06605, 118.503 -8935, 67.93043, 132.0073 -8936, 68.33555, 137.7148 -8937, 69.22538, 145.6323 -8938, 69.05205, 140.8625 -8939, 71.78468, 148.0053 -8940, 68.63056, 140.2105 -8941, 67.25523, 112.3407 -8942, 70.44291, 124 -8943, 69.02526, 107.2311 -8944, 68.81653, 108.159 -8945, 69.4793, 123.016 -8946, 65.28886, 114.7259 -8947, 70.23626, 141.6617 -8948, 68.90008, 143.8243 -8949, 65.76153, 132.5244 -8950, 64.57852, 104.3304 -8951, 67.14474, 123.891 -8952, 65.21882, 105.491 -8953, 67.25521, 126.629 -8954, 67.25235, 137.5721 -8955, 65.77614, 132.6912 -8956, 62.6827, 96.03438 -8957, 70.0801, 137.082 -8958, 69.05895, 144.3368 -8959, 69.86644, 122.0803 -8960, 67.76916, 131.7569 -8961, 68.01168, 125.3418 -8962, 66.68649, 137.3589 -8963, 65.92248, 118.8738 -8964, 65.33207, 108.8749 -8965, 67.42605, 121.8715 -8966, 69.36554, 128.6365 -8967, 67.40751, 138.2898 -8968, 66.57351, 140.3651 -8969, 67.17337, 121.0826 -8970, 68.99306, 154.9503 -8971, 64.54104, 122.436 -8972, 67.54151, 117.6445 -8973, 68.58505, 127.7326 -8974, 71.98814, 137.2838 -8975, 67.65459, 154.9403 -8976, 67.6661, 130.5926 -8977, 66.14316, 134.4043 -8978, 66.40155, 140.8314 -8979, 67.07434, 137.5925 -8980, 68.20422, 135.581 -8981, 70.48362, 139.2976 -8982, 68.67658, 134.969 -8983, 67.74427, 124.1332 -8984, 69.67541, 132.6086 -8985, 68.39295, 142.5965 -8986, 63.70222, 109.7699 -8987, 66.64859, 108.9945 -8988, 67.90407, 124.9492 -8989, 66.5197, 111.722 -8990, 66.54521, 133.7914 -8991, 71.96799, 144.5037 -8992, 67.20094, 147.7364 -8993, 68.71458, 118.739 -8994, 63.79579, 113.0481 -8995, 66.9737, 122.7246 -8996, 69.76872, 127.523 -8997, 67.94033, 126.2715 -8998, 69.44812, 126.0498 -8999, 68.05029, 120.1885 -9000, 68.01797, 133.8531 -9001, 64.38451, 120.9878 -9002, 65.25758, 104.4308 -9003, 70.47138, 138.5686 -9004, 68.16951, 136.5314 -9005, 65.04024, 117.8342 -9006, 66.39263, 137.6273 -9007, 67.60452, 139.128 -9008, 67.84567, 128.5574 -9009, 68.50322, 129.6116 -9010, 69.52893, 132.6006 -9011, 68.12778, 112.1998 -9012, 67.38512, 128.4802 -9013, 65.6983, 108.4186 -9014, 68.53813, 124.2629 -9015, 67.344, 115.9541 -9016, 70.01961, 138.2804 -9017, 67.40743, 130.7949 -9018, 70.17944, 141.0758 -9019, 66.51343, 128.4216 -9020, 67.26656, 125.9014 -9021, 66.31374, 111.5275 -9022, 68.44896, 123.68 -9023, 69.27778, 129.0046 -9024, 64.42384, 129.7849 -9025, 66.70168, 130.5984 -9026, 69.24707, 115.7079 -9027, 66.28284, 114.6304 -9028, 69.63326, 124.6271 -9029, 71.70174, 132.1551 -9030, 66.93376, 131.3089 -9031, 67.21461, 138.1399 -9032, 67.3223, 118.8846 -9033, 68.78724, 120.7674 -9034, 70.04804, 142.6447 -9035, 67.87706, 143.2935 -9036, 67.02932, 125.1984 -9037, 69.64922, 154.6918 -9038, 71.22213, 122.1485 -9039, 69.66832, 127.8876 -9040, 67.96253, 127.4414 -9041, 67.00064, 113.6904 -9042, 70.48193, 129.2246 -9043, 68.55545, 125.4016 -9044, 68.7117, 149.996 -9045, 67.31232, 129.0666 -9046, 70.2357, 130.3049 -9047, 69.62229, 134.6101 -9048, 66.48154, 137.9908 -9049, 67.07917, 133.1644 -9050, 69.67002, 140.8713 -9051, 69.14091, 141.8583 -9052, 67.16885, 121.6772 -9053, 68.66029, 123.5929 -9054, 70.01551, 129.615 -9055, 65.91776, 121.563 -9056, 68.37937, 131.1613 -9057, 72.03353, 116.3468 -9058, 67.4263, 143.0452 -9059, 66.83514, 104.2224 -9060, 70.8882, 133.5063 -9061, 71.09886, 134.4454 -9062, 68.28929, 130.8796 -9063, 67.42232, 124.5761 -9064, 68.77046, 110.9432 -9065, 66.44097, 107.1578 -9066, 66.90499, 120.1547 -9067, 67.74564, 134.8147 -9068, 69.8243, 128.6697 -9069, 68.53948, 137.0614 -9070, 67.01536, 123.0206 -9071, 68.72506, 124.6451 -9072, 68.35119, 133.4171 -9073, 67.19257, 129.0612 -9074, 69.5455, 133.8347 -9075, 68.59743, 132.2555 -9076, 67.24215, 119.4882 -9077, 66.65525, 129.5077 -9078, 64.90589, 136.4502 -9079, 69.23991, 127.3088 -9080, 68.56348, 111.6024 -9081, 66.34211, 114.1735 -9082, 70.38965, 111.2858 -9083, 69.41526, 138.7516 -9084, 69.27737, 111.6005 -9085, 68.38301, 134.017 -9086, 67.157, 124.2264 -9087, 68.20503, 113.3739 -9088, 68.72586, 131.5592 -9089, 66.96037, 125.1157 -9090, 66.66717, 124.2017 -9091, 70.07603, 139.5844 -9092, 70.51629, 136.3324 -9093, 71.54106, 126.4717 -9094, 67.50481, 141.2498 -9095, 69.15991, 113.6123 -9096, 67.90658, 132.8133 -9097, 68.82477, 120.2753 -9098, 69.78004, 123.8703 -9099, 68.44619, 138.1636 -9100, 69.39772, 118.0079 -9101, 67.30346, 141.5997 -9102, 65.66713, 128.864 -9103, 67.33725, 124.8425 -9104, 67.00093, 128.6654 -9105, 65.45347, 108.3017 -9106, 66.65036, 116.8012 -9107, 66.62187, 120.3299 -9108, 71.06319, 131.0404 -9109, 66.53966, 119.8203 -9110, 66.05713, 113.8325 -9111, 64.81538, 123.0207 -9112, 67.82121, 124.0312 -9113, 69.91442, 131.4753 -9114, 67.20148, 119.7628 -9115, 69.57829, 133.2355 -9116, 69.56702, 143.8267 -9117, 67.25014, 127.6431 -9118, 66.31447, 106.2018 -9119, 69.82058, 110.6276 -9120, 64.68698, 117.9638 -9121, 68.52069, 142.1197 -9122, 68.05361, 137.0546 -9123, 63.88492, 122.967 -9124, 65.87122, 135.4564 -9125, 67.28386, 141.0113 -9126, 68.7451, 145.1448 -9127, 71.78732, 127.6009 -9128, 71.89347, 142.8591 -9129, 71.21521, 140.5748 -9130, 68.63924, 121.7655 -9131, 67.20198, 127.4781 -9132, 68.42171, 116.4237 -9133, 66.21571, 132.8434 -9134, 65.69602, 114.2603 -9135, 64.39471, 108.8848 -9136, 68.13221, 126.5235 -9137, 69.95789, 157.8629 -9138, 66.17437, 124.0197 -9139, 67.3027, 108.836 -9140, 67.12352, 139.5505 -9141, 66.13041, 114.8118 -9142, 66.76283, 132.985 -9143, 69.81734, 140.8902 -9144, 67.50491, 126.0354 -9145, 67.77868, 132.7541 -9146, 67.09294, 134.424 -9147, 69.02064, 139.6542 -9148, 68.37429, 127.5258 -9149, 64.61585, 131.0972 -9150, 65.50846, 146.5505 -9151, 68.56092, 114.3385 -9152, 69.29465, 137.8696 -9153, 67.29291, 135.6857 -9154, 67.10227, 117.0417 -9155, 66.23273, 128.5774 -9156, 68.91376, 140.9367 -9157, 66.75178, 132.2723 -9158, 67.13916, 111.5926 -9159, 66.25471, 126.3462 -9160, 69.74556, 153.9188 -9161, 66.34128, 128.7754 -9162, 69.83341, 108.9893 -9163, 69.86248, 137.0186 -9164, 70.28256, 118.5086 -9165, 67.07699, 130.1395 -9166, 68.18059, 123.6302 -9167, 67.59916, 128.1213 -9168, 68.02776, 140.8584 -9169, 68.42296, 121.4696 -9170, 66.75944, 112.3085 -9171, 68.53352, 124.2808 -9172, 65.2651, 110.8564 -9173, 66.58553, 122.2553 -9174, 69.2084, 130.033 -9175, 66.78219, 103.0118 -9176, 69.73097, 129.0492 -9177, 69.25719, 123.1632 -9178, 68.57908, 114.3083 -9179, 68.38491, 130.869 -9180, 67.35514, 119.3197 -9181, 70.08283, 124.9148 -9182, 69.17193, 140.6591 -9183, 70.74539, 125.966 -9184, 65.88537, 138.3547 -9185, 66.18373, 113.7313 -9186, 64.9891, 120.7808 -9187, 70.07851, 129.7672 -9188, 67.47051, 123.0945 -9189, 71.44337, 130.4157 -9190, 69.28932, 137.6776 -9191, 68.75846, 127.091 -9192, 67.99864, 135.3502 -9193, 66.76007, 111.1036 -9194, 71.10275, 126.991 -9195, 68.84929, 133.7133 -9196, 66.71258, 125.7664 -9197, 69.69606, 131.6194 -9198, 68.21523, 137.7177 -9199, 69.19788, 125.6089 -9200, 65.99751, 120.2086 -9201, 67.06344, 119.1764 -9202, 70.38879, 148.7394 -9203, 66.85526, 130.9888 -9204, 65.49447, 116.2783 -9205, 66.4933, 131.4317 -9206, 69.64591, 135.8083 -9207, 66.6031, 120.0463 -9208, 65.5028, 110.0927 -9209, 70.68042, 145.9 -9210, 68.35984, 115.3059 -9211, 69.67952, 138.7123 -9212, 67.28637, 138.2075 -9213, 64.24975, 131.6321 -9214, 69.59961, 152.9562 -9215, 67.2586, 136.0419 -9216, 65.07024, 110.1766 -9217, 69.32643, 131.1248 -9218, 65.74804, 114.0431 -9219, 67.8373, 124.0473 -9220, 67.68655, 124.5785 -9221, 69.93319, 129.2833 -9222, 66.7117, 111.267 -9223, 71.46877, 126.8355 -9224, 69.23864, 119.7615 -9225, 66.93836, 119.0544 -9226, 73.75335, 153.1022 -9227, 68.52941, 129.8379 -9228, 65.84612, 127.4989 -9229, 69.14293, 130.5126 -9230, 68.50756, 128.4389 -9231, 68.80941, 150.2088 -9232, 68.28658, 116.4148 -9233, 66.0851, 122.6038 -9234, 66.76815, 124.7948 -9235, 68.41582, 127.8615 -9236, 67.86012, 138.798 -9237, 66.49326, 128.5167 -9238, 70.05556, 145.7431 -9239, 71.51172, 128.1476 -9240, 69.63168, 160.4111 -9241, 67.31178, 106.3544 -9242, 65.9605, 126.6596 -9243, 68.69762, 139.7047 -9244, 70.5427, 147.6912 -9245, 65.2308, 116.3007 -9246, 65.7164, 94.98665 -9247, 66.6851, 123.8638 -9248, 68.30596, 108.0676 -9249, 70.06674, 130.9781 -9250, 67.06764, 131.5991 -9251, 68.67723, 126.1419 -9252, 66.56482, 118.4916 -9253, 67.928, 139.2513 -9254, 67.81441, 123.6647 -9255, 68.05175, 133.8927 -9256, 65.16729, 121.1432 -9257, 68.4387, 128.4782 -9258, 69.90595, 133.594 -9259, 67.5131, 131.9657 -9260, 70.55747, 143.9102 -9261, 67.50352, 125.0155 -9262, 70.8343, 144.4515 -9263, 67.17439, 129.7009 -9264, 68.23162, 132.8397 -9265, 68.84891, 141.2839 -9266, 66.06507, 118.4233 -9267, 67.96066, 124.5333 -9268, 64.42169, 119.2322 -9269, 68.9783, 145.197 -9270, 68.86452, 133.6579 -9271, 67.51935, 123.6148 -9272, 70.8742, 127.9931 -9273, 65.63908, 125.7235 -9274, 72.06149, 147.5819 -9275, 70.74003, 147.7738 -9276, 69.53497, 141.9338 -9277, 66.04415, 121.9856 -9278, 67.75988, 140.1278 -9279, 67.28678, 131.5009 -9280, 66.58203, 122.171 -9281, 67.00829, 127.8757 -9282, 67.14315, 114.6482 -9283, 69.52981, 128.8579 -9284, 69.01236, 146.6218 -9285, 67.53657, 100.154 -9286, 68.06545, 141.5315 -9287, 69.27853, 143.8148 -9288, 68.96647, 136.0886 -9289, 68.75452, 129.4726 -9290, 67.32854, 107.9528 -9291, 69.0599, 131.2881 -9292, 69.76801, 132.0979 -9293, 72.03679, 138.0884 -9294, 64.54425, 115.9595 -9295, 63.63284, 107.2702 -9296, 70.94818, 149.7548 -9297, 62.91288, 109.2128 -9298, 69.4062, 124.5456 -9299, 65.4398, 136.8947 -9300, 67.05728, 122.9843 -9301, 66.18541, 121.9805 -9302, 66.90237, 139.8915 -9303, 66.41367, 109.0311 -9304, 67.67042, 123.1408 -9305, 67.70967, 131.7281 -9306, 66.69404, 126.8929 -9307, 69.5217, 126.8198 -9308, 68.20773, 119.5053 -9309, 67.99821, 127.458 -9310, 68.00746, 119.2101 -9311, 68.09824, 143.5727 -9312, 68.93312, 143.0937 -9313, 69.78307, 139.0177 -9314, 65.81071, 114.1338 -9315, 69.96713, 125.4353 -9316, 67.5085, 127.8424 -9317, 69.09305, 140.226 -9318, 72.36277, 135.6763 -9319, 67.6456, 123.0015 -9320, 69.46842, 119.0737 -9321, 66.77116, 129.5425 -9322, 70.23323, 135.7363 -9323, 69.55395, 139.2316 -9324, 69.35355, 128.9771 -9325, 67.2451, 130.0655 -9326, 64.77727, 143.251 -9327, 66.30059, 112.3781 -9328, 66.75624, 125.1407 -9329, 65.73325, 134.9375 -9330, 68.08852, 111.6419 -9331, 71.55699, 141.6861 -9332, 67.38427, 122.8404 -9333, 64.15481, 101.7546 -9334, 68.50089, 121.5853 -9335, 69.27158, 135.7448 -9336, 68.52587, 131.2739 -9337, 66.81053, 127.0045 -9338, 70.0217, 132.9266 -9339, 70.44212, 135.0743 -9340, 70.35346, 118.347 -9341, 65.94226, 136.2054 -9342, 67.49783, 121.6583 -9343, 68.00099, 127.1241 -9344, 65.48962, 99.76843 -9345, 66.86327, 124.5651 -9346, 69.4656, 131.2397 -9347, 67.40982, 113.6502 -9348, 65.75113, 117.6909 -9349, 69.07002, 130.5795 -9350, 69.3032, 128.7739 -9351, 67.27013, 136.5165 -9352, 68.29642, 132.8802 -9353, 65.5358, 108.0334 -9354, 67.22288, 138.325 -9355, 69.02293, 143.8474 -9356, 66.69251, 130.6489 -9357, 66.50669, 131.5283 -9358, 67.98874, 146.0239 -9359, 66.65476, 125.3253 -9360, 69.12208, 129.0318 -9361, 71.02363, 144.1068 -9362, 66.46702, 119.3847 -9363, 69.03081, 134.2694 -9364, 65.9942, 128.0366 -9365, 66.54171, 133.9323 -9366, 65.91998, 135.6308 -9367, 70.59103, 134.1319 -9368, 65.78822, 134.2213 -9369, 69.91804, 119.5102 -9370, 64.2992, 126.3063 -9371, 66.42226, 113.4779 -9372, 68.74988, 136.8669 -9373, 67.99798, 118.1315 -9374, 64.60634, 122.632 -9375, 67.88746, 119.0272 -9376, 66.81948, 125.9408 -9377, 69.06944, 159.9584 -9378, 65.65385, 129.1825 -9379, 66.2017, 114.629 -9380, 68.94276, 135.2118 -9381, 68.3649, 119.517 -9382, 67.18992, 127.9725 -9383, 66.68348, 119.6796 -9384, 67.43443, 120.3906 -9385, 67.21497, 119.7199 -9386, 68.45993, 121.1754 -9387, 63.64325, 117.4774 -9388, 67.53521, 146.869 -9389, 69.70037, 128.112 -9390, 68.29865, 122.6236 -9391, 67.97567, 130.0032 -9392, 69.57423, 130.6273 -9393, 66.70797, 142.0475 -9394, 67.9214, 110.3853 -9395, 67.40188, 124.1551 -9396, 69.39159, 121.5433 -9397, 68.59889, 127.6063 -9398, 68.3755, 126.0555 -9399, 68.28427, 127.0948 -9400, 68.50766, 152.6424 -9401, 65.09736, 111.7652 -9402, 65.83359, 119.9561 -9403, 69.25932, 134.0319 -9404, 68.73092, 132.3239 -9405, 66.77164, 120.5926 -9406, 66.38506, 142.6708 -9407, 67.46704, 132.4481 -9408, 68.17097, 123.7398 -9409, 65.70973, 125.7159 -9410, 67.07386, 121.8819 -9411, 71.9948, 147.5977 -9412, 63.22211, 107.5164 -9413, 69.03411, 118.9953 -9414, 68.64248, 120.9374 -9415, 65.9252, 118.0381 -9416, 72.10915, 143.0039 -9417, 66.35575, 107.5936 -9418, 68.96323, 128.6853 -9419, 65.42432, 116.2966 -9420, 65.22177, 112.5281 -9421, 72.70766, 151.2249 -9422, 67.3917, 106.0426 -9423, 66.68077, 127.0893 -9424, 68.72378, 129.9631 -9425, 63.70105, 109.8656 -9426, 73.02554, 153.6723 -9427, 68.16631, 126.7726 -9428, 64.82933, 95.71141 -9429, 65.8334, 119.1656 -9430, 67.8251, 129.8443 -9431, 69.45504, 143.627 -9432, 63.03704, 117.6276 -9433, 67.58447, 125.4967 -9434, 66.92223, 122.307 -9435, 69.33008, 135.0667 -9436, 71.71882, 146.1847 -9437, 68.66466, 137.1764 -9438, 70.46171, 120.4257 -9439, 64.20227, 124.2804 -9440, 68.54482, 122.1992 -9441, 65.42611, 118.5156 -9442, 69.20541, 135.4161 -9443, 63.51326, 105.9244 -9444, 67.2175, 111.7119 -9445, 69.69215, 143.5628 -9446, 68.78018, 132.1932 -9447, 69.40612, 120.9522 -9448, 67.40414, 121.3496 -9449, 67.40661, 109.3581 -9450, 66.49497, 124.8437 -9451, 67.2151, 120.043 -9452, 69.36059, 124.4044 -9453, 69.68186, 147.5598 -9454, 67.6277, 160.2278 -9455, 67.89343, 154.2345 -9456, 70.64483, 129.7265 -9457, 70.8271, 131.8696 -9458, 66.95277, 150.2868 -9459, 66.46976, 123.0618 -9460, 66.54555, 124.8628 -9461, 68.16788, 146.6505 -9462, 66.2086, 115.1943 -9463, 68.33636, 135.8657 -9464, 64.5222, 96.68665 -9465, 65.57641, 117.1727 -9466, 69.2064, 124.3249 -9467, 69.07345, 156.9797 -9468, 68.94109, 130.1473 -9469, 68.07446, 143.6574 -9470, 72.00843, 133.2257 -9471, 67.20444, 139.7736 -9472, 68.43894, 124.1119 -9473, 68.23881, 111.9836 -9474, 70.52936, 122.4652 -9475, 67.32161, 124.3376 -9476, 69.95585, 147.535 -9477, 67.88682, 135.3697 -9478, 68.15578, 106.8394 -9479, 70.56446, 124.0626 -9480, 68.13215, 104.8113 -9481, 70.25892, 129.4346 -9482, 71.06535, 140.4796 -9483, 66.36966, 116.5041 -9484, 67.17026, 135.8317 -9485, 68.87325, 146.9941 -9486, 70.81794, 131.5906 -9487, 66.72765, 121.3333 -9488, 67.48404, 137.405 -9489, 66.53552, 138.7161 -9490, 68.04662, 127.0141 -9491, 67.85401, 129.9666 -9492, 68.00799, 119.6399 -9493, 74.05895, 133.8172 -9494, 68.49073, 130.7902 -9495, 64.60903, 96.02104 -9496, 67.56038, 127.1691 -9497, 68.62368, 123.8232 -9498, 67.25436, 142.156 -9499, 68.17591, 127.1837 -9500, 67.57397, 132.4176 -9501, 66.05092, 103.9482 -9502, 69.27344, 127.5728 -9503, 69.90864, 121.1529 -9504, 69.28147, 140.9313 -9505, 68.75275, 132.5807 -9506, 67.33384, 115.6858 -9507, 65.05656, 111.7393 -9508, 65.67598, 111.3916 -9509, 66.47819, 101.3276 -9510, 70.52868, 134.6246 -9511, 67.33753, 109.9394 -9512, 69.87287, 126.1665 -9513, 68.73321, 125.7578 -9514, 69.1104, 140.1776 -9515, 69.1176, 120.5052 -9516, 66.72791, 116.0508 -9517, 70.37952, 130.6461 -9518, 64.75996, 110.5434 -9519, 67.50912, 145.7528 -9520, 66.26041, 125.1086 -9521, 67.44271, 142.4967 -9522, 68.68327, 139.7883 -9523, 67.58574, 125.2951 -9524, 66.55002, 111.2059 -9525, 66.3369, 148.2612 -9526, 67.59753, 132.7081 -9527, 66.16875, 138.9486 -9528, 68.38972, 118.5898 -9529, 69.32992, 133.9886 -9530, 66.91635, 120.1121 -9531, 67.20178, 121.5752 -9532, 68.88096, 143.4448 -9533, 68.83944, 136.7053 -9534, 70.43032, 121.1569 -9535, 69.6312, 138.6313 -9536, 66.23915, 130.0533 -9537, 69.57833, 140.2363 -9538, 70.32551, 142.6363 -9539, 65.17576, 100.3741 -9540, 70.81253, 118.5751 -9541, 69.5776, 127.2639 -9542, 64.67472, 104.1077 -9543, 68.0986, 114.887 -9544, 69.48224, 135.7121 -9545, 69.19418, 122.8981 -9546, 68.58131, 135.3452 -9547, 68.46986, 143.989 -9548, 66.52275, 116.8098 -9549, 67.29478, 100.4477 -9550, 68.02127, 133.231 -9551, 69.55433, 120.3508 -9552, 70.55274, 144.0613 -9553, 69.43571, 107.0716 -9554, 67.22028, 119.5298 -9555, 64.65699, 111.5398 -9556, 69.51829, 138.9221 -9557, 65.09086, 115.2015 -9558, 66.86091, 124.2395 -9559, 68.59768, 107.0438 -9560, 71.01173, 146.3277 -9561, 71.34761, 129.5618 -9562, 67.74021, 121.2672 -9563, 71.61413, 145.0715 -9564, 68.84447, 120.2177 -9565, 66.83785, 128.0275 -9566, 66.13335, 119.3266 -9567, 65.79023, 123.2118 -9568, 68.73614, 140.187 -9569, 67.57879, 131.6685 -9570, 70.7638, 145.0962 -9571, 67.67495, 127.9568 -9572, 64.5197, 128.6015 -9573, 68.70418, 146.899 -9574, 68.20196, 113.2495 -9575, 68.50077, 117.3796 -9576, 68.18475, 131.2772 -9577, 67.31928, 128.0177 -9578, 69.94028, 148.8857 -9579, 67.49093, 141.5919 -9580, 66.51022, 109.6487 -9581, 70.54908, 132.7834 -9582, 68.31443, 134.8167 -9583, 69.56373, 134.7459 -9584, 69.69727, 125.7112 -9585, 67.72532, 132.9298 -9586, 66.87841, 138.0319 -9587, 68.40503, 151.6563 -9588, 68.11084, 120.446 -9589, 66.86782, 109.5053 -9590, 68.96376, 130.3361 -9591, 70.51308, 137.2445 -9592, 65.1844, 126.7683 -9593, 70.21546, 113.0231 -9594, 69.03164, 133.84 -9595, 66.14828, 93.75301 -9596, 70.63243, 136.9783 -9597, 63.92425, 119.5108 -9598, 67.93981, 126.2074 -9599, 68.94411, 120.0772 -9600, 66.17288, 112.4068 -9601, 68.1199, 143.5778 -9602, 68.01974, 136.8445 -9603, 64.16711, 112.8528 -9604, 69.01036, 140.9219 -9605, 68.91364, 129.5028 -9606, 66.44713, 136.0997 -9607, 65.61804, 129.5947 -9608, 69.11903, 122.9885 -9609, 70.28184, 140.9463 -9610, 66.73051, 114.8715 -9611, 66.72657, 135.0653 -9612, 68.80212, 124.2972 -9613, 69.02745, 121.9743 -9614, 66.62724, 133.8779 -9615, 67.97623, 134.8979 -9616, 65.11298, 124.4876 -9617, 67.89264, 129.4893 -9618, 68.64717, 124.6416 -9619, 65.14223, 130.2813 -9620, 68.65645, 124.6263 -9621, 67.83641, 135.3784 -9622, 67.51286, 133.072 -9623, 66.63689, 128.8981 -9624, 68.34852, 134.0701 -9625, 65.8678, 127.5491 -9626, 67.36679, 145.0907 -9627, 68.35562, 128.6526 -9628, 65.76876, 126.7595 -9629, 67.90471, 104.8685 -9630, 65.54889, 122.4253 -9631, 69.03026, 134.7709 -9632, 66.27542, 119.7849 -9633, 67.88791, 126.7626 -9634, 65.72184, 107.6977 -9635, 68.66079, 130.6653 -9636, 68.28397, 107.6837 -9637, 69.17713, 128.8322 -9638, 69.2558, 138.4302 -9639, 69.54643, 144.0828 -9640, 68.97883, 141.869 -9641, 69.23439, 151.4362 -9642, 66.67303, 129.5801 -9643, 66.16115, 133.9835 -9644, 67.43035, 131.9753 -9645, 65.90419, 123.7444 -9646, 67.25626, 114.1209 -9647, 67.83686, 132.5467 -9648, 70.19109, 133.1316 -9649, 66.31564, 126.0798 -9650, 67.66646, 117.2472 -9651, 67.7519, 131.9273 -9652, 68.3228, 113.167 -9653, 72.0803, 130.742 -9654, 68.78572, 128.277 -9655, 68.57754, 118.4883 -9656, 68.37308, 124.2885 -9657, 68.74512, 130.1937 -9658, 69.39088, 130.6716 -9659, 68.61933, 134.812 -9660, 67.23029, 121.3587 -9661, 68.49582, 138.0952 -9662, 69.30757, 145.4359 -9663, 65.61597, 118.6455 -9664, 68.09188, 129.8851 -9665, 67.7166, 122.6816 -9666, 67.4508, 115.9856 -9667, 67.13754, 119.8772 -9668, 64.14983, 106.4504 -9669, 67.65922, 135.9871 -9670, 68.28587, 137.0307 -9671, 65.54248, 122.9935 -9672, 68.82518, 154.7341 -9673, 72.12412, 146.2978 -9674, 67.61816, 122.4365 -9675, 68.49971, 137.8023 -9676, 71.21183, 131.1726 -9677, 71.15269, 133.2166 -9678, 70.31235, 132.5313 -9679, 70.26465, 113.4165 -9680, 65.49772, 130.9129 -9681, 68.06388, 117.0789 -9682, 68.71857, 132.3502 -9683, 69.47394, 159.8926 -9684, 68.27314, 125.3854 -9685, 67.57915, 113.2566 -9686, 68.60227, 130.4389 -9687, 67.10387, 144.1473 -9688, 67.37805, 125.1132 -9689, 70.82184, 159.3021 -9690, 69.13393, 125.6548 -9691, 68.31448, 129.3196 -9692, 64.06191, 109.7758 -9693, 68.21309, 121.3595 -9694, 66.36575, 130.7716 -9695, 70.73365, 119.0237 -9696, 69.35175, 129.1685 -9697, 66.25415, 125.563 -9698, 68.60712, 105.1285 -9699, 70.27709, 127.2297 -9700, 68.2473, 124.244 -9701, 66.9098, 129.5755 -9702, 66.56227, 117.7942 -9703, 68.91759, 128.5454 -9704, 68.80671, 141.7393 -9705, 70.88619, 127.9719 -9706, 73.51383, 138.9321 -9707, 68.56821, 131.7526 -9708, 66.88985, 129.5218 -9709, 69.76635, 146.4205 -9710, 67.44905, 131.1587 -9711, 69.3961, 112.2049 -9712, 69.11016, 120.8271 -9713, 67.00457, 139.3125 -9714, 66.53958, 132.7218 -9715, 70.31894, 147.0394 -9716, 69.95672, 119.7538 -9717, 67.17704, 127.8719 -9718, 73.18256, 132.9995 -9719, 68.17989, 116.2537 -9720, 70.85706, 123.5573 -9721, 68.61586, 117.3901 -9722, 69.99675, 131.242 -9723, 66.89348, 156.4495 -9724, 68.944, 129.6552 -9725, 67.5559, 115.2974 -9726, 68.51482, 124.1914 -9727, 71.15411, 151.4754 -9728, 68.88473, 126.2634 -9729, 70.48065, 145.9294 -9730, 67.04825, 124.6696 -9731, 63.92053, 98.7457 -9732, 65.42959, 120.5649 -9733, 67.06764, 152.4888 -9734, 69.86922, 136.3855 -9735, 66.15786, 134.1293 -9736, 63.92128, 113.4515 -9737, 68.65125, 146.1165 -9738, 69.85696, 138.1103 -9739, 68.94991, 126.8747 -9740, 66.61559, 128.5193 -9741, 68.9697, 110.5576 -9742, 64.96032, 128.2809 -9743, 68.71059, 110.049 -9744, 67.44021, 129.2538 -9745, 69.29564, 125.0373 -9746, 68.3902, 116.4848 -9747, 65.57747, 117.9638 -9748, 68.16834, 129.595 -9749, 64.13237, 124.2891 -9750, 69.05347, 140.6226 -9751, 68.4964, 133.8031 -9752, 66.60332, 125.173 -9753, 66.78141, 115.7559 -9754, 68.68124, 112.327 -9755, 69.25972, 125.5782 -9756, 64.27481, 107.569 -9757, 70.17795, 132.6043 -9758, 69.75895, 139.3178 -9759, 67.61169, 140.8895 -9760, 71.41635, 146.9978 -9761, 68.70158, 120.3307 -9762, 65.38354, 123.2058 -9763, 71.82386, 136.6557 -9764, 65.44204, 128.948 -9765, 68.73343, 145.1099 -9766, 68.17608, 119.5684 -9767, 72.05521, 136.6193 -9768, 67.37648, 110.3445 -9769, 66.63165, 130.7607 -9770, 66.57454, 117.2413 -9771, 70.2814, 148.7963 -9772, 67.95765, 125.4817 -9773, 68.03122, 124.7968 -9774, 66.2195, 106.072 -9775, 70.60482, 134.8661 -9776, 67.43065, 130.2342 -9777, 65.90857, 122.1085 -9778, 72.47921, 138.4836 -9779, 66.5789, 116.9757 -9780, 67.04159, 128.5194 -9781, 65.89776, 139.6527 -9782, 66.02355, 104.0173 -9783, 70.6596, 131.0931 -9784, 69.32015, 133.3684 -9785, 68.46611, 118.6156 -9786, 68.1011, 118.9991 -9787, 69.10355, 131.272 -9788, 68.98767, 124.1313 -9789, 66.98612, 98.47799 -9790, 68.07886, 138.9164 -9791, 67.14062, 131.6581 -9792, 65.50185, 128.1924 -9793, 68.42655, 146.6355 -9794, 67.80423, 110.0665 -9795, 67.00515, 115.8675 -9796, 70.12939, 127.1045 -9797, 71.59767, 131.6252 -9798, 67.47799, 111.0157 -9799, 69.75215, 151.263 -9800, 70.2609, 124.2768 -9801, 68.46374, 128.6835 -9802, 66.49929, 113.3252 -9803, 68.77449, 147.9795 -9804, 67.53213, 132.3461 -9805, 71.32762, 132.2853 -9806, 69.54265, 132.2717 -9807, 68.84469, 137.642 -9808, 68.45131, 117.7085 -9809, 67.58396, 128.4773 -9810, 68.84619, 119.7516 -9811, 69.41444, 118.391 -9812, 69.85771, 120.8858 -9813, 66.09467, 115.8339 -9814, 68.69118, 118.5151 -9815, 66.91649, 120.891 -9816, 68.61516, 135.9551 -9817, 71.12975, 134.8375 -9818, 68.85924, 115.4611 -9819, 70.58611, 136.1071 -9820, 70.45602, 137.7117 -9821, 65.82729, 109.0839 -9822, 65.53454, 106.9057 -9823, 66.18249, 131.9705 -9824, 71.61882, 165.8716 -9825, 66.95769, 128.7377 -9826, 69.17434, 117.2939 -9827, 70.74903, 138.9422 -9828, 67.5619, 126.5968 -9829, 67.98909, 107.9762 -9830, 66.51309, 108.3641 -9831, 68.42597, 147.0716 -9832, 69.43903, 145.7242 -9833, 68.77366, 140.1915 -9834, 67.44207, 131.3793 -9835, 71.55011, 141.6604 -9836, 70.1884, 123.7339 -9837, 65.2831, 100.0283 -9838, 70.74713, 146.572 -9839, 69.73095, 145.2295 -9840, 68.86778, 126.558 -9841, 68.39148, 151.9512 -9842, 67.41403, 128.8079 -9843, 65.04265, 126.6868 -9844, 68.77248, 136.0577 -9845, 69.84344, 122.7778 -9846, 63.93049, 108.3559 -9847, 70.31106, 147.7541 -9848, 67.98819, 123.2582 -9849, 70.81754, 130.6455 -9850, 68.38637, 124.6679 -9851, 68.22631, 125.5255 -9852, 65.89874, 114.3292 -9853, 69.73748, 145.8184 -9854, 68.42911, 132.0335 -9855, 67.15172, 141.4995 -9856, 67.18709, 125.5079 -9857, 70.49324, 121.4159 -9858, 69.89967, 126.9552 -9859, 68.57785, 120.5832 -9860, 67.44754, 132.5691 -9861, 68.27063, 119.3592 -9862, 68.02518, 116.9769 -9863, 64.47165, 110.3828 -9864, 70.43528, 124.8658 -9865, 70.38848, 135.0006 -9866, 68.9876, 157.8304 -9867, 70.53, 145.5456 -9868, 70.77882, 123.2178 -9869, 68.03476, 131.787 -9870, 66.03888, 127.3603 -9871, 67.24661, 128.9941 -9872, 66.34444, 121.7823 -9873, 68.00358, 126.2625 -9874, 67.5354, 131.3948 -9875, 66.26621, 108.9546 -9876, 69.34812, 136.3244 -9877, 61.30021, 120.8819 -9878, 63.85336, 116.1584 -9879, 67.79112, 122.7668 -9880, 68.84082, 117.168 -9881, 67.23541, 128.9174 -9882, 72.0041, 138.0863 -9883, 69.37103, 127.227 -9884, 66.95564, 137.1765 -9885, 66.45619, 109.9414 -9886, 68.13655, 134.1517 -9887, 66.67832, 113.69 -9888, 69.28115, 141.7671 -9889, 70.62015, 140.458 -9890, 67.99465, 119.7749 -9891, 68.48033, 130.2865 -9892, 69.06455, 141.4252 -9893, 71.75345, 125.4749 -9894, 68.12333, 142.4333 -9895, 69.27301, 139.802 -9896, 70.6871, 132.7199 -9897, 71.59803, 118.0366 -9898, 69.19962, 132.039 -9899, 68.50734, 138.7054 -9900, 67.31358, 118.7559 -9901, 69.35559, 132.2083 -9902, 68.04018, 123.4858 -9903, 69.43599, 127.4407 -9904, 68.11666, 122.9518 -9905, 70.38735, 115.9033 -9906, 67.68927, 117.8434 -9907, 70.10753, 106.1532 -9908, 65.63803, 138.7008 -9909, 66.1331, 131.333 -9910, 67.98396, 139.0779 -9911, 70.00086, 145.8357 -9912, 68.77748, 138.6318 -9913, 69.55778, 136.8985 -9914, 69.64354, 141.6881 -9915, 67.51477, 122.6746 -9916, 66.32547, 109.4408 -9917, 68.11857, 123.5801 -9918, 68.95567, 139.0009 -9919, 69.47262, 159.961 -9920, 67.36852, 133.0522 -9921, 69.49484, 129.154 -9922, 65.21743, 130.2571 -9923, 66.44053, 126.5657 -9924, 67.4008, 111.4315 -9925, 70.05188, 136.1694 -9926, 70.47453, 165.815 -9927, 67.62136, 144.3461 -9928, 71.26378, 147.7777 -9929, 69.11384, 134.8827 -9930, 69.13058, 144.5313 -9931, 71.76731, 145.2951 -9932, 71.90517, 131.6109 -9933, 68.61716, 129.5184 -9934, 66.30375, 120.6304 -9935, 69.47578, 133.7738 -9936, 67.82661, 121.302 -9937, 66.40842, 127.5827 -9938, 69.29497, 140.665 -9939, 67.41872, 113.2182 -9940, 68.30044, 125.6614 -9941, 69.69323, 139.8444 -9942, 66.87896, 119.345 -9943, 67.917, 123.5503 -9944, 68.80858, 122.5048 -9945, 71.0785, 148.6654 -9946, 68.50032, 126.3782 -9947, 68.32165, 134.6888 -9948, 67.44148, 118.7423 -9949, 67.4694, 119.622 -9950, 68.57565, 144.6492 -9951, 69.90495, 131.2178 -9952, 69.06563, 133.1598 -9953, 66.36602, 101.9583 -9954, 68.08525, 137.6375 -9955, 69.76408, 132.5028 -9956, 68.09437, 122.4897 -9957, 67.77372, 120.8679 -9958, 73.1771, 162.3663 -9959, 70.8932, 137.9685 -9960, 66.59118, 133.313 -9961, 68.84406, 121.8554 -9962, 67.82525, 120.6637 -9963, 67.4964, 144.1456 -9964, 66.9367, 110.3082 -9965, 68.73832, 136.5058 -9966, 67.82175, 133.7939 -9967, 67.40266, 125.4416 -9968, 71.91481, 151.3634 -9969, 66.00315, 115.9391 -9970, 66.23591, 122.6684 -9971, 66.05033, 129.398 -9972, 68.59833, 131.3191 -9973, 66.73802, 146.5547 -9974, 68.95236, 130.8332 -9975, 66.8636, 134.6229 -9976, 63.54215, 106.5463 -9977, 68.29415, 126.4078 -9978, 67.18456, 155.58 -9979, 66.93941, 128.5959 -9980, 67.39381, 129.645 -9981, 70.10564, 137.8281 -9982, 67.00791, 114.4926 -9983, 68.00661, 112.832 -9984, 64.75128, 96.50653 -9985, 64.75712, 117.9964 -9986, 65.55869, 104.1268 -9987, 67.94061, 101.9043 -9988, 66.32718, 112.5542 -9989, 67.76335, 130.3666 -9990, 68.84705, 143.2721 -9991, 66.22794, 114.482 -9992, 67.33307, 131.244 -9993, 68.16808, 129.6398 -9994, 66.9724, 123.0562 -9995, 69.16053, 127.6593 -9996, 67.96769, 124.3206 -9997, 71.39143, 128.9603 -9998, 69.17936, 142.5122 -9999, 67.63262, 108.6316 -10000, 68.13844, 133.3492 -10001, 68.57515, 132.9664 -10002, 69.27082, 123.9376 -10003, 68.03694, 129.7161 -10004, 66.78394, 128.5766 -10005, 68.37086, 121.5928 -10006, 69.06702, 125.2812 -10007, 68.68835, 120.2494 -10008, 67.94587, 127.063 -10009, 69.97069, 130.5886 -10010, 67.83678, 130.1037 -10011, 66.57079, 122.6824 -10012, 69.93637, 136.028 -10013, 65.68971, 116.112 -10014, 68.09276, 136.1992 -10015, 68.51531, 149.8957 -10016, 68.66816, 129.1077 -10017, 70.74635, 128.3355 -10018, 68.93456, 134.2009 -10019, 64.55693, 115.8225 -10020, 66.63381, 110.4108 -10021, 66.02983, 125.4093 -10022, 71.83894, 128.1898 -10023, 69.11329, 132.1717 -10024, 68.72609, 126.9163 -10025, 67.67278, 140.825 -10026, 67.97403, 115.5281 -10027, 66.28867, 96.43706 -10028, 66.78936, 126.941 -10029, 70.42997, 130.1329 -10030, 67.34451, 128.3837 -10031, 66.55225, 115.0221 -10032, 67.54453, 116.9754 -10033, 67.11135, 121.9965 -10034, 66.39139, 120.8401 -10035, 70.1004, 143.8223 -10036, 66.29079, 129.0103 -10037, 66.82271, 122.2173 -10038, 68.81388, 141.3748 -10039, 70.7395, 118.7482 -10040, 68.56268, 110.8342 -10041, 66.80278, 110.5325 -10042, 64.49508, 109.748 -10043, 68.00244, 139.8746 -10044, 68.14281, 144.8232 -10045, 66.9929, 112.8264 -10046, 65.95458, 117.0548 -10047, 71.14826, 117.7951 -10048, 69.26366, 143.5924 -10049, 65.33361, 113.766 -10050, 68.07198, 139.8559 -10051, 68.75607, 127.0394 -10052, 68.25481, 122.3093 -10053, 67.6301, 126.2598 -10054, 66.76358, 116.2435 -10055, 68.44489, 122.5856 -10056, 68.6443, 137.6504 -10057, 69.7314, 144.728 -10058, 68.04736, 126.1972 -10059, 66.8011, 114.0278 -10060, 67.31382, 114.2178 -10061, 65.94149, 100.0924 -10062, 68.04148, 113.2556 -10063, 65.76389, 121.5449 -10064, 69.98217, 138.5123 -10065, 66.53339, 124.0166 -10066, 67.30571, 118.2689 -10067, 71.37779, 128.3741 -10068, 65.41261, 106.923 -10069, 69.9379, 127.7381 -10070, 70.94031, 129.7535 -10071, 66.48588, 135.3436 -10072, 70.59467, 122.6572 -10073, 69.26749, 134.6498 -10074, 68.01553, 120.2336 -10075, 67.48435, 133.4493 -10076, 66.64515, 124.0263 -10077, 66.25306, 109.1716 -10078, 70.78006, 119.5972 -10079, 67.46565, 126.6369 -10080, 67.95071, 147.4028 -10081, 67.32652, 116.3942 -10082, 65.49287, 130.1238 -10083, 67.64989, 127.9459 -10084, 66.4175, 137.3847 -10085, 68.52361, 118.6287 -10086, 70.9931, 139.3241 -10087, 68.27507, 121.744 -10088, 68.72072, 118.7503 -10089, 68.14922, 122.1772 -10090, 66.32895, 120.6915 -10091, 67.34775, 126.0878 -10092, 69.17835, 124.8283 -10093, 67.72085, 135.3916 -10094, 67.78477, 132.7538 -10095, 64.52209, 128.4876 -10096, 68.67602, 130.5971 -10097, 65.24442, 109.9482 -10098, 65.99271, 124.0657 -10099, 68.60453, 126.4562 -10100, 64.62503, 115.5461 -10101, 67.63678, 130.1742 -10102, 70.36634, 153.457 -10103, 68.7096, 143.9246 -10104, 66.73859, 128.1908 -10105, 65.80323, 121.9802 -10106, 65.01409, 133.769 -10107, 67.50667, 121.3548 -10108, 67.70298, 121.7608 -10109, 68.18064, 133.3395 -10110, 67.08054, 134.2481 -10111, 66.53602, 133.3901 -10112, 70.85159, 155.4236 -10113, 65.99732, 132.6291 -10114, 69.65644, 128.9009 -10115, 64.36495, 113.6952 -10116, 68.51561, 122.5108 -10117, 67.01001, 132.9762 -10118, 68.65082, 122.8115 -10119, 70.11761, 120.1837 -10120, 67.66432, 114.333 -10121, 67.54436, 117.0024 -10122, 69.24622, 135.6679 -10123, 64.70908, 119.9401 -10124, 67.77202, 118.5771 -10125, 67.88823, 138.9753 -10126, 69.54154, 125.8526 -10127, 69.92873, 127.9198 -10128, 69.47751, 135.3065 -10129, 67.55945, 127.4039 -10130, 67.83063, 132.731 -10131, 71.63342, 133.7823 -10132, 66.93561, 126.6451 -10133, 66.40984, 115.8011 -10134, 67.25458, 126.4183 -10135, 67.42176, 119.9688 -10136, 66.89243, 119.7186 -10137, 64.41136, 124.1027 -10138, 68.08186, 119.4421 -10139, 68.73489, 121.9388 -10140, 66.84196, 129.2855 -10141, 66.38618, 124.5214 -10142, 65.80415, 130.1618 -10143, 65.57517, 122.5124 -10144, 68.65405, 140.5776 -10145, 65.51063, 126.527 -10146, 70.83038, 133.8104 -10147, 65.4054, 129.794 -10148, 71.85374, 130.9334 -10149, 65.69257, 124.2145 -10150, 64.50068, 114.1913 -10151, 67.32663, 142.5938 -10152, 68.82231, 137.0983 -10153, 68.31438, 138.8053 -10154, 68.89476, 135.4686 -10155, 68.45037, 122.0752 -10156, 70.38299, 131.0126 -10157, 66.77655, 131.643 -10158, 70.61416, 127.9027 -10159, 67.99636, 150.304 -10160, 63.91795, 126.4849 -10161, 69.08168, 123.5754 -10162, 67.94687, 134.417 -10163, 66.41264, 141.9618 -10164, 68.4113, 114.6332 -10165, 69.17467, 132.8267 -10166, 68.80945, 126.7765 -10167, 67.98949, 130.0852 -10168, 67.47425, 120.9892 -10169, 69.37637, 140.4862 -10170, 66.7457, 119.6273 -10171, 71.81042, 146.3814 -10172, 68.49779, 128.8718 -10173, 66.22373, 124.7247 -10174, 68.48338, 127.7586 -10175, 67.48748, 129.8294 -10176, 66.80122, 124.956 -10177, 69.36031, 117.2519 -10178, 69.44113, 134.5996 -10179, 68.02891, 119.5087 -10180, 65.4401, 105.3289 -10181, 68.05522, 130.0591 -10182, 65.44861, 120.9266 -10183, 69.01128, 130.4463 -10184, 66.13501, 107.8115 -10185, 65.43462, 115.348 -10186, 67.70555, 121.7045 -10187, 72.00385, 126.9701 -10188, 68.22827, 122.7364 -10189, 67.97769, 132.02 -10190, 69.6181, 138.8191 -10191, 71.23192, 131.4701 -10192, 66.21527, 125.8998 -10193, 69.46816, 130.0392 -10194, 67.16775, 118.855 -10195, 67.92821, 140.6105 -10196, 68.02041, 120.0773 -10197, 63.16568, 101.9022 -10198, 67.43271, 113.1315 -10199, 67.57909, 148.2058 -10200, 69.34236, 130.11 -10201, 69.03935, 128.1055 -10202, 66.5898, 126.9651 -10203, 67.04732, 142.3191 -10204, 70.93771, 134.4353 -10205, 66.26707, 100.585 -10206, 66.61921, 121.9217 -10207, 68.54554, 123.1625 -10208, 71.27733, 126.1745 -10209, 68.28034, 122.7293 -10210, 70.04241, 149.3332 -10211, 68.7644, 123.3415 -10212, 70.09987, 135.2847 -10213, 70.42506, 136.6994 -10214, 66.84364, 119.8992 -10215, 70.89055, 138.6481 -10216, 71.60107, 138.3052 -10217, 65.51369, 130.2502 -10218, 66.99057, 106.9839 -10219, 68.35139, 112.8812 -10220, 67.39169, 131.0616 -10221, 68.985, 127.1889 -10222, 66.60289, 136.9817 -10223, 68.2832, 124.3849 -10224, 65.51929, 105.4043 -10225, 71.86969, 142.1276 -10226, 66.19577, 126.6438 -10227, 66.98863, 132.0612 -10228, 64.22788, 120.3019 -10229, 69.09806, 138.3934 -10230, 68.00458, 135.4125 -10231, 68.277, 135.3096 -10232, 71.698, 147.4595 -10233, 67.06982, 104.1591 -10234, 66.98454, 130.183 -10235, 70.71295, 170.924 -10236, 66.30287, 137.6953 -10237, 68.78265, 126.7758 -10238, 69.2984, 121.2638 -10239, 68.03691, 107.9584 -10240, 67.27286, 141.7463 -10241, 61.93152, 85.2904 -10242, 68.44672, 134.0838 -10243, 65.52171, 121.4215 -10244, 68.73061, 123.9749 -10245, 70.32188, 119.7992 -10246, 70.72616, 136.5876 -10247, 67.23886, 142.0396 -10248, 67.42973, 115.9108 -10249, 66.44447, 119.4981 -10250, 65.92998, 112.2153 -10251, 68.45982, 123.3502 -10252, 69.43594, 134.1796 -10253, 65.32774, 121.3348 -10254, 67.30054, 126.6744 -10255, 67.6736, 125.3719 -10256, 67.76707, 114.1675 -10257, 66.39375, 121.5455 -10258, 70.14848, 116.3663 -10259, 67.81882, 129.6804 -10260, 68.92743, 129.8436 -10261, 69.97517, 135.5642 -10262, 65.96101, 117.1969 -10263, 68.8375, 128.1107 -10264, 67.46994, 121.8602 -10265, 65.67254, 132.8915 -10266, 72.42515, 129.0739 -10267, 66.33452, 127.956 -10268, 68.16377, 145.4734 -10269, 68.80719, 142.8541 -10270, 67.89934, 117.397 -10271, 69.75835, 122.7009 -10272, 67.65443, 133.8413 -10273, 66.06129, 132.3972 -10274, 68.07253, 134.6856 -10275, 65.00025, 118.8709 -10276, 67.95845, 127.4662 -10277, 68.88694, 122.875 -10278, 65.41879, 120.3438 -10279, 68.1777, 120.0616 -10280, 70.3772, 126.5767 -10281, 68.11999, 116.4353 -10282, 68.35276, 124.8255 -10283, 69.42068, 131.768 -10284, 67.65704, 104.6366 -10285, 67.9709, 133.9997 -10286, 65.89416, 113.7654 -10287, 67.92834, 129.1861 -10288, 67.67419, 133.0796 -10289, 67.17717, 112.4891 -10290, 70.64743, 122.3352 -10291, 71.01751, 130.6425 -10292, 65.9993, 115.9772 -10293, 66.66578, 128.0432 -10294, 64.56593, 102.0383 -10295, 64.96159, 107.4868 -10296, 68.93317, 126.2217 -10297, 68.6422, 138.0343 -10298, 68.77736, 154.8517 -10299, 66.67804, 139.1714 -10300, 67.99234, 133.4281 -10301, 67.73219, 120.8693 -10302, 68.88114, 127.9823 -10303, 67.81179, 142.3762 -10304, 72.26487, 136.5009 -10305, 70.06893, 117.0553 -10306, 66.14966, 131.4211 -10307, 68.69605, 133.577 -10308, 68.47571, 131.9537 -10309, 68.37802, 119.9539 -10310, 68.87878, 119.3971 -10311, 65.80924, 112.8845 -10312, 69.2799, 152.5435 -10313, 67.01129, 127.7649 -10314, 68.20847, 112.9406 -10315, 68.68965, 134.1251 -10316, 66.05144, 119.3036 -10317, 69.09455, 127.3372 -10318, 68.86576, 112.7935 -10319, 67.87248, 127.7199 -10320, 67.02254, 114.1688 -10321, 64.26864, 112.2987 -10322, 69.22231, 127.7632 -10323, 69.18516, 115.089 -10324, 69.28583, 146.5881 -10325, 67.54616, 128.8973 -10326, 67.27501, 155.8189 -10327, 68.14682, 124.0938 -10328, 68.11154, 119.0578 -10329, 68.00907, 145.3193 -10330, 66.10884, 127.8689 -10331, 74.36328, 164.6643 -10332, 69.87349, 137.2025 -10333, 64.30282, 118.0081 -10334, 68.1745, 154.0079 -10335, 68.00916, 125.3284 -10336, 68.13485, 119.87 -10337, 66.8495, 110.174 -10338, 68.04704, 131.5455 -10339, 68.95045, 129.1584 -10340, 67.56709, 112.434 -10341, 66.34841, 109.9387 -10342, 67.87075, 135.8476 -10343, 67.06849, 118.8617 -10344, 67.23477, 114.1638 -10345, 69.6254, 131.1821 -10346, 66.96018, 134.7602 -10347, 68.90732, 144.3025 -10348, 71.60814, 144.5143 -10349, 65.20502, 118.2572 -10350, 67.72312, 123.8437 -10351, 65.36188, 117.1863 -10352, 71.26753, 125.0196 -10353, 65.11686, 117.0472 -10354, 71.23323, 145.6988 -10355, 66.98585, 109.8113 -10356, 68.98353, 127.9516 -10357, 67.07174, 126.4042 -10358, 69.87863, 141.4678 -10359, 66.15177, 111.9139 -10360, 67.17694, 120.6343 -10361, 66.65138, 111.267 -10362, 67.02613, 131.52 -10363, 69.05469, 134.6582 -10364, 70.30558, 130.5531 -10365, 69.15782, 137.8314 -10366, 67.70344, 108.9052 -10367, 68.77537, 138.0502 -10368, 68.18873, 127.1719 -10369, 67.00131, 129.8178 -10370, 72.68545, 124.1497 -10371, 67.1693, 126.4281 -10372, 68.52314, 146.2621 -10373, 65.75194, 116.2159 -10374, 69.40466, 127.6167 -10375, 67.27594, 131.5767 -10376, 66.33031, 118.3779 -10377, 66.81347, 121.6926 -10378, 68.20959, 128.8569 -10379, 66.85651, 105.9897 -10380, 68.28564, 123.0402 -10381, 68.86183, 134.6779 -10382, 70.22727, 120.4772 -10383, 68.51085, 125.3584 -10384, 68.12993, 108.1225 -10385, 67.45958, 133.6881 -10386, 67.95057, 132.93 -10387, 70.41003, 132.8924 -10388, 68.82861, 132.9931 -10389, 70.88474, 132.2668 -10390, 70.23488, 131.4445 -10391, 65.12636, 122.1146 -10392, 70.7406, 128.0491 -10393, 68.1794, 126.5975 -10394, 66.28166, 132.7775 -10395, 68.59748, 135.9033 -10396, 66.23597, 119.438 -10397, 67.42763, 112.0482 -10398, 70.93428, 134.7475 -10399, 68.2984, 121.2823 -10400, 66.51911, 135.1788 -10401, 67.50653, 126.2248 -10402, 71.31381, 144.7622 -10403, 67.86603, 137.0526 -10404, 68.4164, 127.039 -10405, 70.70831, 132.575 -10406, 67.2978, 98.74301 -10407, 66.98357, 120.0619 -10408, 65.73548, 135.6257 -10409, 63.46952, 109.7989 -10410, 72.31104, 152.7759 -10411, 66.5271, 126.2462 -10412, 65.98844, 129.6398 -10413, 65.54355, 114.8749 -10414, 69.63987, 126.6245 -10415, 69.35826, 133.0021 -10416, 67.58203, 107.7908 -10417, 70.18844, 131.0572 -10418, 67.913, 131.565 -10419, 65.9935, 116.3407 -10420, 68.45079, 127.9629 -10421, 67.8761, 132.2874 -10422, 68.20301, 122.2456 -10423, 68.02558, 121.6909 -10424, 70.11194, 130.6004 -10425, 69.95523, 145.4424 -10426, 70.2156, 147.6645 -10427, 70.92745, 129.8921 -10428, 64.90177, 111.0552 -10429, 65.83748, 120.8376 -10430, 67.36794, 131.8412 -10431, 65.16759, 127.1526 -10432, 65.57954, 121.4738 -10433, 69.5881, 128.133 -10434, 69.20122, 139.1962 -10435, 68.24975, 138.9947 -10436, 70.38081, 133.4191 -10437, 68.32966, 133.8127 -10438, 64.35599, 133.6729 -10439, 66.98202, 120.6984 -10440, 69.39666, 126.7731 -10441, 66.24724, 99.07691 -10442, 70.81716, 137.0278 -10443, 72.21471, 135.0052 -10444, 69.06657, 142.6149 -10445, 70.86115, 130.7419 -10446, 73.33584, 133.4109 -10447, 69.71521, 133.5603 -10448, 68.7218, 134.5512 -10449, 70.15159, 143.2453 -10450, 71.07028, 128.1241 -10451, 68.77062, 145.2039 -10452, 69.30497, 114.185 -10453, 69.12822, 147.1321 -10454, 68.91395, 132.5095 -10455, 67.71189, 129.3881 -10456, 63.00544, 116.1438 -10457, 68.7807, 128.5783 -10458, 63.02884, 96.47744 -10459, 68.89673, 136.2149 -10460, 66.21931, 132.252 -10461, 68.06832, 141.576 -10462, 67.57157, 128.3205 -10463, 66.11571, 136.9935 -10464, 66.22051, 106.2064 -10465, 64.08406, 111.7218 -10466, 66.77064, 108.8598 -10467, 67.33892, 133.2337 -10468, 65.75905, 140.6289 -10469, 69.00995, 141.837 -10470, 69.17655, 139.7818 -10471, 65.96052, 102.3802 -10472, 64.14294, 115.0981 -10473, 67.01845, 119.8016 -10474, 68.14749, 128.0245 -10475, 67.35561, 119.2536 -10476, 66.94659, 129.5847 -10477, 69.23785, 124.8157 -10478, 64.77966, 89.64885 -10479, 69.54866, 125.9774 -10480, 68.95676, 124.3441 -10481, 68.80266, 138.0014 -10482, 69.31999, 131.6757 -10483, 72.35849, 139.2038 -10484, 66.13184, 118.5572 -10485, 67.77688, 117.444 -10486, 68.65699, 107.8873 -10487, 67.91922, 131.6555 -10488, 70.34445, 131.6005 -10489, 71.06425, 152.8456 -10490, 68.3927, 123.4257 -10491, 66.79712, 131.5125 -10492, 64.93783, 103.7577 -10493, 70.14231, 117.884 -10494, 64.00875, 104.3435 -10495, 69.51978, 129.9665 -10496, 66.94273, 117.6676 -10497, 70.87794, 149.1428 -10498, 65.24649, 116.9904 -10499, 69.49131, 126.0984 -10500, 68.08959, 128.0709 -10501, 70.65463, 149.4745 -10502, 64.93386, 96.67888 -10503, 68.70534, 124.5106 -10504, 67.11498, 119.0296 -10505, 70.00068, 140.9303 -10506, 72.37892, 156.8464 -10507, 68.172, 115.1333 -10508, 67.24574, 135.0178 -10509, 66.04961, 127.901 -10510, 64.85955, 115.5248 -10511, 69.52955, 130.5978 -10512, 68.82408, 132.1751 -10513, 69.41921, 137.9209 -10514, 69.05841, 111.3935 -10515, 68.89369, 119.6711 -10516, 68.73216, 130.2555 -10517, 69.49069, 132.1774 -10518, 64.10059, 121.0721 -10519, 68.30462, 142.3127 -10520, 68.71525, 114.003 -10521, 65.69719, 107.6348 -10522, 68.09404, 115.4798 -10523, 66.51622, 135.7521 -10524, 68.52534, 133.3322 -10525, 69.20887, 135.9792 -10526, 67.70321, 120.999 -10527, 68.15955, 130.7498 -10528, 67.18814, 106.7904 -10529, 68.50904, 119.4901 -10530, 66.51943, 138.5418 -10531, 66.27868, 115.6044 -10532, 67.47904, 114.978 -10533, 67.17176, 134.8531 -10534, 70.21021, 141.9264 -10535, 66.48457, 113.2493 -10536, 67.38335, 139.6947 -10537, 69.63142, 147.2102 -10538, 69.05892, 145.238 -10539, 67.73576, 99.74502 -10540, 68.0427, 127.537 -10541, 70.50652, 143.0547 -10542, 68.61607, 122.2814 -10543, 70.54593, 142.2969 -10544, 65.89082, 118.0925 -10545, 71.21608, 157.4503 -10546, 68.20518, 114.4749 -10547, 67.74012, 138.1428 -10548, 66.26527, 110.327 -10549, 65.53319, 105.8284 -10550, 66.51322, 113.1916 -10551, 67.35638, 131.4344 -10552, 70.30591, 133.8064 -10553, 67.04142, 112.9803 -10554, 67.7369, 110.5975 -10555, 69.66034, 140.415 -10556, 69.98999, 148.9512 -10557, 66.79277, 127.3793 -10558, 66.00918, 133.9975 -10559, 66.62111, 130.0858 -10560, 69.74276, 132.0686 -10561, 66.16467, 131.0357 -10562, 70.20538, 132.2909 -10563, 68.60463, 135.4929 -10564, 70.62429, 111.8873 -10565, 66.94547, 119.7758 -10566, 70.34761, 121.937 -10567, 65.49205, 108.3441 -10568, 68.89339, 128.0101 -10569, 66.19965, 125.1485 -10570, 66.36441, 123.1231 -10571, 66.77807, 137.3777 -10572, 68.09728, 120.4912 -10573, 68.22134, 149.196 -10574, 70.09705, 139.6371 -10575, 72.1712, 128.1616 -10576, 68.84442, 143.5309 -10577, 69.66256, 136.6815 -10578, 68.7237, 132.2889 -10579, 65.52882, 129.2356 -10580, 70.69497, 127.5854 -10581, 67.00435, 119.8816 -10582, 67.55287, 121.7881 -10583, 68.9392, 118.0553 -10584, 66.89064, 129.4493 -10585, 66.87923, 132.1593 -10586, 69.27991, 130.8975 -10587, 68.63068, 112.5824 -10588, 66.02106, 134.9502 -10589, 67.31835, 126.3568 -10590, 70.64068, 121.9356 -10591, 66.5818, 131.6912 -10592, 66.24792, 126.2204 -10593, 65.96918, 126.7294 -10594, 66.08834, 130.1595 -10595, 68.74671, 126.0762 -10596, 68.38332, 152.4418 -10597, 64.73972, 122.4279 -10598, 68.56976, 135.6351 -10599, 67.50394, 124.7759 -10600, 69.83182, 132.6278 -10601, 66.93919, 131.6494 -10602, 67.87115, 117.8922 -10603, 66.38765, 127.8206 -10604, 66.71594, 114.609 -10605, 69.92883, 160.4871 -10606, 65.60065, 116.6834 -10607, 68.94104, 132.7443 -10608, 67.35421, 116.3161 -10609, 69.2689, 126.223 -10610, 64.78382, 124.4218 -10611, 69.00289, 131.0501 -10612, 67.94108, 149.5679 -10613, 69.77799, 127.8931 -10614, 68.26272, 127.9975 -10615, 68.02075, 131.2079 -10616, 69.04822, 113.5618 -10617, 67.98576, 137.0912 -10618, 63.50795, 114.8749 -10619, 69.56909, 127.9663 -10620, 69.10658, 119.2041 -10621, 69.17856, 134.1517 -10622, 67.06151, 120.7166 -10623, 70.89432, 131.7651 -10624, 69.36734, 137.5629 -10625, 66.55432, 124.5989 -10626, 68.00765, 129.6789 -10627, 67.29039, 115.1226 -10628, 66.88356, 118.4508 -10629, 73.22072, 137.0768 -10630, 66.95094, 128.8915 -10631, 65.93861, 117.8413 -10632, 68.06028, 98.9001 -10633, 65.9792, 140.0098 -10634, 69.32477, 138.604 -10635, 68.01965, 116.1544 -10636, 73.88574, 135.9816 -10637, 68.7284, 128.3036 -10638, 66.98669, 129.6223 -10639, 67.65185, 147.7052 -10640, 66.73298, 138.5239 -10641, 67.57886, 105.3225 -10642, 70.88703, 139.6806 -10643, 68.64071, 134.5343 -10644, 66.38501, 128.8816 -10645, 67.74524, 128.6228 -10646, 69.42469, 137.1312 -10647, 64.21102, 113.6698 -10648, 69.04355, 135.6615 -10649, 68.44013, 143.8953 -10650, 69.86939, 123.235 -10651, 67.27641, 112.1723 -10652, 69.26705, 121.2725 -10653, 65.83018, 129.2681 -10654, 66.56855, 129.3466 -10655, 66.89784, 137.6947 -10656, 69.58798, 113.665 -10657, 69.61101, 136.2898 -10658, 67.90062, 136.0332 -10659, 66.4422, 129.4758 -10660, 70.1338, 134.4689 -10661, 67.24137, 134.0858 -10662, 71.40024, 118.804 -10663, 68.81761, 116.5307 -10664, 66.00638, 120.3 -10665, 66.82919, 125.1578 -10666, 66.77789, 123.6758 -10667, 64.55809, 113.8706 -10668, 67.49962, 137.1728 -10669, 72.09703, 134.2724 -10670, 71.48656, 105.5331 -10671, 67.70221, 130.5761 -10672, 69.02373, 114.3528 -10673, 66.73813, 119.0173 -10674, 64.09479, 107.0877 -10675, 69.55031, 115.7306 -10676, 67.28152, 131.3143 -10677, 70.83864, 142.2989 -10678, 65.30751, 119.7157 -10679, 68.17705, 126.0792 -10680, 67.49175, 109.8464 -10681, 67.69924, 123.8695 -10682, 68.89262, 138.0155 -10683, 66.69777, 121.1209 -10684, 68.02164, 131.326 -10685, 72.32382, 130.0773 -10686, 67.89736, 119.9817 -10687, 65.94463, 100.5898 -10688, 68.43859, 137.938 -10689, 68.34332, 129.9947 -10690, 67.50727, 112.6174 -10691, 65.73491, 115.5253 -10692, 68.45227, 122.7969 -10693, 68.09452, 112.6967 -10694, 66.87642, 111.7273 -10695, 68.78042, 118.6681 -10696, 67.76232, 117.16 -10697, 66.92622, 133.9616 -10698, 70.4839, 122.8518 -10699, 66.90481, 126.6455 -10700, 67.21178, 155.0082 -10701, 67.93338, 119.7698 -10702, 69.36009, 138.4303 -10703, 67.2037, 129.3922 -10704, 66.11772, 113.1732 -10705, 68.87141, 141.5641 -10706, 72.13664, 129.6934 -10707, 66.47378, 121.8011 -10708, 67.44181, 136.2936 -10709, 66.45604, 133.1168 -10710, 64.93446, 113.589 -10711, 71.13511, 151.4674 -10712, 68.14569, 130.1973 -10713, 69.80663, 131.1705 -10714, 69.09198, 126.1547 -10715, 70.73962, 141.7215 -10716, 69.69246, 135.3223 -10717, 67.18323, 137.3825 -10718, 70.75638, 123.4866 -10719, 70.79804, 125.7816 -10720, 67.59872, 128.558 -10721, 69.14817, 153.3639 -10722, 68.47791, 137.359 -10723, 71.2696, 145.0339 -10724, 69.58091, 131.7444 -10725, 67.99813, 118.223 -10726, 67.12516, 126.1205 -10727, 66.94553, 118.117 -10728, 69.35076, 141.2216 -10729, 68.86773, 136.9215 -10730, 67.19725, 136.8241 -10731, 66.15149, 123.9501 -10732, 67.66962, 135.2617 -10733, 63.29618, 111.4056 -10734, 71.77485, 145.7175 -10735, 70.76918, 134.8925 -10736, 65.76134, 110.0183 -10737, 69.57368, 136.346 -10738, 69.7701, 111.5563 -10739, 71.90393, 141.4574 -10740, 71.83818, 139.7878 -10741, 69.74181, 124.4227 -10742, 65.40817, 122.8072 -10743, 69.73609, 152.6969 -10744, 68.05785, 115.7184 -10745, 65.56584, 101.7955 -10746, 68.58632, 121.2848 -10747, 70.5479, 121.361 -10748, 68.62838, 116.4417 -10749, 67.30469, 125.7158 -10750, 67.86793, 132.4746 -10751, 68.18436, 111.6939 -10752, 67.12433, 123.5312 -10753, 67.50781, 127.5459 -10754, 69.74866, 136.4338 -10755, 65.94502, 119.3141 -10756, 66.03597, 116.2143 -10757, 66.74873, 136.2302 -10758, 69.30449, 118.5162 -10759, 69.05283, 144.8074 -10760, 68.50867, 133.9436 -10761, 66.63013, 118.1453 -10762, 68.67406, 124.6569 -10763, 69.93061, 138.8325 -10764, 69.11316, 151.1101 -10765, 67.21939, 132.8338 -10766, 68.94888, 115.6681 -10767, 71.6822, 138.0712 -10768, 67.7161, 120.4559 -10769, 66.04065, 129.7117 -10770, 69.56767, 129.7364 -10771, 67.04789, 136.4177 -10772, 66.11294, 104.4748 -10773, 67.56696, 117.3571 -10774, 68.2101, 119.4079 -10775, 69.0425, 127.1652 -10776, 65.20788, 132.5724 -10777, 66.56896, 135.5198 -10778, 69.09239, 144.5847 -10779, 67.34629, 118.7027 -10780, 67.37558, 120.6235 -10781, 69.39824, 138.4163 -10782, 69.52151, 145.1544 -10783, 68.78586, 139.9157 -10784, 66.75113, 111.2522 -10785, 65.84981, 136.9029 -10786, 66.74378, 112.7127 -10787, 69.8469, 150.5891 -10788, 69.66479, 144.4128 -10789, 70.61706, 122.7131 -10790, 64.87192, 127.745 -10791, 68.09578, 123.5007 -10792, 64.12978, 125.8286 -10793, 69.1366, 152.2569 -10794, 70.70527, 133.3353 -10795, 66.38376, 115.6821 -10796, 66.95437, 128.1657 -10797, 69.3349, 131.2696 -10798, 67.6326, 123.7498 -10799, 68.67163, 112.0543 -10800, 66.97528, 133.7971 -10801, 69.32415, 118.631 -10802, 68.65077, 117.349 -10803, 69.52713, 130.0545 -10804, 67.5071, 120.5993 -10805, 68.41559, 130.557 -10806, 67.18894, 119.2439 -10807, 67.64362, 129.8738 -10808, 67.63143, 111.9499 -10809, 71.0885, 144.0961 -10810, 66.35595, 135.0814 -10811, 66.55633, 125.1865 -10812, 69.48096, 144.4402 -10813, 72.13324, 141.1153 -10814, 68.37214, 130.76 -10815, 65.24215, 107.3398 -10816, 68.35973, 122.4447 -10817, 67.12836, 123.7953 -10818, 70.71221, 129.5686 -10819, 70.10355, 147.6963 -10820, 69.91417, 128.8815 -10821, 67.03445, 118.5148 -10822, 68.48906, 135.0043 -10823, 62.50449, 126.834 -10824, 66.28271, 122.121 -10825, 71.18243, 147.7423 -10826, 64.96701, 118.9745 -10827, 66.83755, 119.1425 -10828, 69.31263, 143.318 -10829, 68.00003, 124.0098 -10830, 70.93041, 138.5522 -10831, 69.55078, 127.6665 -10832, 67.04168, 125.6018 -10833, 66.68499, 126.4684 -10834, 66.96568, 144.4394 -10835, 66.45649, 106.8881 -10836, 69.38291, 114.7144 -10837, 68.39972, 131.8536 -10838, 65.99324, 118.3222 -10839, 68.32092, 136.5044 -10840, 69.10337, 130.0111 -10841, 68.42546, 121.4558 -10842, 68.20753, 133.0912 -10843, 67.8287, 126.2769 -10844, 66.20781, 123.2416 -10845, 70.02744, 132.5108 -10846, 72.33837, 146.1178 -10847, 69.07669, 133.8041 -10848, 63.47989, 109.4272 -10849, 68.39232, 132.9664 -10850, 66.38785, 107.8609 -10851, 66.35839, 141.0786 -10852, 67.90974, 127.899 -10853, 67.99457, 135.2005 -10854, 69.33638, 116.2041 -10855, 67.60547, 134.3536 -10856, 67.39241, 118.188 -10857, 65.40662, 138.0298 -10858, 67.08266, 125.0373 -10859, 66.1459, 117.1214 -10860, 69.02208, 147.0445 -10861, 65.41424, 118.1839 -10862, 62.44899, 97.60294 -10863, 66.46524, 116.9524 -10864, 70.5789, 125.9388 -10865, 67.11866, 129.8029 -10866, 69.02602, 117.0323 -10867, 65.29178, 103.3172 -10868, 67.25249, 122.7412 -10869, 67.7796, 135.983 -10870, 70.45204, 127.5806 -10871, 71.466, 136.1768 -10872, 67.65154, 114.2668 -10873, 67.83536, 133.7095 -10874, 67.38724, 124.5322 -10875, 67.91087, 122.5197 -10876, 65.85116, 119.9984 -10877, 70.53984, 145.7572 -10878, 65.54683, 127.3529 -10879, 66.72193, 124.4206 -10880, 68.08321, 142.2061 -10881, 69.15879, 133.4787 -10882, 66.47756, 121.2549 -10883, 64.37265, 111.2446 -10884, 72.18026, 145.5891 -10885, 69.04682, 141.238 -10886, 66.6879, 132.1882 -10887, 67.05403, 116.8532 -10888, 66.72188, 114.0862 -10889, 67.90779, 121.8853 -10890, 70.29567, 135.9697 -10891, 70.14594, 155.0147 -10892, 64.90698, 106.2489 -10893, 68.15533, 155.6542 -10894, 69.76311, 132.7484 -10895, 65.19432, 125.919 -10896, 68.60431, 130.8794 -10897, 68.31467, 139.5657 -10898, 69.28143, 124.0809 -10899, 66.72096, 120.1462 -10900, 66.2546, 136.0814 -10901, 70.41851, 126.6505 -10902, 69.15107, 122.1065 -10903, 65.90954, 119.7513 -10904, 68.92271, 123.6162 -10905, 68.88487, 130.892 -10906, 64.58076, 150.6921 -10907, 66.58124, 120.6348 -10908, 65.38313, 115.8133 -10909, 68.45964, 104.5201 -10910, 68.08292, 106.1436 -10911, 67.98588, 124.5469 -10912, 65.43668, 96.64915 -10913, 68.35283, 145.9472 -10914, 69.59921, 141.6018 -10915, 67.76728, 122.9415 -10916, 66.54611, 128.5828 -10917, 67.40557, 129.7861 -10918, 71.61858, 150.7782 -10919, 69.78806, 140.5096 -10920, 65.46436, 108.0159 -10921, 69.84842, 146.8392 -10922, 67.59114, 126.3141 -10923, 65.39097, 130.7129 -10924, 69.16565, 114.3258 -10925, 70.8537, 139.41 -10926, 69.64932, 137.3018 -10927, 69.75493, 121.4986 -10928, 67.29615, 126.7282 -10929, 68.00311, 103.2192 -10930, 68.23844, 123.0584 -10931, 69.10888, 139.3881 -10932, 69.16784, 132.2421 -10933, 67.40236, 107.6678 -10934, 66.97412, 115.914 -10935, 68.14213, 149.2678 -10936, 65.77882, 111.7485 -10937, 68.86055, 123.2045 -10938, 68.54418, 125.2815 -10939, 66.24232, 123.1627 -10940, 66.05281, 116.5253 -10941, 66.78253, 124.9536 -10942, 68.22373, 105.4156 -10943, 70.81098, 149.8862 -10944, 67.51193, 126.031 -10945, 68.7292, 144.2782 -10946, 69.03442, 137.2801 -10947, 66.69993, 127.0516 -10948, 67.66684, 137.4976 -10949, 70.04342, 156.4566 -10950, 70.71417, 128.557 -10951, 67.21338, 129.1064 -10952, 69.51067, 139.2973 -10953, 64.84702, 99.24033 -10954, 72.42524, 134.8079 -10955, 69.204, 117.0954 -10956, 70.63329, 144.9647 -10957, 70.21055, 122.4646 -10958, 70.91114, 134.6232 -10959, 67.6791, 111.4813 -10960, 68.51935, 127.5446 -10961, 67.49054, 125.2224 -10962, 70.94239, 127.097 -10963, 68.22454, 140.903 -10964, 67.8618, 122.2685 -10965, 65.79765, 104.3895 -10966, 66.93034, 119.7403 -10967, 65.2842, 114.2336 -10968, 69.92925, 124.9368 -10969, 71.99579, 120.0237 -10970, 67.26327, 114.2686 -10971, 65.66178, 113.5902 -10972, 66.50243, 131.9956 -10973, 67.66008, 144.2397 -10974, 71.24889, 136.9907 -10975, 64.63061, 121.5164 -10976, 69.61857, 133.2628 -10977, 64.98777, 136.4346 -10978, 70.80755, 132.1319 -10979, 67.21426, 105.3348 -10980, 69.62967, 124.178 -10981, 69.67729, 138.7077 -10982, 66.84127, 121.048 -10983, 67.95575, 138.3578 -10984, 67.91859, 103.1035 -10985, 68.29201, 110.3958 -10986, 70.71797, 131.3595 -10987, 68.38443, 143.1785 -10988, 66.02316, 113.8072 -10989, 66.51135, 110.2655 -10990, 68.05802, 110.1398 -10991, 68.09044, 126.9757 -10992, 67.63946, 114.1426 -10993, 68.35095, 126.1809 -10994, 66.916, 111.5822 -10995, 68.87816, 120.9969 -10996, 68.03941, 137.2248 -10997, 71.01294, 131.4479 -10998, 70.58233, 140.0745 -10999, 63.17217, 127.2456 -11000, 69.78974, 145.0778 -11001, 65.67569, 123.1591 -11002, 66.51317, 126.2002 -11003, 68.91807, 132.491 -11004, 67.54731, 105.6248 -11005, 67.16725, 117.6846 -11006, 70.30407, 138.4226 -11007, 67.94455, 118.7549 -11008, 70.17937, 134.815 -11009, 68.84277, 123.0811 -11010, 68.97817, 138.3514 -11011, 67.87172, 144.6941 -11012, 68.30452, 122.0263 -11013, 71.59581, 147.0324 -11014, 70.97786, 149.5895 -11015, 67.04114, 121.5026 -11016, 69.75259, 140.9001 -11017, 69.34609, 145.7199 -11018, 68.47204, 131.8399 -11019, 66.46867, 126.7618 -11020, 71.68515, 121.8591 -11021, 67.58847, 118.7126 -11022, 64.62583, 111.3351 -11023, 68.08467, 120.0023 -11024, 69.04082, 110.3399 -11025, 71.47469, 140.2681 -11026, 68.29856, 127.8518 -11027, 66.48835, 118.2103 -11028, 67.65551, 118.4708 -11029, 69.55965, 130.298 -11030, 68.07654, 109.852 -11031, 69.53635, 116.8769 -11032, 66.55122, 116.5006 -11033, 71.81797, 139.7074 -11034, 69.15297, 126.3293 -11035, 67.38721, 135.5659 -11036, 64.94889, 113.0076 -11037, 68.1155, 136.263 -11038, 67.87942, 118.7067 -11039, 71.15678, 153.5749 -11040, 69.55755, 119.7754 -11041, 67.32935, 133.2197 -11042, 67.03618, 121.7936 -11043, 67.08475, 132.8759 -11044, 68.1142, 123.9844 -11045, 67.25607, 124.3161 -11046, 68.93456, 134.6034 -11047, 70.99654, 137.4312 -11048, 66.66773, 130.2486 -11049, 67.14848, 124.8785 -11050, 68.01276, 119.6507 -11051, 68.37466, 113.7195 -11052, 67.63132, 127.4093 -11053, 68.78129, 130.9664 -11054, 67.4519, 109.2884 -11055, 69.05692, 129.9515 -11056, 71.58656, 151.926 -11057, 71.00215, 133.315 -11058, 65.48034, 115.4925 -11059, 64.84197, 106.4034 -11060, 67.77064, 142.9326 -11061, 68.789, 120.5641 -11062, 67.73549, 122.7611 -11063, 67.28621, 133.0996 -11064, 69.14033, 131.7311 -11065, 63.68432, 113.8885 -11066, 66.48606, 123.3001 -11067, 66.82771, 133.2493 -11068, 65.74972, 106.1128 -11069, 70.15496, 132.2557 -11070, 68.03163, 124.7543 -11071, 68.73994, 136.6091 -11072, 66.67274, 105.848 -11073, 70.44164, 143.7073 -11074, 65.21801, 107.4109 -11075, 69.18892, 110.2616 -11076, 65.7164, 123.6866 -11077, 68.20774, 124.8594 -11078, 65.6085, 122.0489 -11079, 66.99553, 105.2913 -11080, 70.96623, 131.4938 -11081, 64.28708, 99.82706 -11082, 63.60355, 122.3891 -11083, 65.05165, 118.8598 -11084, 67.83126, 121.3917 -11085, 65.8442, 122.9715 -11086, 68.81007, 136.9345 -11087, 69.08438, 127.0724 -11088, 67.94823, 120.2966 -11089, 69.52463, 129.9461 -11090, 67.97769, 144.7071 -11091, 64.96741, 109.2457 -11092, 65.55484, 129.2687 -11093, 68.0052, 117.0722 -11094, 68.62033, 139.7228 -11095, 69.17078, 131.3516 -11096, 68.50566, 124.308 -11097, 67.40238, 137.9187 -11098, 65.09312, 135.5254 -11099, 68.9391, 137.8963 -11100, 69.19971, 138.739 -11101, 68.16393, 131.1518 -11102, 69.91225, 150.7507 -11103, 66.13776, 112.7742 -11104, 65.84225, 135.3841 -11105, 66.51608, 132.3072 -11106, 65.39554, 129.0537 -11107, 68.35417, 135.2684 -11108, 65.85458, 146.8202 -11109, 66.08547, 126.153 -11110, 69.56261, 130.0292 -11111, 68.54207, 137.6653 -11112, 71.27061, 124.2243 -11113, 66.03755, 129.0106 -11114, 68.42545, 124.8365 -11115, 69.56302, 130.9521 -11116, 69.77139, 143.4356 -11117, 70.26466, 123.3935 -11118, 70.02833, 133.9895 -11119, 69.23495, 131.8937 -11120, 67.75034, 118.8212 -11121, 65.59472, 110.1066 -11122, 69.77645, 149.6136 -11123, 69.46001, 145.2864 -11124, 68.43554, 135.4124 -11125, 67.05033, 114.3176 -11126, 66.57575, 127.931 -11127, 66.15214, 128.4151 -11128, 69.05944, 136.7033 -11129, 66.27918, 138.907 -11130, 67.25881, 135.2798 -11131, 67.83695, 127.7505 -11132, 65.96984, 130.823 -11133, 64.81822, 116.6434 -11134, 68.43412, 145.7155 -11135, 67.49384, 113.4681 -11136, 69.01647, 137.0928 -11137, 68.57292, 117.2929 -11138, 67.87708, 123.0777 -11139, 68.99385, 131.2152 -11140, 66.69195, 108.4437 -11141, 65.30731, 118.1043 -11142, 67.63371, 127.8296 -11143, 67.76547, 127.0117 -11144, 69.46199, 124.0249 -11145, 69.137, 123.3187 -11146, 70.76924, 140.8299 -11147, 69.74567, 113.057 -11148, 70.86609, 144.0689 -11149, 67.96674, 148.2726 -11150, 68.52434, 120.6406 -11151, 70.47887, 133.3292 -11152, 68.13987, 133.8585 -11153, 67.62197, 96.74634 -11154, 67.40406, 134.0505 -11155, 70.70493, 144.4624 -11156, 67.0114, 119.1376 -11157, 70.72181, 125.5266 -11158, 65.0906, 113.8999 -11159, 71.66102, 140.5407 -11160, 69.64489, 119.1443 -11161, 66.06372, 140.0926 -11162, 69.53887, 133.4508 -11163, 66.72469, 130.7197 -11164, 69.14268, 161.3014 -11165, 68.47042, 122.3227 -11166, 68.56545, 125.885 -11167, 70.33392, 140.3581 -11168, 64.83586, 128.4784 -11169, 67.00076, 133.8422 -11170, 67.61172, 132.1716 -11171, 69.2627, 122.9415 -11172, 68.05574, 125.929 -11173, 67.01389, 114.5908 -11174, 74.16797, 142.7732 -11175, 67.46023, 123.9729 -11176, 66.59883, 140.0618 -11177, 65.20591, 114.1975 -11178, 69.12252, 143.4608 -11179, 69.04489, 125.9477 -11180, 67.23588, 134.934 -11181, 66.53866, 124.4463 -11182, 69.2864, 139.5923 -11183, 67.22009, 133.8821 -11184, 68.40132, 109.7327 -11185, 68.52054, 130.0861 -11186, 66.77642, 148.078 -11187, 70.20339, 137.6673 -11188, 67.77726, 138.0438 -11189, 65.15073, 99.8475 -11190, 68.77137, 129.1743 -11191, 70.98235, 127.8665 -11192, 67.44011, 138.8552 -11193, 67.5907, 137.1565 -11194, 68.09234, 122.353 -11195, 68.58477, 119.8123 -11196, 63.92414, 94.96925 -11197, 67.13792, 126.5541 -11198, 67.96822, 131.4434 -11199, 67.40732, 117.0252 -11200, 70.08201, 142.9877 -11201, 67.77124, 119.2235 -11202, 69.15034, 127.5277 -11203, 67.00199, 137.932 -11204, 69.23248, 132.5571 -11205, 67.98002, 129.1731 -11206, 67.20279, 102.0226 -11207, 68.98976, 124.2182 -11208, 68.5983, 126.5379 -11209, 66.25204, 146.6106 -11210, 63.77589, 127.3544 -11211, 67.96185, 125.154 -11212, 66.16809, 111.7997 -11213, 68.50417, 131.5771 -11214, 67.70934, 136.3176 -11215, 63.33119, 112.6251 -11216, 70.0918, 139.5179 -11217, 68.30094, 134.7177 -11218, 66.46884, 138.402 -11219, 68.88676, 127.648 -11220, 69.38352, 122.0678 -11221, 69.00483, 137.6559 -11222, 70.05784, 116.6165 -11223, 65.10116, 123.1258 -11224, 71.15266, 130.5181 -11225, 67.87661, 108.9897 -11226, 66.02093, 127.3182 -11227, 67.78396, 114.3916 -11228, 69.83424, 118.4764 -11229, 66.39018, 108.4403 -11230, 67.72204, 116.2668 -11231, 67.0671, 110.0552 -11232, 70.70367, 135.5553 -11233, 70.03981, 138.4753 -11234, 68.47663, 138.7668 -11235, 69.2047, 140.5522 -11236, 65.23394, 112.5476 -11237, 68.89622, 144.4723 -11238, 71.20184, 146.1089 -11239, 73.45384, 142.0065 -11240, 64.68783, 129.2138 -11241, 66.5181, 97.54695 -11242, 66.56509, 111.3128 -11243, 67.75376, 105.9587 -11244, 62.91681, 123.054 -11245, 65.18677, 111.6079 -11246, 66.5578, 116.3412 -11247, 71.6577, 143.3796 -11248, 64.46785, 118.9773 -11249, 66.28272, 112.249 -11250, 68.42883, 119.7445 -11251, 69.38397, 123.9979 -11252, 65.31926, 120.0737 -11253, 68.66193, 123.2477 -11254, 65.97339, 115.6794 -11255, 69.51667, 129.7024 -11256, 68.22985, 122.1816 -11257, 69.83, 136.8307 -11258, 63.61518, 107.139 -11259, 67.99998, 136.646 -11260, 66.89939, 144.4917 -11261, 68.73884, 133.8346 -11262, 69.17398, 139.6385 -11263, 70.58871, 131.6732 -11264, 67.8682, 119.9805 -11265, 68.39892, 134.7468 -11266, 67.88895, 121.1382 -11267, 64.38742, 116.0245 -11268, 66.96466, 129.3706 -11269, 65.86538, 128.5607 -11270, 65.82647, 122.1977 -11271, 70.51289, 138.8583 -11272, 70.42931, 125.3635 -11273, 66.10171, 118.9452 -11274, 65.46048, 131.205 -11275, 70.91162, 140.5079 -11276, 68.69449, 127.6927 -11277, 71.75246, 149.9238 -11278, 64.82819, 143.4204 -11279, 66.6091, 109.1462 -11280, 67.779, 133.1513 -11281, 66.56978, 128.282 -11282, 68.13511, 115.708 -11283, 68.51757, 119.3005 -11284, 68.07689, 121.7782 -11285, 70.14804, 133.7709 -11286, 70.35962, 144.1309 -11287, 67.58689, 118.6697 -11288, 65.03137, 125.7451 -11289, 67.36342, 127.2779 -11290, 65.76034, 109.628 -11291, 67.10885, 122.7538 -11292, 68.75557, 143.1601 -11293, 70.97344, 129.3743 -11294, 65.26892, 127.3683 -11295, 65.66247, 131.7569 -11296, 66.53827, 113.4029 -11297, 66.90975, 128.4934 -11298, 69.51623, 131.5506 -11299, 66.61461, 114.4853 -11300, 71.62343, 119.7512 -11301, 70.05513, 123.5191 -11302, 67.48898, 125.501 -11303, 68.36694, 104.503 -11304, 69.26121, 129.5221 -11305, 67.87778, 130.2365 -11306, 63.20626, 116.3739 -11307, 69.67947, 134.5489 -11308, 67.37164, 124.1367 -11309, 67.66896, 114.7549 -11310, 67.71607, 111.9589 -11311, 67.58095, 136.4722 -11312, 68.11599, 117.5179 -11313, 68.93673, 144.2782 -11314, 67.62937, 120.1249 -11315, 65.94814, 121.1693 -11316, 69.25978, 134.5615 -11317, 65.95706, 128.8891 -11318, 67.99681, 130.7289 -11319, 67.76218, 137.1791 -11320, 66.67503, 122.4975 -11321, 66.98501, 125.9014 -11322, 67.45441, 131.5585 -11323, 66.42304, 127.2729 -11324, 67.08303, 128.7227 -11325, 66.55348, 110.5548 -11326, 66.76286, 139.0637 -11327, 68.62482, 147.0216 -11328, 67.54028, 126.4595 -11329, 68.83293, 131.422 -11330, 67.36371, 116.3804 -11331, 68.47048, 133.9893 -11332, 67.35037, 132.3045 -11333, 68.10823, 125.0725 -11334, 68.51138, 131.3701 -11335, 68.68777, 114.4842 -11336, 66.79129, 121.9002 -11337, 67.79664, 115.3191 -11338, 68.8252, 137.6658 -11339, 66.59959, 127.6122 -11340, 65.16559, 121.0852 -11341, 68.93245, 127.1722 -11342, 69.16312, 132.6592 -11343, 69.49148, 121.6419 -11344, 66.46241, 132.0125 -11345, 69.93643, 141.8868 -11346, 68.58906, 118.2895 -11347, 65.72053, 127.1461 -11348, 67.94094, 104.2896 -11349, 68.11806, 131.5896 -11350, 69.43335, 140.3956 -11351, 68.95852, 130.0709 -11352, 68.00487, 92.95851 -11353, 65.62079, 100.0969 -11354, 69.52389, 118.3399 -11355, 64.75006, 108.3967 -11356, 70.17871, 121.1313 -11357, 68.68662, 148.4892 -11358, 65.90203, 109.0414 -11359, 67.41875, 122.7271 -11360, 68.51834, 125.1308 -11361, 70.02573, 158.5864 -11362, 68.74884, 129.8334 -11363, 69.46722, 120.5883 -11364, 67.36649, 125.7361 -11365, 68.23045, 140.7733 -11366, 67.9815, 125.7448 -11367, 68.72434, 123.4432 -11368, 71.81276, 136.7116 -11369, 63.63521, 101.8813 -11370, 67.11628, 139.6614 -11371, 67.51086, 114.2835 -11372, 69.88008, 124.5219 -11373, 66.37702, 105.9248 -11374, 67.77136, 126.5531 -11375, 67.01918, 131.7105 -11376, 66.55379, 126.9896 -11377, 66.72728, 111.0062 -11378, 69.10831, 139.2123 -11379, 70.36453, 128.2677 -11380, 66.25151, 131.1318 -11381, 67.61697, 107.4615 -11382, 67.69783, 120.3788 -11383, 66.46549, 117.7681 -11384, 67.59571, 130.1581 -11385, 70.4309, 134.4154 -11386, 65.11059, 97.59535 -11387, 67.47219, 135.7524 -11388, 66.65897, 113.2162 -11389, 64.2838, 126.9371 -11390, 68.47012, 127.5937 -11391, 66.25226, 117.278 -11392, 68.30287, 137.5881 -11393, 70.01965, 130.8984 -11394, 66.94063, 132.4786 -11395, 65.36655, 132.6127 -11396, 66.4126, 114.6091 -11397, 68.26581, 125.0861 -11398, 68.2852, 118.9217 -11399, 67.42465, 141.9674 -11400, 63.37186, 115.6628 -11401, 69.72835, 123.179 -11402, 66.38974, 94.80076 -11403, 69.55925, 131.0935 -11404, 69.54116, 117.8275 -11405, 67.83505, 121.0242 -11406, 68.22833, 143.0423 -11407, 68.45736, 132.6294 -11408, 67.01063, 120.9344 -11409, 67.58458, 147.5025 -11410, 67.11171, 111.7266 -11411, 66.05492, 120.0749 -11412, 65.65432, 121.643 -11413, 67.09664, 148.0281 -11414, 68.93253, 109.7752 -11415, 67.50893, 112.6096 -11416, 67.88135, 142.5829 -11417, 70.51084, 130.5145 -11418, 68.07978, 140.6775 -11419, 69.61803, 131.27 -11420, 65.53941, 121.7807 -11421, 66.70491, 134.6241 -11422, 68.82601, 115.8979 -11423, 70.60592, 135.8761 -11424, 67.08397, 124.4171 -11425, 67.58198, 138.0321 -11426, 67.32686, 105.214 -11427, 67.85523, 132.0323 -11428, 66.15898, 146.9268 -11429, 67.95819, 124.9584 -11430, 65.16544, 129.9676 -11431, 69.54452, 146.005 -11432, 66.35121, 121.1278 -11433, 68.26571, 136.2651 -11434, 70.29475, 130.4589 -11435, 68.02599, 142.3053 -11436, 65.53207, 118.0806 -11437, 70.76347, 150.6201 -11438, 65.3266, 123.7902 -11439, 66.51846, 130.4262 -11440, 66.29182, 129.1751 -11441, 66.16228, 125.6023 -11442, 67.97724, 134.5728 -11443, 66.47067, 105.241 -11444, 67.51785, 136.9115 -11445, 69.16624, 135.3094 -11446, 70.0874, 131.5153 -11447, 68.02869, 123.587 -11448, 67.82592, 133.6891 -11449, 67.61981, 104.6315 -11450, 65.9637, 130.3269 -11451, 67.72006, 103.2679 -11452, 67.48496, 91.91782 -11453, 68.24513, 128.9407 -11454, 67.35061, 135.0216 -11455, 68.18075, 135.0446 -11456, 70.672, 124.9177 -11457, 66.81834, 126.3595 -11458, 68.75229, 126.7573 -11459, 67.35564, 126.2663 -11460, 66.95961, 129.0322 -11461, 67.73721, 111.3459 -11462, 67.64532, 140.2121 -11463, 65.21358, 124.1369 -11464, 65.1571, 131.4201 -11465, 67.40133, 122.2223 -11466, 67.65074, 137.8933 -11467, 63.8874, 114.223 -11468, 66.85228, 124.4828 -11469, 65.93881, 125.8178 -11470, 65.07901, 121.0964 -11471, 68.66259, 138.6358 -11472, 66.63069, 144.0267 -11473, 68.1916, 121.9667 -11474, 64.72033, 119.4164 -11475, 67.76005, 129.9217 -11476, 67.78329, 126.7556 -11477, 68.09923, 126.4184 -11478, 69.21335, 128.8556 -11479, 67.75819, 137.4614 -11480, 70.39946, 134.2599 -11481, 65.93766, 127.9704 -11482, 66.11839, 127.0232 -11483, 66.01019, 115.0187 -11484, 71.63081, 135.4107 -11485, 66.62993, 144.5351 -11486, 68.48521, 90.53995 -11487, 68.10699, 129.2909 -11488, 70.27703, 134.3019 -11489, 69.75105, 126.0679 -11490, 68.98237, 115.8649 -11491, 65.64452, 125.3238 -11492, 68.91636, 124.459 -11493, 66.61896, 132.9899 -11494, 68.60604, 125.6796 -11495, 67.30725, 123.1893 -11496, 70.75095, 135.5127 -11497, 67.58887, 124.922 -11498, 64.50132, 123.3747 -11499, 73.27528, 142.7375 -11500, 68.25937, 129.5475 -11501, 67.91946, 118.9415 -11502, 67.31071, 112.7087 -11503, 67.7966, 137.8801 -11504, 71.29452, 144.6277 -11505, 68.27275, 115.1205 -11506, 66.86544, 104.0809 -11507, 67.73325, 106.3248 -11508, 70.2269, 146.4763 -11509, 69.62197, 133.916 -11510, 67.48527, 109.9157 -11511, 68.09415, 131.2306 -11512, 66.09287, 147.1966 -11513, 67.42801, 128.0001 -11514, 69.08861, 111.019 -11515, 65.70473, 119.4562 -11516, 66.52344, 134.9003 -11517, 68.67632, 115.3375 -11518, 68.36099, 131.3844 -11519, 66.34405, 114.0256 -11520, 65.46233, 101.7174 -11521, 65.38562, 92.82921 -11522, 70.29342, 131.0869 -11523, 66.81702, 107.4364 -11524, 67.09018, 126.1098 -11525, 69.10457, 137.515 -11526, 68.6582, 126.1272 -11527, 67.69463, 129.6272 -11528, 69.41766, 135.0258 -11529, 64.90194, 123.585 -11530, 66.4883, 136.8641 -11531, 71.09216, 123.2561 -11532, 71.94657, 134.3756 -11533, 68.15531, 137.0752 -11534, 68.32479, 124.3728 -11535, 70.93105, 119.3693 -11536, 62.55787, 105.7505 -11537, 68.72459, 133.1973 -11538, 68.56969, 123.2818 -11539, 70.70114, 129.2904 -11540, 67.2195, 134.9439 -11541, 69.42099, 145.046 -11542, 65.2954, 122.5997 -11543, 67.5127, 127.4652 -11544, 68.61443, 130.1691 -11545, 68.23227, 129.3011 -11546, 69.06606, 124.9616 -11547, 67.76769, 132.9052 -11548, 67.19954, 131.7003 -11549, 66.19999, 111.3766 -11550, 67.15817, 124.6763 -11551, 65.80976, 119.5688 -11552, 68.72661, 148.7831 -11553, 71.01527, 115.5961 -11554, 70.3378, 122.886 -11555, 66.60132, 117.6958 -11556, 66.10835, 118.365 -11557, 65.54454, 125.6417 -11558, 67.08775, 139.4027 -11559, 70.91229, 151.9319 -11560, 70.05033, 135.0001 -11561, 67.91474, 130.4542 -11562, 70.44997, 140.0553 -11563, 69.43277, 112.1645 -11564, 70.69946, 131.2794 -11565, 69.62487, 120.4721 -11566, 70.95555, 134.9733 -11567, 69.55239, 154.2355 -11568, 66.67652, 116.072 -11569, 68.94487, 136.0275 -11570, 69.06771, 126.5166 -11571, 68.68065, 113.9339 -11572, 69.75765, 118.3588 -11573, 65.74407, 112.5993 -11574, 69.90579, 118.7813 -11575, 67.49642, 144.7324 -11576, 71.55734, 146.4177 -11577, 68.87168, 132.5791 -11578, 67.23421, 117.092 -11579, 68.63376, 119.0942 -11580, 68.65065, 118.3285 -11581, 66.63756, 135.3268 -11582, 67.87931, 113.0279 -11583, 65.95049, 144.2777 -11584, 69.46751, 118.2912 -11585, 65.32821, 107.3803 -11586, 66.76294, 121.2519 -11587, 68.5428, 117.004 -11588, 68.91044, 142.8254 -11589, 68.84368, 150.6553 -11590, 73.38937, 136.7121 -11591, 66.86841, 116.4109 -11592, 67.52516, 107.2826 -11593, 68.13449, 121.8903 -11594, 68.39998, 129.8416 -11595, 68.75545, 141.6232 -11596, 71.22681, 118.0369 -11597, 69.02697, 118.4175 -11598, 69.36506, 149.4627 -11599, 71.48858, 139.2446 -11600, 70.03975, 139.38 -11601, 65.86983, 115.7434 -11602, 64.18612, 112.8632 -11603, 68.22537, 119.4641 -11604, 67.57609, 126.8161 -11605, 68.32838, 125.0752 -11606, 69.7812, 146.0231 -11607, 64.60544, 98.10936 -11608, 69.35659, 137.7401 -11609, 65.08819, 129.1596 -11610, 67.25428, 125.3354 -11611, 67.29744, 111.402 -11612, 69.06367, 128.8616 -11613, 70.66513, 132.245 -11614, 66.34245, 136.4106 -11615, 66.88466, 133.7811 -11616, 69.83988, 132.9299 -11617, 68.64288, 108.615 -11618, 68.78708, 142.8921 -11619, 68.36723, 127.2684 -11620, 71.12176, 119.0967 -11621, 68.55132, 118.0137 -11622, 71.18105, 147.7838 -11623, 68.32621, 125.1014 -11624, 66.83958, 117.8889 -11625, 69.20216, 144.7944 -11626, 66.77853, 128.7692 -11627, 66.4406, 118.4163 -11628, 69.02771, 136.656 -11629, 65.99368, 145.7856 -11630, 68.21133, 126.3564 -11631, 68.81559, 105.3418 -11632, 69.54378, 136.0772 -11633, 67.04297, 120.8592 -11634, 69.61676, 121.0389 -11635, 69.11044, 136.6009 -11636, 64.55954, 123.4204 -11637, 65.79362, 132.5145 -11638, 68.99934, 125.0189 -11639, 66.16092, 137.0073 -11640, 64.3685, 110.0215 -11641, 69.87282, 124.8993 -11642, 66.0047, 116.8211 -11643, 68.96687, 121.3857 -11644, 67.76358, 142.8913 -11645, 67.2019, 118.5255 -11646, 67.67049, 138.3916 -11647, 65.94121, 121.8284 -11648, 62.62398, 113.6392 -11649, 68.6687, 148.4025 -11650, 64.99303, 134.3959 -11651, 70.14061, 133.8105 -11652, 67.33278, 111.0307 -11653, 71.15018, 127.3908 -11654, 68.05094, 123.1092 -11655, 70.68057, 122.0871 -11656, 66.92683, 132.5142 -11657, 67.32022, 121.7055 -11658, 65.96371, 126.1179 -11659, 66.36048, 131.4652 -11660, 70.09062, 141.6373 -11661, 66.77067, 114.939 -11662, 68.7819, 128.8125 -11663, 68.06198, 125.1513 -11664, 66.87471, 124.1839 -11665, 64.991, 120.5915 -11666, 64.24525, 119.3337 -11667, 64.62759, 117.0906 -11668, 67.47845, 125.0172 -11669, 68.38035, 120.3051 -11670, 67.9413, 140.2045 -11671, 69.38765, 120.404 -11672, 69.72585, 141.0221 -11673, 64.85369, 140.5568 -11674, 71.14569, 144.9609 -11675, 67.93166, 116.703 -11676, 65.8737, 130.7339 -11677, 65.27492, 120.7876 -11678, 64.36283, 122.0425 -11679, 66.53787, 116.5946 -11680, 69.52399, 133.0562 -11681, 69.13837, 139.6702 -11682, 67.67203, 123.8558 -11683, 68.95441, 141.2783 -11684, 71.04477, 140.3705 -11685, 71.39529, 149.7633 -11686, 66.54494, 127.3852 -11687, 68.28091, 136.24 -11688, 67.50144, 139.3232 -11689, 68.29474, 133.1216 -11690, 70.15135, 125.669 -11691, 69.41645, 135.8714 -11692, 69.36098, 123.6386 -11693, 67.16252, 130.6726 -11694, 68.53052, 125.4746 -11695, 69.64804, 116.6893 -11696, 66.68536, 116.2552 -11697, 65.89405, 114.064 -11698, 67.96456, 118.3278 -11699, 64.66704, 113.2242 -11700, 67.83132, 131.1598 -11701, 69.37264, 132.3018 -11702, 64.63475, 122.2873 -11703, 68.45736, 121.5602 -11704, 63.66412, 121.3552 -11705, 68.23574, 134.2459 -11706, 69.90933, 145.0568 -11707, 66.34353, 119.2517 -11708, 71.08621, 131.099 -11709, 69.29874, 113.3891 -11710, 69.26027, 136.8925 -11711, 68.3563, 136.5469 -11712, 68.82059, 134.8073 -11713, 67.11847, 123.4971 -11714, 70.16349, 136.7408 -11715, 67.31192, 139.7817 -11716, 65.99526, 117.9879 -11717, 70.32862, 133.2887 -11718, 66.35638, 130.9393 -11719, 65.46699, 113.0275 -11720, 67.06126, 114.7648 -11721, 69.37876, 133.7697 -11722, 68.55299, 132.1181 -11723, 64.28602, 117.6389 -11724, 66.98559, 124.8642 -11725, 68.3511, 129.34 -11726, 70.92088, 138.3304 -11727, 65.62372, 122.5121 -11728, 67.60294, 131.5862 -11729, 65.45098, 109.587 -11730, 65.9003, 124.6232 -11731, 69.28348, 142.1931 -11732, 69.00879, 142.8201 -11733, 69.72132, 127.0407 -11734, 68.26773, 136.2919 -11735, 65.26077, 107.3359 -11736, 66.6262, 136.8962 -11737, 68.5705, 121.4571 -11738, 71.51468, 139.7799 -11739, 67.97982, 121.0927 -11740, 68.26653, 134.6471 -11741, 66.37001, 133.1274 -11742, 65.56004, 114.0317 -11743, 68.20536, 128.2957 -11744, 70.14549, 138.6955 -11745, 66.01422, 114.0106 -11746, 65.59692, 127.598 -11747, 66.31345, 109.8002 -11748, 70.52695, 151.5058 -11749, 65.76106, 113.6272 -11750, 69.682, 135.5456 -11751, 68.90157, 141.6732 -11752, 63.87521, 128.004 -11753, 69.44937, 144.3768 -11754, 70.3846, 166.7687 -11755, 69.16422, 138.4332 -11756, 71.0881, 151.926 -11757, 64.77026, 106.4436 -11758, 69.03944, 115.6827 -11759, 68.3332, 121.3881 -11760, 67.65971, 131.6348 -11761, 65.95743, 129.7027 -11762, 68.25092, 114.8441 -11763, 70.46955, 127.5134 -11764, 69.87183, 154.5964 -11765, 70.761, 128.8214 -11766, 67.36771, 123.046 -11767, 68.31548, 114.5312 -11768, 65.10293, 133.1303 -11769, 65.23562, 107.844 -11770, 70.83969, 136.9762 -11771, 68.39903, 129.656 -11772, 68.20073, 118.2019 -11773, 66.94098, 139.2128 -11774, 66.07977, 131.8414 -11775, 63.36659, 123.006 -11776, 68.65857, 126.6649 -11777, 67.37221, 137.1801 -11778, 68.43509, 136.8554 -11779, 66.22392, 122.5205 -11780, 71.65466, 141.219 -11781, 66.69573, 125.1122 -11782, 66.8559, 122.1614 -11783, 68.02755, 134.7933 -11784, 67.70778, 122.2427 -11785, 63.85135, 120.1494 -11786, 69.93291, 133.902 -11787, 65.84544, 129.7101 -11788, 66.74059, 135.5989 -11789, 66.49611, 132.8285 -11790, 68.53937, 136.0357 -11791, 68.24023, 126.5821 -11792, 70.03063, 139.0857 -11793, 67.70792, 122.902 -11794, 67.72492, 117.4035 -11795, 68.84977, 133.9518 -11796, 68.71268, 126.3643 -11797, 68.0793, 130.2869 -11798, 68.30545, 131.6604 -11799, 70.86867, 126.5751 -11800, 68.31463, 113.4925 -11801, 67.62648, 110.1234 -11802, 71.14779, 142.3998 -11803, 67.34629, 107.1787 -11804, 66.62532, 120.6675 -11805, 66.68854, 122.4703 -11806, 69.90665, 159.966 -11807, 65.51279, 108.7832 -11808, 67.47262, 117.2175 -11809, 66.25672, 116.7766 -11810, 68.30086, 127.6778 -11811, 68.31294, 138.8446 -11812, 68.45399, 108.1145 -11813, 68.64421, 140.159 -11814, 65.31594, 106.6611 -11815, 68.32665, 139.0646 -11816, 69.77082, 136.0617 -11817, 66.20932, 133.0581 -11818, 68.43401, 119.8631 -11819, 65.25387, 116.2822 -11820, 71.7355, 162.0943 -11821, 67.76721, 148.8833 -11822, 70.51655, 141.3628 -11823, 70.4336, 136.7627 -11824, 64.25671, 114.8728 -11825, 69.37609, 128.0026 -11826, 71.07934, 134.5151 -11827, 71.70178, 124.1645 -11828, 67.3987, 111.3275 -11829, 63.62986, 113.608 -11830, 67.13345, 116.9574 -11831, 68.70886, 129.1443 -11832, 67.71809, 123.3103 -11833, 67.72767, 128.2164 -11834, 70.07335, 132.9222 -11835, 64.20874, 124.7975 -11836, 70.10636, 114.9911 -11837, 65.16199, 110.9849 -11838, 68.53018, 125.2053 -11839, 69.79457, 131.1487 -11840, 67.28489, 105.2101 -11841, 69.49036, 129.6225 -11842, 65.42646, 111.7143 -11843, 66.31501, 105.8468 -11844, 65.73484, 104.5094 -11845, 71.30941, 152.3587 -11846, 70.22624, 147.9016 -11847, 68.04495, 130.2388 -11848, 70.27278, 138.2409 -11849, 66.97106, 135.2028 -11850, 68.55277, 123.7852 -11851, 66.17403, 118.887 -11852, 71.37583, 143.3104 -11853, 68.1764, 130.5409 -11854, 66.28408, 142.1004 -11855, 68.15962, 113.7851 -11856, 70.00181, 137.8272 -11857, 65.30659, 129.8103 -11858, 65.67376, 120.5005 -11859, 68.92178, 119.6501 -11860, 67.6359, 140.8418 -11861, 67.91694, 119.803 -11862, 67.48812, 130.9508 -11863, 69.30675, 115.0445 -11864, 67.86395, 132.5698 -11865, 65.71274, 124.7391 -11866, 67.33136, 126.6475 -11867, 69.31735, 122.5178 -11868, 67.52153, 136.845 -11869, 67.79825, 120.662 -11870, 69.26416, 131.5304 -11871, 66.49667, 109.7068 -11872, 66.038, 110.9574 -11873, 68.29789, 116.7817 -11874, 69.05551, 130.8969 -11875, 65.0319, 133.1258 -11876, 69.31651, 138.9581 -11877, 66.21304, 128.8419 -11878, 66.18026, 122.4841 -11879, 68.86646, 120.4853 -11880, 67.86276, 148.8508 -11881, 67.17639, 121.491 -11882, 66.17, 112.3456 -11883, 69.25778, 118.8957 -11884, 72.80628, 150.9784 -11885, 67.49802, 145.0319 -11886, 68.53323, 106.9801 -11887, 67.72701, 110.8524 -11888, 67.403, 123.071 -11889, 70.97371, 137.9285 -11890, 65.88602, 127.0234 -11891, 64.69625, 116.2922 -11892, 65.07999, 107.0743 -11893, 67.33598, 107.7602 -11894, 67.17823, 120.969 -11895, 68.2152, 122.5298 -11896, 68.27877, 120.1926 -11897, 70.32072, 125.2459 -11898, 68.84149, 118.773 -11899, 65.41384, 127.5122 -11900, 66.90698, 122.5176 -11901, 66.92565, 109.6505 -11902, 72.16852, 125.865 -11903, 67.58419, 124.551 -11904, 71.05097, 139.1868 -11905, 68.65329, 121.3343 -11906, 71.13818, 125.2209 -11907, 69.83064, 113.8154 -11908, 69.24294, 128.4726 -11909, 70.80795, 148.2193 -11910, 71.4514, 142.4792 -11911, 68.34795, 137.6452 -11912, 66.96807, 123.2171 -11913, 67.35193, 135.7481 -11914, 66.3123, 119.4157 -11915, 68.38857, 153.2032 -11916, 68.72186, 120.7069 -11917, 64.6156, 124.8206 -11918, 71.04385, 149.3598 -11919, 65.5576, 112.7 -11920, 71.7762, 137.0197 -11921, 67.66805, 129.1137 -11922, 70.38662, 113.1486 -11923, 65.05914, 117.2483 -11924, 69.29376, 144.4311 -11925, 68.92487, 123.064 -11926, 73.23153, 140.2285 -11927, 67.98518, 122.4877 -11928, 66.02174, 106.7391 -11929, 62.50806, 121.7353 -11930, 67.11208, 124.9627 -11931, 67.2525, 131.7284 -11932, 66.86219, 107.2551 -11933, 66.11034, 111.458 -11934, 69.21797, 134.1583 -11935, 66.86285, 109.4149 -11936, 66.72363, 103.4764 -11937, 67.91114, 123.3007 -11938, 70.15546, 129.1033 -11939, 65.1448, 108.0862 -11940, 69.16116, 125.1179 -11941, 69.14544, 144.9626 -11942, 66.79109, 114.8214 -11943, 68.56128, 127.5046 -11944, 67.77908, 120.1861 -11945, 65.8903, 108.1277 -11946, 64.91798, 117.1005 -11947, 65.51983, 115.2811 -11948, 70.39488, 121.3756 -11949, 68.71595, 120.2871 -11950, 69.40879, 142.2191 -11951, 63.95804, 93.96913 -11952, 68.49986, 131.1487 -11953, 65.03967, 114.2779 -11954, 67.09578, 123.9914 -11955, 70.39063, 119.3835 -11956, 69.13445, 124.7073 -11957, 69.81349, 127.3314 -11958, 67.15358, 107.2308 -11959, 66.3247, 110.6354 -11960, 67.2547, 133.9845 -11961, 67.30359, 114.8441 -11962, 68.31411, 126.3453 -11963, 66.84937, 121.8716 -11964, 66.02415, 111.5549 -11965, 69.15659, 122.1897 -11966, 68.93022, 109.462 -11967, 66.03322, 102.562 -11968, 67.12476, 120.4642 -11969, 70.94314, 133.0277 -11970, 67.95293, 137.02 -11971, 68.2514, 152.4285 -11972, 69.5022, 126.022 -11973, 72.63806, 146.3356 -11974, 67.81132, 131.4317 -11975, 71.26903, 166.1956 -11976, 67.11464, 124.0268 -11977, 67.08781, 117.2354 -11978, 66.62197, 140.1115 -11979, 69.37986, 139.854 -11980, 65.72499, 112.01 -11981, 68.05531, 108.54 -11982, 71.06203, 142.837 -11983, 67.01009, 135.9007 -11984, 67.96128, 130.9758 -11985, 69.62918, 143.2022 -11986, 71.18686, 128.6857 -11987, 67.21088, 125.6535 -11988, 69.75744, 138.2061 -11989, 67.93962, 108.2722 -11990, 64.2564, 119.722 -11991, 70.57913, 130.738 -11992, 70.59481, 124.6141 -11993, 69.45839, 148.5158 -11994, 65.57668, 125.7709 -11995, 67.43466, 136.0448 -11996, 69.5304, 133.8402 -11997, 68.71379, 124.41 -11998, 64.83136, 127.0468 -11999, 66.67627, 127.5915 -12000, 67.08247, 118.982 -12001, 69.6942, 113.0169 -12002, 71.94501, 119.7111 -12003, 67.08849, 124.6879 -12004, 66.61029, 125.0603 -12005, 67.39237, 119.2096 -12006, 71.22979, 137.0453 -12007, 68.9821, 126.0012 -12008, 66.29932, 109.1158 -12009, 67.58579, 120.2176 -12010, 69.47049, 140.8544 -12011, 67.6955, 119.0652 -12012, 68.41184, 125.8553 -12013, 66.40097, 137.5308 -12014, 65.84222, 117.4226 -12015, 65.60355, 119.848 -12016, 68.17426, 124.7243 -12017, 68.15865, 143.2579 -12018, 70.33009, 106.6697 -12019, 64.96481, 107.2662 -12020, 70.00114, 142.0097 -12021, 73.12757, 132.9793 -12022, 69.52659, 129.1657 -12023, 65.93632, 114.5142 -12024, 68.30593, 138.0436 -12025, 69.21721, 139.1741 -12026, 69.04623, 126.3741 -12027, 66.51131, 122.9418 -12028, 68.41765, 122.2372 -12029, 67.20049, 119.9224 -12030, 70.56953, 138.8804 -12031, 67.02131, 120.5036 -12032, 60.86977, 108.8633 -12033, 69.59968, 133.8641 -12034, 66.90576, 125.7039 -12035, 65.4273, 104.4564 -12036, 65.45238, 118.7077 -12037, 66.18847, 114.58 -12038, 69.48939, 130.0937 -12039, 67.59082, 110.7189 -12040, 69.67, 119.2428 -12041, 71.81069, 132.4703 -12042, 70.21365, 139.1803 -12043, 64.64602, 111.6086 -12044, 65.31384, 123.2647 -12045, 69.30209, 143.2325 -12046, 67.21984, 126.4004 -12047, 67.89698, 105.7861 -12048, 66.44468, 128.4753 -12049, 66.30217, 125.448 -12050, 66.29508, 123.2967 -12051, 71.81034, 120.6109 -12052, 63.62293, 130.8869 -12053, 70.64303, 135.5782 -12054, 70.85476, 131.1407 -12055, 69.81498, 141.8795 -12056, 66.1487, 120.3851 -12057, 71.03088, 146.4631 -12058, 66.13556, 114.9154 -12059, 65.64932, 132.7519 -12060, 68.58104, 133.0067 -12061, 67.22079, 145.6399 -12062, 66.40365, 123.1849 -12063, 68.52532, 125.7403 -12064, 69.32648, 119.6727 -12065, 65.36659, 116.2944 -12066, 69.04615, 133.2845 -12067, 71.37994, 141.1697 -12068, 67.13772, 110.8047 -12069, 67.3967, 124.7118 -12070, 63.83814, 110.9801 -12071, 68.25068, 132.5773 -12072, 66.36931, 115.305 -12073, 70.85914, 137.5541 -12074, 67.20268, 119.3535 -12075, 65.63288, 113.8987 -12076, 71.2199, 143.6782 -12077, 67.34903, 113.7846 -12078, 67.8991, 110.5785 -12079, 65.07971, 133.4616 -12080, 69.51681, 128.293 -12081, 66.2851, 111.2819 -12082, 69.68337, 134.4863 -12083, 69.65526, 151.1571 -12084, 67.96292, 133.2323 -12085, 71.32203, 140.7135 -12086, 69.05447, 138.7171 -12087, 67.94235, 131.865 -12088, 68.32092, 127.3932 -12089, 69.87217, 129.7374 -12090, 66.83557, 137.7577 -12091, 70.46217, 154.0255 -12092, 67.69032, 133.0156 -12093, 69.10601, 133.5459 -12094, 70.29157, 128.9032 -12095, 70.35631, 116.5879 -12096, 67.3204, 106.7376 -12097, 71.18881, 145.0456 -12098, 65.71934, 130.1984 -12099, 67.40796, 120.6435 -12100, 65.05988, 111.5235 -12101, 68.22719, 108.8273 -12102, 69.53688, 135.964 -12103, 69.94726, 125.3808 -12104, 66.26851, 119.7967 -12105, 66.05849, 118.3292 -12106, 64.25245, 109.5647 -12107, 68.5623, 130.1006 -12108, 67.73521, 119.7671 -12109, 69.59796, 141.5493 -12110, 67.46095, 123.7306 -12111, 68.62535, 111.0908 -12112, 71.25126, 142.7636 -12113, 67.24688, 126.8263 -12114, 67.55773, 125.1369 -12115, 68.57922, 112.0673 -12116, 67.45327, 124.3866 -12117, 72.5565, 145.2378 -12118, 69.50107, 122.6854 -12119, 70.01967, 134.8425 -12120, 67.2572, 132.8406 -12121, 65.22247, 118.3554 -12122, 72.80624, 139.7892 -12123, 69.13179, 117.918 -12124, 67.43053, 121.0933 -12125, 67.28059, 131.4824 -12126, 70.001, 138.0392 -12127, 64.33997, 106.0198 -12128, 67.26735, 124.0488 -12129, 69.17724, 130.3436 -12130, 66.7465, 106.6506 -12131, 69.03417, 148.2146 -12132, 68.34615, 133.4005 -12133, 66.00974, 106.4586 -12134, 69.21559, 134.4881 -12135, 67.07331, 130.6017 -12136, 70.63793, 130.712 -12137, 67.24595, 135.5243 -12138, 68.10686, 117.8123 -12139, 66.90742, 111.9697 -12140, 70.15059, 158.4821 -12141, 71.65992, 136.2884 -12142, 66.80315, 125.755 -12143, 67.04952, 106.7259 -12144, 70.5931, 130.7728 -12145, 65.84071, 122.6521 -12146, 68.79573, 116.2171 -12147, 68.12082, 138.7471 -12148, 64.31209, 135.5388 -12149, 67.99862, 128.5274 -12150, 68.44172, 126.6112 -12151, 71.00788, 143.4924 -12152, 64.07458, 121.5426 -12153, 66.81797, 117.2431 -12154, 68.00128, 137.5348 -12155, 65.46423, 124.8913 -12156, 67.39722, 129.1587 -12157, 66.27501, 100.1148 -12158, 69.6573, 140.3259 -12159, 67.86229, 122.4027 -12160, 68.5617, 121.4645 -12161, 66.77693, 130.2914 -12162, 62.89638, 120.599 -12163, 67.09047, 118.2317 -12164, 67.9903, 114.796 -12165, 70.70392, 130.7639 -12166, 67.82304, 134.663 -12167, 67.15786, 114.8141 -12168, 65.92163, 115.4548 -12169, 70.02526, 125.8528 -12170, 71.12524, 140.4603 -12171, 62.74696, 126.8135 -12172, 68.94674, 140.2945 -12173, 65.25058, 127.0436 -12174, 67.14245, 120.5611 -12175, 68.68723, 130.8492 -12176, 68.62073, 145.2174 -12177, 68.11324, 116.5409 -12178, 66.86238, 119.1125 -12179, 65.40349, 101.3363 -12180, 66.2707, 103.4722 -12181, 66.86583, 116.1746 -12182, 71.66678, 134.8888 -12183, 68.00017, 125.8476 -12184, 68.66882, 139.4216 -12185, 70.35973, 129.0875 -12186, 67.76052, 131.0901 -12187, 69.21882, 134.1076 -12188, 67.74631, 105.6764 -12189, 64.15971, 129.8562 -12190, 67.62334, 110.6548 -12191, 67.89328, 117.09 -12192, 65.48471, 129.224 -12193, 68.32528, 103.4745 -12194, 68.2654, 143.7801 -12195, 72.42057, 144.387 -12196, 66.91696, 123.0398 -12197, 69.43684, 137.6724 -12198, 68.85114, 133.1969 -12199, 68.37809, 122.8097 -12200, 66.05187, 130.5855 -12201, 71.2338, 125.9994 -12202, 67.45676, 108.6551 -12203, 67.2524, 153.3825 -12204, 68.11876, 124.9622 -12205, 70.95119, 140.1531 -12206, 66.29131, 130.8994 -12207, 70.1926, 135.1047 -12208, 67.35325, 134.6156 -12209, 64.46167, 135.8058 -12210, 70.85183, 143.2765 -12211, 64.58449, 122.8244 -12212, 67.11487, 128.9426 -12213, 68.2263, 127.832 -12214, 67.15835, 127.2791 -12215, 66.82518, 132.5872 -12216, 69.46473, 119.5371 -12217, 67.51664, 125.0381 -12218, 67.11773, 118.6122 -12219, 69.12468, 136.3269 -12220, 69.29808, 118.53 -12221, 66.9325, 127.2762 -12222, 70.25476, 131.7454 -12223, 69.99264, 148.4428 -12224, 68.38126, 127.1378 -12225, 69.74475, 139.2463 -12226, 70.44609, 123.8717 -12227, 66.91785, 118.0017 -12228, 64.7893, 122.4913 -12229, 71.65016, 134.6808 -12230, 65.12654, 114.3412 -12231, 68.05579, 127.2138 -12232, 65.79014, 125.9146 -12233, 66.94808, 132.2477 -12234, 65.67741, 121.675 -12235, 69.03795, 108.3441 -12236, 69.86852, 151.5482 -12237, 64.77588, 113.1183 -12238, 70.23879, 127.2366 -12239, 67.63708, 124.7167 -12240, 67.51121, 138.459 -12241, 67.82751, 112.3725 -12242, 70.58388, 156.3417 -12243, 69.66437, 133.6791 -12244, 66.28256, 108.6047 -12245, 65.37604, 123.3283 -12246, 70.65344, 138.4873 -12247, 71.38739, 144.9405 -12248, 69.36593, 124.3237 -12249, 69.67527, 148.3828 -12250, 70.3007, 143.818 -12251, 65.16553, 115.8163 -12252, 68.33872, 132.5597 -12253, 68.38456, 123.041 -12254, 65.55581, 115.654 -12255, 70.17992, 121.6342 -12256, 67.31808, 123.3304 -12257, 68.58594, 115.2254 -12258, 72.37217, 134.1157 -12259, 70.20267, 156.1811 -12260, 68.39107, 116.6836 -12261, 70.2734, 152.4301 -12262, 69.0748, 138.6826 -12263, 68.4253, 125.4829 -12264, 66.13668, 132.1366 -12265, 67.85165, 122.8117 -12266, 66.95818, 114.1717 -12267, 65.98578, 115.7531 -12268, 67.95387, 123.3642 -12269, 66.27293, 117.9091 -12270, 68.52896, 127.998 -12271, 68.2623, 127.3359 -12272, 66.34027, 114.5888 -12273, 69.37304, 137.1683 -12274, 65.26199, 122.0038 -12275, 68.70917, 119.6392 -12276, 65.52726, 123.7422 -12277, 67.69321, 124.275 -12278, 68.9238, 136.1853 -12279, 66.1141, 113.5469 -12280, 68.06372, 127.6532 -12281, 67.59091, 116.9586 -12282, 68.92378, 121.6715 -12283, 69.89731, 148.2053 -12284, 66.99788, 114.555 -12285, 68.16828, 133.9443 -12286, 68.43843, 115.666 -12287, 67.78708, 122.3734 -12288, 69.60158, 121.3371 -12289, 68.25161, 123.1813 -12290, 66.41627, 98.73281 -12291, 68.20539, 116.9375 -12292, 69.21756, 129.3186 -12293, 64.0896, 109.3183 -12294, 66.27351, 127.1996 -12295, 65.67844, 101.6524 -12296, 68.19255, 138.3676 -12297, 69.44838, 137.7202 -12298, 67.19421, 103.7516 -12299, 67.12478, 116.941 -12300, 64.54169, 125.1319 -12301, 69.53675, 141.507 -12302, 67.2357, 122.1695 -12303, 67.95026, 129.204 -12304, 67.426, 126.447 -12305, 67.28909, 122.0906 -12306, 64.99608, 136.7717 -12307, 65.43867, 130.2553 -12308, 68.24171, 120.773 -12309, 67.04762, 119.6362 -12310, 66.53415, 112.9701 -12311, 68.88695, 121.8495 -12312, 67.83407, 138.1722 -12313, 66.37759, 123.5915 -12314, 65.36769, 119.7125 -12315, 70.68318, 135.8685 -12316, 65.49411, 141.3237 -12317, 67.91316, 121.3794 -12318, 70.79802, 126.3383 -12319, 68.51827, 128.0545 -12320, 67.47969, 126.4347 -12321, 65.24066, 123.3877 -12322, 64.32772, 118.5248 -12323, 70.41288, 152.7421 -12324, 66.6237, 115.2339 -12325, 65.90593, 108.2655 -12326, 66.52769, 112.5525 -12327, 69.31461, 126.7857 -12328, 62.87739, 103.6848 -12329, 68.92071, 130.7199 -12330, 66.13747, 108.3422 -12331, 69.99833, 122.5223 -12332, 68.46595, 138.7703 -12333, 69.25966, 133.9125 -12334, 69.93628, 128.1196 -12335, 67.01834, 123.4636 -12336, 69.77194, 130.8096 -12337, 68.65212, 139.4811 -12338, 68.44554, 111.1441 -12339, 67.88896, 118.4146 -12340, 68.68925, 121.2378 -12341, 65.56401, 105.3675 -12342, 69.20112, 139.431 -12343, 68.41482, 134.6557 -12344, 69.09655, 123.0012 -12345, 68.9416, 128.8854 -12346, 67.9139, 127.2376 -12347, 68.29377, 134.5271 -12348, 66.32216, 134.3075 -12349, 68.20057, 126.9387 -12350, 69.63237, 145.2524 -12351, 68.33465, 117.3751 -12352, 69.88231, 143.9678 -12353, 67.11991, 115.2308 -12354, 70.53097, 125.8404 -12355, 67.83481, 135.7228 -12356, 68.8196, 128.3999 -12357, 68.0312, 125.4532 -12358, 69.03316, 134.1379 -12359, 67.26332, 126.7256 -12360, 66.39875, 135.3503 -12361, 64.7363, 109.3803 -12362, 69.25052, 111.9038 -12363, 69.50292, 146.6922 -12364, 68.11694, 128.3326 -12365, 69.37864, 126.2731 -12366, 66.1219, 115.3591 -12367, 65.43542, 127.2422 -12368, 70.94749, 144.8983 -12369, 65.68418, 114.6552 -12370, 68.70422, 131.8082 -12371, 68.3036, 136.9984 -12372, 71.1963, 141.1763 -12373, 68.57603, 141.8451 -12374, 70.22202, 128.7039 -12375, 67.08514, 119.7705 -12376, 65.68889, 120.9908 -12377, 67.51772, 125.2817 -12378, 70.30046, 138.3313 -12379, 68.71184, 119.1353 -12380, 69.11819, 133.7623 -12381, 65.66806, 122.5953 -12382, 64.35738, 104.8098 -12383, 69.50005, 135.985 -12384, 67.99347, 119.7518 -12385, 68.84027, 125.351 -12386, 66.65667, 127.9004 -12387, 64.57652, 125.8364 -12388, 68.25611, 130.0452 -12389, 70.1304, 130.4494 -12390, 69.15411, 137.9543 -12391, 66.00913, 129.3445 -12392, 65.25623, 129.8806 -12393, 65.38594, 111.8541 -12394, 68.92278, 118.3422 -12395, 67.05723, 133.6179 -12396, 67.30535, 136.954 -12397, 64.88411, 140.0156 -12398, 66.28154, 100.9385 -12399, 70.93763, 135.4012 -12400, 70.63453, 133.6095 -12401, 69.46661, 128.8735 -12402, 67.96774, 143.9946 -12403, 70.0157, 134.9027 -12404, 68.46486, 102.6906 -12405, 65.54388, 108.3486 -12406, 69.57076, 134.1768 -12407, 68.70712, 122.7974 -12408, 66.47937, 126.4091 -12409, 65.6515, 138.9004 -12410, 64.8085, 118.4505 -12411, 69.20954, 128.4521 -12412, 71.2453, 140.3166 -12413, 66.78091, 133.1914 -12414, 66.66698, 118.2094 -12415, 67.46012, 130.3946 -12416, 68.39734, 132.1677 -12417, 66.05758, 106.7136 -12418, 70.74289, 129.1447 -12419, 69.0472, 112.5379 -12420, 65.25487, 113.0535 -12421, 70.83969, 136.1852 -12422, 66.48308, 129.5826 -12423, 64.86362, 131.524 -12424, 64.89809, 104.151 -12425, 66.91413, 131.8421 -12426, 68.79811, 138.0315 -12427, 68.26946, 139.016 -12428, 68.87518, 145.2094 -12429, 68.51555, 116.7877 -12430, 64.25854, 117.9964 -12431, 71.84377, 149.3361 -12432, 71.08684, 148.1875 -12433, 64.2151, 121.7215 -12434, 62.63566, 108.8842 -12435, 65.81205, 120.7095 -12436, 67.33833, 137.2586 -12437, 65.81917, 113.1984 -12438, 67.99186, 114.8133 -12439, 69.11226, 137.8176 -12440, 71.84641, 132.2059 -12441, 72.71856, 134.3143 -12442, 67.57166, 127.0006 -12443, 66.86178, 124.9583 -12444, 67.18912, 131.2947 -12445, 67.68132, 122.2843 -12446, 66.23406, 113.5248 -12447, 64.74007, 87.3791 -12448, 67.97426, 120.9928 -12449, 70.57709, 131.9995 -12450, 72.00389, 147.4338 -12451, 67.60891, 130.389 -12452, 66.68001, 118.2663 -12453, 70.70574, 124.06 -12454, 67.75154, 123.0129 -12455, 69.21119, 134.49 -12456, 70.08521, 120.7698 -12457, 68.45585, 122.5019 -12458, 68.86915, 129.1183 -12459, 67.92791, 117.2508 -12460, 70.4825, 136.7279 -12461, 69.32572, 122.6077 -12462, 67.52547, 148.9945 -12463, 65.62965, 131.0125 -12464, 67.89239, 128.1211 -12465, 68.12894, 116.1115 -12466, 69.54996, 146.4172 -12467, 66.8999, 125.8277 -12468, 67.60053, 113.744 -12469, 65.23102, 127.9767 -12470, 68.51538, 127.1196 -12471, 71.76225, 123.2438 -12472, 66.54347, 132.6527 -12473, 66.45278, 123.5997 -12474, 69.74047, 128.9735 -12475, 68.15836, 129.8696 -12476, 66.03258, 120.1757 -12477, 64.73717, 113.7689 -12478, 65.58498, 112.9359 -12479, 66.54497, 122.2424 -12480, 69.41557, 140.4464 -12481, 70.6516, 148.6669 -12482, 69.55188, 132.2138 -12483, 67.89495, 132.9517 -12484, 67.31471, 138.8578 -12485, 63.75295, 118.195 -12486, 67.2233, 125.6088 -12487, 67.54931, 126.4352 -12488, 66.91107, 122.745 -12489, 69.09424, 122.6279 -12490, 67.09958, 118.5781 -12491, 70.47341, 140.9829 -12492, 69.68349, 127.9623 -12493, 68.56579, 133.3859 -12494, 67.43454, 123.6383 -12495, 66.55213, 115.8177 -12496, 68.0387, 138.3228 -12497, 69.78338, 124.3807 -12498, 67.94391, 131.2025 -12499, 66.63849, 126.9132 -12500, 68.45079, 127.414 -12501, 70.07106, 113.5241 -12502, 69.31026, 114.3171 -12503, 71.75837, 135.6142 -12504, 69.71622, 140.662 -12505, 66.99944, 130.037 -12506, 72.48928, 138.7557 -12507, 66.28225, 117.5711 -12508, 66.00195, 130.7777 -12509, 68.5202, 118.5414 -12510, 67.26404, 121.9478 -12511, 65.81057, 120.8452 -12512, 68.39663, 140.8006 -12513, 69.54723, 139.1849 -12514, 68.82906, 126.3249 -12515, 67.68691, 121.9448 -12516, 68.60051, 110.8007 -12517, 67.02558, 127.5396 -12518, 69.32334, 139.7775 -12519, 67.76623, 123.344 -12520, 66.76197, 109.2005 -12521, 67.098, 117.2866 -12522, 68.96237, 136.63 -12523, 66.68073, 136.6551 -12524, 70.07508, 129.9514 -12525, 66.38605, 126.2915 -12526, 69.05442, 131.9593 -12527, 69.49012, 140.5831 -12528, 68.12397, 128.8785 -12529, 68.40195, 139.1229 -12530, 69.40097, 132.3228 -12531, 69.55725, 143.996 -12532, 68.71036, 126.5518 -12533, 65.21573, 116.8032 -12534, 69.36761, 135.5201 -12535, 69.12651, 139.0078 -12536, 66.89099, 137.6137 -12537, 65.4888, 134.2944 -12538, 68.20845, 135.3887 -12539, 66.29682, 111.8809 -12540, 67.53607, 111.545 -12541, 67.54041, 125.1986 -12542, 69.88988, 144.1664 -12543, 68.55332, 110.9255 -12544, 67.19021, 125.038 -12545, 67.35534, 131.0543 -12546, 71.49612, 138.8885 -12547, 68.82757, 130.4426 -12548, 69.11661, 119.6437 -12549, 64.63422, 127.7079 -12550, 64.58205, 100.557 -12551, 65.9946, 124.2257 -12552, 69.0528, 129.5877 -12553, 69.80507, 154.9924 -12554, 68.4173, 144.9684 -12555, 67.12852, 116.2219 -12556, 66.85993, 117.9136 -12557, 68.75888, 125.4433 -12558, 66.11846, 131.5019 -12559, 64.64742, 112.8034 -12560, 65.59808, 122.1915 -12561, 69.41123, 132.3657 -12562, 69.86767, 118.2363 -12563, 67.74429, 115.3566 -12564, 69.57154, 126.382 -12565, 66.93873, 126.2335 -12566, 67.32014, 130.6583 -12567, 67.45694, 113.2988 -12568, 70.22599, 135.254 -12569, 66.03134, 111.0406 -12570, 68.38498, 119.4007 -12571, 68.63206, 127.0706 -12572, 71.10527, 128.6674 -12573, 68.03731, 116.0219 -12574, 66.68726, 121.7474 -12575, 66.76614, 104.8083 -12576, 70.56704, 122.4718 -12577, 64.74464, 99.72601 -12578, 67.86554, 108.1438 -12579, 66.55172, 121.0529 -12580, 70.99403, 138.9722 -12581, 68.30178, 125.0544 -12582, 67.90843, 134.2875 -12583, 68.97747, 128.9206 -12584, 66.45071, 117.6418 -12585, 66.34292, 112.5733 -12586, 68.24008, 135.0878 -12587, 66.51948, 113.9957 -12588, 64.81528, 121.5109 -12589, 65.92603, 107.3163 -12590, 68.65183, 130.1741 -12591, 65.82599, 107.6702 -12592, 70.27704, 135.9964 -12593, 68.84244, 117.9071 -12594, 69.4594, 133.9838 -12595, 67.2644, 127.0181 -12596, 71.28234, 134.0145 -12597, 69.14869, 125.0073 -12598, 69.431, 124.9502 -12599, 71.17918, 135.0057 -12600, 66.45775, 134.571 -12601, 67.25106, 117.7898 -12602, 68.36867, 135.2021 -12603, 68.58773, 148.6514 -12604, 64.15953, 112.875 -12605, 68.69334, 138.6052 -12606, 68.72121, 148.0597 -12607, 67.7996, 130.667 -12608, 64.32884, 109.5509 -12609, 67.22786, 121.3151 -12610, 70.60144, 137.5583 -12611, 68.79806, 135.2602 -12612, 67.94924, 120.2593 -12613, 62.57873, 96.11534 -12614, 68.41549, 113.0067 -12615, 69.01353, 141.7589 -12616, 65.74831, 139.774 -12617, 71.81629, 132.7127 -12618, 69.37019, 119.1947 -12619, 66.40565, 115.9791 -12620, 70.68742, 135.3749 -12621, 66.25324, 126.0192 -12622, 68.71076, 122.2045 -12623, 67.26793, 116.1981 -12624, 69.09202, 146.6689 -12625, 72.35308, 139.6808 -12626, 69.04342, 134.08 -12627, 70.73303, 143.2831 -12628, 68.36911, 144.1253 -12629, 72.1229, 157.6616 -12630, 67.91302, 120.1835 -12631, 70.73081, 127.2146 -12632, 68.66401, 116.9992 -12633, 65.75594, 127.2348 -12634, 65.95131, 105.3219 -12635, 67.46588, 115.8773 -12636, 69.63874, 132.5026 -12637, 68.20571, 128.1029 -12638, 70.12075, 143.4512 -12639, 69.33824, 128.5652 -12640, 65.04011, 120.0564 -12641, 67.13403, 126.3556 -12642, 65.34843, 117.1063 -12643, 70.1839, 123.7718 -12644, 66.3978, 124.6117 -12645, 68.70525, 134.5751 -12646, 68.48066, 133.0611 -12647, 68.83329, 134.5825 -12648, 70.39459, 127.3152 -12649, 65.43292, 104.3383 -12650, 70.09461, 135.1397 -12651, 68.76244, 154.024 -12652, 69.35571, 128.516 -12653, 67.04356, 132.4941 -12654, 72.99632, 157.8664 -12655, 67.38058, 152.7149 -12656, 64.82189, 116.4536 -12657, 66.06893, 114.6445 -12658, 68.60001, 125.1518 -12659, 67.05224, 131.9155 -12660, 66.25923, 107.9334 -12661, 69.41316, 139.3844 -12662, 69.8588, 144.9464 -12663, 69.90593, 132.8098 -12664, 69.7052, 132.7173 -12665, 69.63663, 140.4612 -12666, 67.99399, 117.8776 -12667, 69.70857, 126.5658 -12668, 69.33609, 133.7583 -12669, 71.24983, 137.2504 -12670, 65.96176, 107.8183 -12671, 67.58381, 135.656 -12672, 69.98799, 129.377 -12673, 69.93978, 147.0146 -12674, 68.58929, 115.6961 -12675, 69.65638, 131.1921 -12676, 68.67033, 126.5642 -12677, 69.2782, 131.6396 -12678, 67.07981, 125.7229 -12679, 67.70003, 136.0609 -12680, 68.54715, 120.4416 -12681, 69.91993, 135.924 -12682, 66.98397, 126.9148 -12683, 65.48047, 108.2565 -12684, 69.07402, 130.6905 -12685, 63.83188, 114.8563 -12686, 67.4815, 122.7798 -12687, 66.69107, 106.3925 -12688, 67.34666, 122.1811 -12689, 68.28734, 116.2769 -12690, 71.91512, 132.4214 -12691, 70.24886, 133.7254 -12692, 67.30216, 137.5719 -12693, 70.24521, 126.039 -12694, 69.1209, 138.9805 -12695, 67.3079, 119.5167 -12696, 68.67791, 129.9471 -12697, 68.60468, 115.5747 -12698, 66.93601, 122.582 -12699, 69.67793, 132.9082 -12700, 66.9517, 91.22631 -12701, 68.2565, 134.6433 -12702, 70.76077, 148.3999 -12703, 70.30436, 136.2413 -12704, 69.60703, 126.7617 -12705, 66.90735, 120.1773 -12706, 64.22389, 117.6816 -12707, 64.36145, 114.8832 -12708, 71.54765, 146.309 -12709, 68.14466, 119.8608 -12710, 68.54325, 127.7214 -12711, 64.64412, 106.2843 -12712, 66.19854, 113.9223 -12713, 65.56816, 141.3379 -12714, 66.58173, 106.1254 -12715, 67.63379, 136.1838 -12716, 70.49459, 141.9638 -12717, 70.17511, 124.9465 -12718, 67.13912, 131.6294 -12719, 70.74149, 132.4381 -12720, 69.09462, 142.8177 -12721, 67.47896, 127.436 -12722, 68.55825, 143.5287 -12723, 69.07966, 147.9838 -12724, 70.35436, 121.3196 -12725, 62.70318, 92.59193 -12726, 67.59562, 138.9259 -12727, 68.14798, 140.0075 -12728, 69.27571, 155.7563 -12729, 69.07472, 120.2972 -12730, 69.09439, 117.6279 -12731, 68.6144, 130.4149 -12732, 62.398, 89.1971 -12733, 69.12922, 139.877 -12734, 67.33389, 126.0962 -12735, 65.08376, 131.736 -12736, 71.12569, 137.2863 -12737, 68.07031, 117.5196 -12738, 65.54023, 117.5058 -12739, 70.37267, 124.7668 -12740, 65.68487, 124.5331 -12741, 65.1396, 127.773 -12742, 72.15147, 148.5491 -12743, 65.05276, 103.6491 -12744, 65.00704, 95.01295 -12745, 69.52238, 134.7143 -12746, 66.51322, 114.55 -12747, 70.00383, 138.3081 -12748, 65.98143, 123.4941 -12749, 66.13459, 101.1344 -12750, 69.87842, 138.228 -12751, 66.66719, 126.0355 -12752, 66.89316, 139.7169 -12753, 68.49506, 122.879 -12754, 66.52004, 126.5041 -12755, 67.96291, 114.4191 -12756, 66.29951, 126.7682 -12757, 70.03377, 120.3446 -12758, 66.20352, 107.0425 -12759, 68.22162, 124.1618 -12760, 68.33014, 132.5046 -12761, 66.68585, 130.3999 -12762, 65.81999, 112.6146 -12763, 66.79436, 119.7033 -12764, 70.05224, 115.3835 -12765, 66.30361, 124.7241 -12766, 65.92122, 121.5372 -12767, 71.33496, 138.7443 -12768, 65.93792, 131.6449 -12769, 66.80261, 119.4744 -12770, 67.88451, 127.7094 -12771, 68.57765, 124.3734 -12772, 67.63851, 131.859 -12773, 67.44645, 128.5003 -12774, 70.78508, 132.6894 -12775, 66.20549, 114.1363 -12776, 64.01757, 101.5315 -12777, 69.51099, 144.765 -12778, 66.19759, 100.7474 -12779, 68.114, 137.3945 -12780, 68.89748, 114.6844 -12781, 66.08796, 128.0759 -12782, 65.69337, 140.7693 -12783, 66.84988, 130.5163 -12784, 68.13243, 126.5235 -12785, 65.85355, 121.6208 -12786, 66.46148, 111.3949 -12787, 70.16892, 135.7384 -12788, 70.47648, 126.461 -12789, 68.83992, 125.6376 -12790, 68.16224, 124.5737 -12791, 69.75698, 115.3657 -12792, 67.07932, 121.7021 -12793, 66.45796, 133.9175 -12794, 68.10467, 124.2443 -12795, 70.18297, 148.1467 -12796, 71.06812, 136.7636 -12797, 66.12689, 137.2242 -12798, 70.02419, 132.5 -12799, 63.95983, 110.9671 -12800, 68.29421, 138.0009 -12801, 66.78712, 125.2584 -12802, 70.31549, 118.2843 -12803, 67.87672, 115.7531 -12804, 64.98948, 115.7612 -12805, 65.73625, 103.3949 -12806, 67.18713, 113.77 -12807, 63.7027, 111.5551 -12808, 72.22326, 146.7823 -12809, 68.74167, 125.3766 -12810, 64.83708, 122.7266 -12811, 67.87607, 130.0423 -12812, 67.37786, 118.0533 -12813, 65.1186, 129.3106 -12814, 69.23622, 125.7028 -12815, 65.09077, 111.4222 -12816, 70.31072, 126.3652 -12817, 68.26941, 129.7347 -12818, 67.6398, 137.9234 -12819, 66.55938, 122.7599 -12820, 68.89767, 142.6513 -12821, 67.73688, 138.6194 -12822, 69.4266, 133.8572 -12823, 69.1415, 121.8042 -12824, 70.88688, 138.8487 -12825, 67.4992, 134.3789 -12826, 67.48566, 129.2513 -12827, 65.80458, 122.6509 -12828, 69.4832, 108.9489 -12829, 64.95436, 112.0785 -12830, 66.4238, 111.2181 -12831, 67.79983, 120.5562 -12832, 70.35784, 145.1015 -12833, 65.93427, 124.9365 -12834, 72.14741, 152.714 -12835, 69.02285, 141.9567 -12836, 67.95237, 114.0617 -12837, 64.88273, 120.3929 -12838, 66.88904, 108.9186 -12839, 68.16321, 121.259 -12840, 67.31487, 126.8506 -12841, 70.8218, 138.0774 -12842, 69.2295, 125.0231 -12843, 67.98989, 116.7557 -12844, 69.10378, 147.7595 -12845, 65.19866, 114.6411 -12846, 70.6943, 130.9471 -12847, 67.95665, 141.4925 -12848, 64.71795, 110.6855 -12849, 67.77693, 121.1735 -12850, 66.65039, 109.8503 -12851, 68.66554, 114.5278 -12852, 70.60726, 141.8837 -12853, 71.14677, 131.3756 -12854, 66.39228, 120.6284 -12855, 66.31944, 115.0054 -12856, 68.59114, 142.5636 -12857, 69.32005, 114.6814 -12858, 69.02579, 131.297 -12859, 69.92046, 135.0288 -12860, 69.21391, 109.8219 -12861, 70.50711, 135.185 -12862, 68.22468, 122.0414 -12863, 64.42053, 125.1623 -12864, 66.66605, 121.3495 -12865, 66.25687, 134.2611 -12866, 69.05579, 114.318 -12867, 63.6611, 101.3054 -12868, 65.78795, 140.3781 -12869, 65.16658, 102.3367 -12870, 68.15122, 135.4779 -12871, 69.38984, 135.9126 -12872, 65.78621, 122.6126 -12873, 68.2597, 120.6736 -12874, 69.52348, 124.3154 -12875, 68.04861, 130.1638 -12876, 65.09478, 133.7183 -12877, 67.92363, 126.3504 -12878, 67.96986, 136.9789 -12879, 68.83982, 125.9746 -12880, 66.47793, 119.8167 -12881, 69.22774, 128.9968 -12882, 66.9221, 132.8417 -12883, 68.83985, 120.0603 -12884, 71.58499, 167.8045 -12885, 68.54065, 137.9769 -12886, 66.50759, 117.7984 -12887, 69.98011, 126.927 -12888, 70.8198, 122.0349 -12889, 67.05275, 127.4661 -12890, 68.3326, 143.762 -12891, 68.9573, 132.012 -12892, 67.34256, 137.6082 -12893, 71.28917, 128.8965 -12894, 68.7694, 130.0066 -12895, 68.12962, 126.3372 -12896, 66.39812, 117.4012 -12897, 65.23885, 137.3238 -12898, 66.44001, 127.4717 -12899, 70.93311, 137.8625 -12900, 67.31072, 128.5575 -12901, 70.72584, 130.6364 -12902, 68.11148, 126.047 -12903, 68.46257, 147.0739 -12904, 68.0129, 114.4355 -12905, 66.96139, 131.5032 -12906, 68.42376, 127.3903 -12907, 69.0915, 127.5051 -12908, 67.83572, 130.7118 -12909, 67.0104, 116.4421 -12910, 67.9803, 132.8359 -12911, 69.40901, 140.1526 -12912, 68.17666, 143.5168 -12913, 68.82236, 122.6466 -12914, 69.59401, 120.2946 -12915, 69.79599, 139.6795 -12916, 69.57154, 123.7094 -12917, 66.17372, 130.3693 -12918, 68.56311, 145.1008 -12919, 68.00701, 148.8339 -12920, 68.20627, 120.9951 -12921, 68.41836, 124.8028 -12922, 66.87925, 124.0546 -12923, 67.17012, 128.4136 -12924, 67.01381, 134.9587 -12925, 66.27923, 122.9582 -12926, 66.31152, 128.7993 -12927, 67.42453, 129.8299 -12928, 67.2625, 129.1298 -12929, 66.85661, 115.8562 -12930, 68.30887, 119.1643 -12931, 67.3835, 146.1098 -12932, 70.43142, 150.9456 -12933, 69.94726, 141.3873 -12934, 69.17938, 135.8499 -12935, 66.56538, 116.9042 -12936, 68.67972, 143.4218 -12937, 64.81954, 99.80369 -12938, 70.49047, 126.5028 -12939, 68.10777, 126.735 -12940, 68.41482, 125.2798 -12941, 68.2052, 120.8053 -12942, 64.71503, 133.1455 -12943, 65.65007, 114.6888 -12944, 70.11281, 133.7564 -12945, 66.9713, 122.9566 -12946, 67.37563, 124.9457 -12947, 70.20955, 119.9669 -12948, 65.60368, 117.7954 -12949, 65.99327, 126.8598 -12950, 64.12511, 114.9245 -12951, 67.89782, 113.589 -12952, 69.76854, 126.3972 -12953, 66.68039, 123.661 -12954, 71.3082, 129.1532 -12955, 68.92387, 153.6931 -12956, 70.98202, 137.4036 -12957, 70.09326, 121.8786 -12958, 68.2703, 123.8796 -12959, 68.43097, 130.4136 -12960, 67.48521, 122.9673 -12961, 65.28618, 124.4946 -12962, 69.12615, 128.2417 -12963, 70.05579, 135.7679 -12964, 66.26599, 121.7592 -12965, 67.66477, 126.609 -12966, 67.29123, 137.2435 -12967, 68.77873, 118.0382 -12968, 69.70939, 137.5337 -12969, 70.67986, 141.8843 -12970, 69.66769, 139.9762 -12971, 67.15104, 132.4239 -12972, 68.98937, 135.7329 -12973, 67.42939, 124.1274 -12974, 67.78729, 137.1755 -12975, 64.43099, 145.4739 -12976, 67.67702, 121.8942 -12977, 69.99401, 132.7112 -12978, 69.71816, 117.6143 -12979, 69.41796, 133.882 -12980, 64.96373, 123.9581 -12981, 67.53047, 132.6457 -12982, 69.31009, 129.1492 -12983, 66.40906, 134.3405 -12984, 68.40781, 128.4416 -12985, 66.74614, 114.8763 -12986, 67.0559, 124.9848 -12987, 69.04014, 111.9708 -12988, 69.84443, 135.6318 -12989, 68.11787, 109.8296 -12990, 67.96711, 127.1728 -12991, 64.26845, 109.7383 -12992, 66.38069, 113.3612 -12993, 69.65186, 141.0062 -12994, 67.50995, 111.4264 -12995, 68.59905, 149.7418 -12996, 65.38762, 113.4099 -12997, 69.754, 139.7871 -12998, 66.40135, 122.4853 -12999, 69.97896, 119.6409 -13000, 69.31752, 133.772 -13001, 65.80662, 144.3102 -13002, 66.85982, 140.6987 -13003, 70.3717, 135.4761 -13004, 66.50564, 129.2973 -13005, 66.29807, 121.9226 -13006, 70.79659, 138.0529 -13007, 66.9188, 143.6876 -13008, 67.86452, 101.8559 -13009, 69.26225, 135.6449 -13010, 63.83449, 115.8313 -13011, 68.60409, 127.3747 -13012, 67.03402, 123.9735 -13013, 67.39559, 119.7485 -13014, 65.21454, 131.9907 -13015, 68.28765, 126.7902 -13016, 69.10579, 128.4257 -13017, 68.35335, 130.4412 -13018, 68.07782, 127.7648 -13019, 67.84152, 132.4672 -13020, 65.28594, 127.6072 -13021, 68.1933, 122.6322 -13022, 67.74053, 114.4872 -13023, 67.04758, 123.7627 -13024, 65.4041, 137.16 -13025, 66.17018, 115.5937 -13026, 66.80868, 116.272 -13027, 67.29029, 125.8577 -13028, 70.09532, 116.7931 -13029, 66.80156, 120.9025 -13030, 66.63488, 118.1354 -13031, 69.56506, 125.3899 -13032, 70.60646, 128.7028 -13033, 71.964, 130.4404 -13034, 66.99211, 106.3826 -13035, 64.63998, 124.5983 -13036, 64.46369, 113.8868 -13037, 67.48073, 118.8642 -13038, 71.0274, 149.722 -13039, 66.57652, 124.7905 -13040, 68.8576, 130.9752 -13041, 66.25434, 118.0379 -13042, 68.59622, 119.9239 -13043, 70.5651, 124.2969 -13044, 68.19129, 135.3963 -13045, 68.631, 145.9199 -13046, 66.95137, 121.817 -13047, 65.73162, 120.4355 -13048, 69.39596, 131.8885 -13049, 68.4177, 155.2243 -13050, 68.5373, 118.7651 -13051, 65.89888, 119.7408 -13052, 71.79395, 134.9478 -13053, 64.61857, 126.0336 -13054, 67.95083, 135.7588 -13055, 69.24678, 120.7578 -13056, 69.09927, 117.0254 -13057, 68.66631, 117.8159 -13058, 67.96796, 128.4943 -13059, 68.36887, 110.7174 -13060, 66.49471, 127.7524 -13061, 66.10701, 133.2153 -13062, 69.66455, 150.5807 -13063, 70.8961, 127.1952 -13064, 63.23763, 119.1795 -13065, 67.19734, 117.7393 -13066, 67.85778, 123.0461 -13067, 67.22801, 131.9317 -13068, 69.7057, 131.1593 -13069, 68.84395, 107.803 -13070, 72.34677, 133.7865 -13071, 71.26584, 134.0578 -13072, 69.44174, 122.8241 -13073, 67.29233, 118.7096 -13074, 66.81163, 101.159 -13075, 68.86359, 128.1226 -13076, 66.49126, 126.8115 -13077, 68.04236, 140.7966 -13078, 70.0192, 122.6033 -13079, 67.83242, 130.1143 -13080, 69.44946, 138.989 -13081, 67.26935, 116.3762 -13082, 66.54396, 127.1921 -13083, 70.04568, 118.2566 -13084, 66.75437, 112.4253 -13085, 64.46778, 104.1932 -13086, 66.85722, 111.022 -13087, 67.45724, 133.9342 -13088, 69.45109, 132.5114 -13089, 66.60452, 129.8988 -13090, 67.06108, 131.6097 -13091, 68.42116, 113.0609 -13092, 69.493, 116.8366 -13093, 70.46411, 140.5955 -13094, 68.9279, 112.8921 -13095, 64.0927, 122.0211 -13096, 69.8857, 120.2619 -13097, 70.98109, 133.7989 -13098, 70.75683, 134.2516 -13099, 69.29064, 122.7467 -13100, 67.34605, 118.8282 -13101, 71.60653, 145.4865 -13102, 68.73423, 127.9355 -13103, 70.23183, 132.2244 -13104, 67.73289, 128.6208 -13105, 64.52831, 119.7817 -13106, 66.63655, 116.8298 -13107, 69.76077, 116.2196 -13108, 65.56703, 127.0848 -13109, 68.77343, 121.1138 -13110, 69.40668, 140.9985 -13111, 69.43534, 137.473 -13112, 68.30511, 142.7223 -13113, 63.7744, 115.913 -13114, 65.68321, 128.3344 -13115, 68.33718, 120.9561 -13116, 69.86703, 147.7559 -13117, 65.7249, 124.3421 -13118, 68.1319, 130.2268 -13119, 70.9089, 139.7271 -13120, 67.84388, 108.6559 -13121, 67.27281, 133.2515 -13122, 66.14906, 124.3751 -13123, 67.9919, 118.8748 -13124, 67.75147, 129.3329 -13125, 69.95487, 126.1978 -13126, 65.25717, 130.0705 -13127, 68.78511, 136.2792 -13128, 68.53751, 144.8563 -13129, 66.68688, 120.6248 -13130, 65.88737, 129.3868 -13131, 67.70939, 124.5234 -13132, 63.53168, 116.9152 -13133, 69.49591, 139.4006 -13134, 70.25639, 133.0404 -13135, 68.33535, 142.8504 -13136, 68.20992, 143.3398 -13137, 71.61247, 131.4263 -13138, 68.30837, 133.0776 -13139, 68.79576, 128.3906 -13140, 66.11011, 110.656 -13141, 71.17064, 151.2357 -13142, 65.96844, 132.1259 -13143, 69.49436, 131.419 -13144, 66.1988, 130.2737 -13145, 67.05559, 124.3257 -13146, 70.82173, 136.5632 -13147, 67.84611, 136.8583 -13148, 66.01755, 112.6355 -13149, 66.2288, 124.778 -13150, 66.66816, 133.0192 -13151, 65.48562, 131.4137 -13152, 67.62, 148.1053 -13153, 68.82866, 119.503 -13154, 68.43031, 126.7202 -13155, 64.88057, 112.4524 -13156, 70.71452, 129.2147 -13157, 68.29645, 126.0144 -13158, 68.57851, 128.5564 -13159, 65.66804, 101.8834 -13160, 68.35718, 126.9565 -13161, 68.30827, 121.8879 -13162, 67.97439, 114.888 -13163, 65.44622, 110.3052 -13164, 66.41683, 135.3551 -13165, 67.76647, 107.941 -13166, 70.12719, 112.8635 -13167, 66.45294, 119.4764 -13168, 67.25909, 132.5905 -13169, 67.90183, 140.1277 -13170, 65.12247, 118.1968 -13171, 70.54615, 137.335 -13172, 67.93419, 127.8738 -13173, 68.4073, 131.5761 -13174, 68.0543, 125.3733 -13175, 66.81613, 125.5772 -13176, 71.46482, 156.698 -13177, 66.1986, 130.4507 -13178, 67.78284, 131.1426 -13179, 65.98122, 137.0717 -13180, 71.18172, 119.8668 -13181, 66.63714, 107.6969 -13182, 65.21006, 108.4938 -13183, 72.02198, 145.489 -13184, 67.73998, 130.4849 -13185, 66.80834, 118.4648 -13186, 69.82781, 151.5249 -13187, 69.066, 134.8918 -13188, 67.74345, 130.8209 -13189, 69.05112, 112.3061 -13190, 65.9683, 104.3853 -13191, 69.13584, 129.2356 -13192, 67.40931, 130.2442 -13193, 67.92429, 130.3329 -13194, 68.87862, 122.1128 -13195, 70.78535, 147.0279 -13196, 67.94063, 116.9758 -13197, 68.55731, 124.1189 -13198, 67.95809, 143.184 -13199, 67.14299, 124.7983 -13200, 66.31973, 135.487 -13201, 69.86703, 123.4288 -13202, 70.34807, 128.6677 -13203, 68.33013, 118.3628 -13204, 69.25117, 126.0558 -13205, 69.50442, 119.8007 -13206, 64.7488, 136.3069 -13207, 71.18038, 136.9996 -13208, 68.20414, 136.4564 -13209, 67.20821, 138.9231 -13210, 68.09341, 129.9965 -13211, 67.57946, 133.9151 -13212, 66.36966, 121.0705 -13213, 70.44008, 115.5771 -13214, 69.59612, 118.1955 -13215, 73.18845, 141.6274 -13216, 64.8038, 114.1008 -13217, 63.38823, 116.9479 -13218, 68.42439, 122.0094 -13219, 68.20646, 130.3053 -13220, 68.47766, 124.3275 -13221, 68.13698, 109.9892 -13222, 66.5642, 120.0656 -13223, 71.6742, 142.782 -13224, 67.05255, 128.7431 -13225, 68.85466, 117.8856 -13226, 68.65248, 122.2601 -13227, 64.16886, 110.911 -13228, 67.16001, 142.7395 -13229, 65.06853, 123.8455 -13230, 69.67259, 136.5818 -13231, 67.28347, 135.4397 -13232, 69.90543, 129.4083 -13233, 66.39269, 113.8244 -13234, 69.0075, 132.1928 -13235, 68.90949, 128.4623 -13236, 66.02741, 108.1906 -13237, 68.22004, 130.7162 -13238, 70.8693, 136.1507 -13239, 64.98984, 117.714 -13240, 67.12295, 119.9848 -13241, 67.83454, 123.3862 -13242, 70.74203, 140.0149 -13243, 64.27586, 103.4251 -13244, 68.62938, 125.9597 -13245, 71.83546, 129.9557 -13246, 69.13802, 124.1999 -13247, 69.14398, 135.7985 -13248, 69.86294, 123.7869 -13249, 68.0071, 122.3199 -13250, 64.28003, 119.2213 -13251, 64.80749, 98.27368 -13252, 68.44135, 137.1619 -13253, 67.33811, 118.3226 -13254, 66.23568, 111.8243 -13255, 65.38226, 135.7816 -13256, 69.70013, 127.6917 -13257, 70.21141, 131.4104 -13258, 67.25972, 127.8096 -13259, 68.19324, 126.6439 -13260, 69.34903, 127.2285 -13261, 70.82622, 136.3402 -13262, 68.95895, 145.2939 -13263, 66.35313, 123.3383 -13264, 67.70155, 113.0354 -13265, 66.01282, 126.4426 -13266, 64.67146, 121.8473 -13267, 65.26196, 116.2627 -13268, 64.32105, 126.3531 -13269, 68.19311, 114.3672 -13270, 70.63372, 138.5337 -13271, 67.32161, 137.0611 -13272, 69.07423, 134.9462 -13273, 67.38292, 112.8386 -13274, 66.9492, 110.6838 -13275, 69.37345, 135.2223 -13276, 67.17327, 128.3909 -13277, 64.82297, 113.3591 -13278, 69.74366, 131.9008 -13279, 69.05523, 122.8494 -13280, 68.52817, 119.1168 -13281, 65.77416, 135.7006 -13282, 70.49366, 129.384 -13283, 71.53026, 135.0245 -13284, 68.16348, 110.3596 -13285, 70.15896, 153.1741 -13286, 68.67804, 141.0451 -13287, 64.07479, 118.5714 -13288, 65.63973, 99.81515 -13289, 67.91191, 129.3775 -13290, 67.775, 146.1935 -13291, 69.18617, 132.9471 -13292, 68.01384, 131.7207 -13293, 62.48941, 117.7949 -13294, 67.96079, 127.3995 -13295, 67.82376, 134.2977 -13296, 66.92886, 111.183 -13297, 67.39775, 134.5976 -13298, 67.41853, 143.8567 -13299, 66.08383, 118.2815 -13300, 69.40233, 119.7774 -13301, 68.42976, 124.3332 -13302, 68.65284, 126.7226 -13303, 67.71085, 110.5105 -13304, 66.92357, 113.5576 -13305, 67.28097, 128.3507 -13306, 67.60201, 132.2953 -13307, 69.39436, 120.7939 -13308, 66.10454, 113.4298 -13309, 68.63883, 129.8796 -13310, 66.93124, 119.3294 -13311, 66.52196, 134.1469 -13312, 64.39478, 118.0702 -13313, 67.87061, 127.3809 -13314, 70.43201, 121.1751 -13315, 70.40373, 118.6765 -13316, 68.88718, 127.3501 -13317, 69.10626, 124.0148 -13318, 69.20993, 131.5479 -13319, 66.95677, 127.1894 -13320, 68.55278, 139.2787 -13321, 67.34935, 121.2197 -13322, 70.08442, 146.126 -13323, 66.55493, 120.4965 -13324, 68.39772, 134.5794 -13325, 69.17551, 127.7031 -13326, 67.88832, 130.9674 -13327, 69.23136, 151.7222 -13328, 66.39321, 136.1953 -13329, 66.29156, 129.0251 -13330, 69.27872, 133.8416 -13331, 67.04849, 123.7323 -13332, 66.08908, 120.447 -13333, 65.40789, 106.4048 -13334, 64.41176, 100.5481 -13335, 68.99911, 147.0279 -13336, 63.96038, 98.96049 -13337, 67.25019, 111.6628 -13338, 70.13072, 138.9752 -13339, 73.11393, 154.7801 -13340, 68.46228, 135.4161 -13341, 69.36312, 131.0502 -13342, 64.95313, 113.1035 -13343, 66.01722, 106.2152 -13344, 66.2941, 114.7051 -13345, 70.67693, 125.1185 -13346, 67.33243, 135.8197 -13347, 63.68425, 127.6135 -13348, 67.05486, 125.9922 -13349, 71.57334, 125.7925 -13350, 70.74414, 149.5795 -13351, 67.90413, 123.895 -13352, 70.23876, 134.9732 -13353, 66.42802, 143.3147 -13354, 68.27668, 120.5478 -13355, 69.23481, 132.964 -13356, 66.24127, 124.8096 -13357, 71.24159, 150.798 -13358, 64.23067, 106.6067 -13359, 68.13972, 129.562 -13360, 70.5219, 138.8618 -13361, 68.80228, 123.557 -13362, 71.47939, 122.5102 -13363, 66.25554, 117.2567 -13364, 67.65893, 125.1901 -13365, 66.24544, 118.1862 -13366, 69.4015, 117.9695 -13367, 63.68623, 124.7147 -13368, 67.70352, 117.4804 -13369, 64.58855, 97.81632 -13370, 67.90312, 121.7761 -13371, 69.31825, 132.5327 -13372, 68.78074, 133.8886 -13373, 65.16747, 103.7879 -13374, 67.39659, 123.8458 -13375, 64.41103, 100.447 -13376, 71.47445, 139.9332 -13377, 66.08011, 114.2059 -13378, 69.12359, 127.9635 -13379, 70.18251, 142.0535 -13380, 69.52844, 149.3159 -13381, 65.45636, 124.7121 -13382, 72.1365, 133.2988 -13383, 64.01521, 112.954 -13384, 66.94399, 121.8452 -13385, 70.76624, 129.2601 -13386, 67.1248, 127.1223 -13387, 70.91403, 137.6657 -13388, 69.05992, 96.98373 -13389, 68.87014, 132.286 -13390, 70.56427, 139.1888 -13391, 68.74068, 140.9494 -13392, 66.04751, 133.5623 -13393, 71.5113, 131.3287 -13394, 67.61109, 131.3793 -13395, 67.65123, 120.4534 -13396, 69.26124, 130.3283 -13397, 68.05308, 111.5429 -13398, 70.66922, 120.3896 -13399, 63.44163, 115.5336 -13400, 66.15659, 114.6908 -13401, 68.17946, 146.4593 -13402, 67.26248, 122.2184 -13403, 69.54205, 135.2309 -13404, 68.23248, 117.6804 -13405, 68.37902, 133.9223 -13406, 63.64125, 112.1593 -13407, 71.46636, 141.1508 -13408, 69.26616, 140.8013 -13409, 69.24025, 155.7611 -13410, 67.95744, 121.5092 -13411, 66.88315, 123.9898 -13412, 69.59355, 130.8852 -13413, 70.21228, 136.9528 -13414, 66.76888, 109.2297 -13415, 67.03536, 134.7424 -13416, 72.72333, 135.6775 -13417, 71.27092, 149.2486 -13418, 70.04237, 120.8985 -13419, 67.30938, 125.4023 -13420, 70.92362, 142.0399 -13421, 70.86617, 136.8164 -13422, 71.16906, 125.1008 -13423, 71.27803, 126.8942 -13424, 69.02346, 134.2947 -13425, 70.32898, 142.0952 -13426, 64.65613, 110.0386 -13427, 68.30144, 116.1683 -13428, 68.02501, 129.2719 -13429, 69.54645, 135.4922 -13430, 69.66515, 120.5153 -13431, 66.61978, 120.8916 -13432, 70.70351, 144.7056 -13433, 66.84578, 123.4342 -13434, 66.91022, 104.7945 -13435, 70.46769, 117.2765 -13436, 67.7792, 125.5647 -13437, 65.6698, 107.2109 -13438, 66.92797, 132.8552 -13439, 66.83788, 142.0706 -13440, 66.2109, 125.9366 -13441, 71.51674, 137.7854 -13442, 69.25899, 127.4162 -13443, 66.38182, 128.5337 -13444, 67.98866, 103.9803 -13445, 69.10657, 121.7137 -13446, 66.93244, 128.6671 -13447, 68.78738, 111.3942 -13448, 71.69889, 127.9976 -13449, 71.58625, 155.8226 -13450, 70.22459, 123.7852 -13451, 67.80333, 129.0836 -13452, 66.99804, 141.1636 -13453, 66.69938, 126.4284 -13454, 67.81842, 107.4346 -13455, 65.52188, 102.8837 -13456, 66.26517, 112.6468 -13457, 66.61056, 132.1592 -13458, 69.2276, 135.7117 -13459, 69.76883, 131.289 -13460, 67.25415, 126.2261 -13461, 71.94325, 146.1599 -13462, 70.42889, 131.4166 -13463, 69.14838, 135.2424 -13464, 66.35698, 117.5543 -13465, 67.72308, 120.2195 -13466, 69.32816, 144.6047 -13467, 67.18685, 119.0143 -13468, 64.98016, 128.0163 -13469, 69.50141, 131.0541 -13470, 66.21749, 117.7252 -13471, 66.87048, 146.4228 -13472, 67.26667, 110.8618 -13473, 68.84698, 118.8636 -13474, 69.64577, 137.3837 -13475, 68.42511, 127.5529 -13476, 66.12824, 130.6234 -13477, 66.50649, 118.7096 -13478, 68.22237, 117.7128 -13479, 70.89547, 132.2301 -13480, 66.49191, 129.8035 -13481, 65.92614, 110.2858 -13482, 70.60162, 133.4747 -13483, 69.90771, 125.1461 -13484, 68.17237, 135.0448 -13485, 67.93822, 114.7389 -13486, 67.26702, 127.2478 -13487, 70.93422, 134.1138 -13488, 65.43279, 132.7763 -13489, 68.50404, 136.0545 -13490, 65.32412, 124.1597 -13491, 67.15877, 124.869 -13492, 64.08903, 104.5371 -13493, 64.87852, 119.364 -13494, 68.06382, 112.3071 -13495, 67.85512, 138.274 -13496, 68.69451, 136.9217 -13497, 71.83913, 138.6279 -13498, 72.68296, 134.195 -13499, 72.97709, 129.5139 -13500, 68.69342, 111.9045 -13501, 68.68038, 125.2037 -13502, 70.61549, 135.1449 -13503, 68.58312, 133.3172 -13504, 67.87132, 122.0944 -13505, 67.36301, 133.484 -13506, 70.012, 125.7454 -13507, 71.00838, 140.3572 -13508, 69.54254, 153.5616 -13509, 67.29908, 126.9459 -13510, 68.91619, 133.2555 -13511, 66.98198, 110.6282 -13512, 67.52527, 131.6131 -13513, 68.68913, 153.1047 -13514, 68.0705, 145.1079 -13515, 65.34667, 106.6298 -13516, 68.27458, 129.4259 -13517, 68.43948, 138.6668 -13518, 68.63517, 125.4484 -13519, 65.9169, 115.5298 -13520, 68.75507, 121.4015 -13521, 67.50336, 121.0915 -13522, 67.35686, 119.5916 -13523, 68.74911, 123.4175 -13524, 65.82688, 125.1802 -13525, 63.66383, 100.9581 -13526, 66.73418, 123.5122 -13527, 68.7669, 121.9292 -13528, 63.50262, 115.3714 -13529, 67.76649, 125.1451 -13530, 68.57622, 123.7199 -13531, 69.26441, 135.5441 -13532, 69.68345, 122.2247 -13533, 68.79655, 124.5403 -13534, 71.45548, 149.4462 -13535, 67.08221, 107.519 -13536, 66.30983, 107.8446 -13537, 67.05289, 130.3873 -13538, 66.69178, 112.7728 -13539, 67.73043, 122.5769 -13540, 68.00003, 137.312 -13541, 66.63813, 102.5589 -13542, 65.65274, 108.267 -13543, 69.22019, 113.4516 -13544, 64.23796, 127.21 -13545, 67.5943, 133.0013 -13546, 70.42984, 136.3197 -13547, 67.11274, 128.19 -13548, 67.98772, 113.4182 -13549, 69.89944, 143.3529 -13550, 67.47588, 118.6167 -13551, 70.73882, 133.249 -13552, 67.09517, 127.4636 -13553, 64.63916, 124.0617 -13554, 65.95318, 114.1656 -13555, 70.34111, 131.5517 -13556, 65.08001, 117.1925 -13557, 67.01532, 127.5686 -13558, 67.44816, 140.1632 -13559, 64.62936, 114.2821 -13560, 67.18612, 128.9279 -13561, 69.1269, 125.3568 -13562, 67.48529, 111.7304 -13563, 68.60783, 133.3954 -13564, 66.35991, 111.3237 -13565, 67.23519, 123.6025 -13566, 68.10568, 124.4485 -13567, 64.73949, 138.3973 -13568, 68.29833, 127.7477 -13569, 69.22544, 131.9046 -13570, 68.59662, 142.6983 -13571, 66.28389, 120.2258 -13572, 66.43058, 112.2964 -13573, 64.0014, 116.3801 -13574, 67.44234, 152.4923 -13575, 65.15728, 102.1984 -13576, 65.33919, 112.9692 -13577, 65.70654, 130.7918 -13578, 64.35914, 112.2244 -13579, 65.57652, 126.7799 -13580, 71.05843, 136.3315 -13581, 67.23561, 122.0408 -13582, 65.16695, 110.5248 -13583, 69.84415, 152.3574 -13584, 66.61845, 124.8794 -13585, 67.50831, 150.5015 -13586, 66.40242, 124.3254 -13587, 69.02896, 123.8979 -13588, 69.10557, 149.6609 -13589, 68.44275, 126.72 -13590, 68.64999, 139.3151 -13591, 72.40603, 131.9203 -13592, 67.91361, 132.3644 -13593, 66.90988, 116.3878 -13594, 66.08598, 134.0194 -13595, 67.66889, 121.2939 -13596, 68.76862, 131.9744 -13597, 66.98014, 117.2521 -13598, 68.74833, 125.9501 -13599, 70.79517, 133.642 -13600, 64.31269, 110.4079 -13601, 68.92165, 120.3599 -13602, 67.70132, 137.2192 -13603, 71.41874, 139.3438 -13604, 72.51415, 114.3909 -13605, 68.8114, 127.7579 -13606, 67.13979, 109.7144 -13607, 66.74072, 130.6229 -13608, 69.70146, 156.5445 -13609, 72.75144, 157.7481 -13610, 67.66406, 139.4558 -13611, 68.27904, 144.4879 -13612, 69.24852, 136.1629 -13613, 70.34305, 138.67 -13614, 72.09527, 135.252 -13615, 67.11737, 127.7587 -13616, 71.75284, 138.0633 -13617, 66.32216, 123.6735 -13618, 68.59531, 128.7746 -13619, 67.84571, 129.0955 -13620, 69.33815, 118.5346 -13621, 66.37336, 122.3126 -13622, 66.26652, 110.3988 -13623, 64.87171, 132.5079 -13624, 67.92885, 109.6037 -13625, 70.33507, 153.9626 -13626, 66.34491, 120.7221 -13627, 68.64508, 137.0787 -13628, 67.34987, 120.2499 -13629, 69.2373, 132.8112 -13630, 69.88961, 131.3 -13631, 65.71516, 125.3647 -13632, 69.20236, 137.538 -13633, 72.83266, 143.9874 -13634, 63.90262, 122.0885 -13635, 65.38753, 125.0461 -13636, 65.11627, 123.6793 -13637, 68.0761, 125.6445 -13638, 70.38111, 143.9183 -13639, 68.29328, 125.3891 -13640, 66.17228, 121.1097 -13641, 69.01299, 126.3802 -13642, 64.39616, 118.3443 -13643, 69.66799, 137.5244 -13644, 70.11684, 148.1291 -13645, 70.67615, 138.4174 -13646, 71.67171, 154.5974 -13647, 70.98541, 132.011 -13648, 68.69251, 120.464 -13649, 66.13051, 130.6484 -13650, 72.18172, 145.7772 -13651, 64.49398, 120.2569 -13652, 71.09941, 120.904 -13653, 68.20045, 130.0656 -13654, 66.33023, 113.2041 -13655, 67.04367, 138.0165 -13656, 68.30547, 127.9004 -13657, 69.18392, 125.2414 -13658, 68.03723, 135.8445 -13659, 66.57552, 133.4506 -13660, 67.96196, 126.5701 -13661, 70.04325, 131.8625 -13662, 66.82989, 136.6633 -13663, 66.06785, 119.3338 -13664, 66.73451, 114.521 -13665, 68.59738, 131.6491 -13666, 67.93096, 118.3885 -13667, 68.29048, 140.8166 -13668, 65.61713, 136.7163 -13669, 68.83511, 133.5565 -13670, 68.41749, 121.6358 -13671, 68.29963, 125.9208 -13672, 67.07739, 120.9513 -13673, 65.28695, 127.0931 -13674, 69.56663, 132.7942 -13675, 69.96385, 139.112 -13676, 71.49172, 156.6047 -13677, 72.06918, 130.0836 -13678, 68.32088, 136.4392 -13679, 69.41193, 124.4338 -13680, 69.30554, 141.7445 -13681, 70.28825, 149.8366 -13682, 74.74047, 155.5462 -13683, 67.89908, 128.0993 -13684, 63.31957, 124.2271 -13685, 68.88209, 117.1974 -13686, 66.09881, 117.9989 -13687, 68.39956, 135.4289 -13688, 65.81467, 119.0041 -13689, 66.51669, 123.0958 -13690, 66.68897, 128.9492 -13691, 68.85866, 122.1515 -13692, 65.28602, 117.6903 -13693, 67.45382, 121.8754 -13694, 65.72572, 104.7868 -13695, 69.1809, 138.1944 -13696, 67.19123, 119.7814 -13697, 67.95791, 115.3964 -13698, 69.90153, 133.6208 -13699, 69.36667, 120.1496 -13700, 68.2609, 123.5765 -13701, 67.73458, 123.3573 -13702, 67.99545, 124.5313 -13703, 67.02058, 120.1386 -13704, 68.0984, 118.3992 -13705, 69.07483, 136.2293 -13706, 68.55788, 150.1478 -13707, 67.88128, 91.79628 -13708, 64.57218, 117.3649 -13709, 65.66127, 111.9679 -13710, 67.40301, 122.1909 -13711, 67.55072, 136.2613 -13712, 66.3712, 110.5685 -13713, 69.03177, 140.8798 -13714, 69.56693, 139.21 -13715, 67.997, 142.6499 -13716, 67.77191, 116.9825 -13717, 70.25823, 146.4642 -13718, 67.55181, 129.5468 -13719, 68.46142, 123.4447 -13720, 66.27821, 118.7967 -13721, 67.16134, 128.4656 -13722, 70.74503, 127.2149 -13723, 64.41245, 130.2909 -13724, 69.93806, 135.9627 -13725, 66.89486, 141.925 -13726, 69.35583, 129.5942 -13727, 70.31031, 115.0746 -13728, 65.16672, 108.6499 -13729, 66.13636, 116.5107 -13730, 69.9459, 118.4187 -13731, 65.77942, 130.5573 -13732, 65.37242, 123.4043 -13733, 67.52532, 112.6009 -13734, 65.66027, 130.1065 -13735, 68.08438, 125.6412 -13736, 70.20405, 141.2656 -13737, 68.09138, 126.8049 -13738, 69.8622, 130.7656 -13739, 71.2364, 165.4348 -13740, 67.73715, 118.1487 -13741, 68.97119, 139.1271 -13742, 65.20052, 116.3499 -13743, 68.44766, 143.052 -13744, 69.85374, 123.8261 -13745, 68.53738, 133.8745 -13746, 67.83017, 131.8549 -13747, 66.23251, 127.9094 -13748, 65.89304, 115.487 -13749, 65.6772, 121.1499 -13750, 66.76883, 136.4819 -13751, 69.74836, 122.1892 -13752, 66.02269, 110.8825 -13753, 67.8839, 142.7609 -13754, 67.9508, 132.0453 -13755, 68.08386, 129.7618 -13756, 67.34271, 116.0603 -13757, 68.1341, 112.7088 -13758, 70.01101, 140.5868 -13759, 67.81576, 132.5872 -13760, 71.44931, 152.6402 -13761, 66.86293, 132.6471 -13762, 66.96378, 97.03296 -13763, 70.86922, 142.2524 -13764, 66.07424, 124.2275 -13765, 63.1202, 131.0273 -13766, 66.13073, 123.7088 -13767, 68.49757, 128.567 -13768, 67.64703, 126.1548 -13769, 64.13542, 111.5291 -13770, 65.18415, 111.5203 -13771, 65.28989, 102.8829 -13772, 66.93899, 130.9771 -13773, 69.76519, 131.7523 -13774, 70.14971, 131.6752 -13775, 69.76427, 128.3103 -13776, 66.79976, 111.8919 -13777, 64.24878, 111.8224 -13778, 66.26232, 130.8118 -13779, 67.36842, 140.4376 -13780, 69.54224, 136.2962 -13781, 70.7088, 135.0448 -13782, 68.30583, 107.0114 -13783, 68.77584, 115.0584 -13784, 64.57222, 110.4544 -13785, 70.37127, 131.4099 -13786, 65.67011, 126.3269 -13787, 70.20753, 146.1756 -13788, 64.77025, 121.1153 -13789, 71.3765, 137.7634 -13790, 67.69573, 141.5469 -13791, 67.51762, 124.1185 -13792, 67.19765, 137.8119 -13793, 67.1093, 133.0114 -13794, 69.1917, 123.958 -13795, 69.15525, 119.1435 -13796, 69.86536, 121.2642 -13797, 66.32886, 127.9168 -13798, 67.86215, 121.1058 -13799, 68.27113, 116.4098 -13800, 65.76944, 126.6246 -13801, 67.92933, 130.5733 -13802, 71.2216, 123.3636 -13803, 66.912, 119.4482 -13804, 67.41402, 131.0606 -13805, 67.22463, 119.8691 -13806, 68.55061, 134.7133 -13807, 70.89052, 141.621 -13808, 64.97357, 100.993 -13809, 67.54977, 115.0079 -13810, 69.25733, 147.6032 -13811, 68.42616, 141.9304 -13812, 66.83894, 128.7245 -13813, 69.12521, 123.8116 -13814, 65.94202, 126.6764 -13815, 69.15548, 137.3675 -13816, 66.63132, 130.1165 -13817, 69.7449, 122.1703 -13818, 68.182, 125.3675 -13819, 63.34895, 108.9061 -13820, 65.91937, 120.2951 -13821, 68.34026, 117.7427 -13822, 69.17937, 147.5066 -13823, 65.73096, 124.0377 -13824, 65.25774, 137.7447 -13825, 66.95904, 117.1612 -13826, 67.46686, 102.788 -13827, 64.5303, 109.287 -13828, 68.22274, 106.3999 -13829, 69.74043, 149.3723 -13830, 66.82473, 115.1647 -13831, 66.7667, 106.6478 -13832, 66.60791, 104.4031 -13833, 66.22167, 106.6763 -13834, 66.96213, 126.4268 -13835, 70.45353, 144.5438 -13836, 71.72731, 127.6123 -13837, 69.12426, 136.6216 -13838, 68.64719, 125.4496 -13839, 65.7677, 112.6545 -13840, 69.92728, 137.5083 -13841, 66.95014, 131.6857 -13842, 68.99774, 143.0834 -13843, 71.31319, 127.6948 -13844, 65.88245, 131.4081 -13845, 68.39531, 117.7972 -13846, 69.5689, 133.7194 -13847, 69.82927, 127.2561 -13848, 67.95272, 111.2289 -13849, 68.98352, 133.427 -13850, 65.59897, 111.5773 -13851, 66.58067, 146.9392 -13852, 67.7046, 133.8558 -13853, 69.99147, 144.8165 -13854, 69.95446, 121.3657 -13855, 69.13713, 129.0169 -13856, 67.36034, 123.4454 -13857, 64.50897, 104.6736 -13858, 64.64068, 112.5689 -13859, 69.21305, 134.9969 -13860, 70.40988, 141.6769 -13861, 68.39682, 130.6472 -13862, 69.95437, 150.2712 -13863, 67.70414, 129.5662 -13864, 70.21315, 143.1277 -13865, 71.55881, 140.8115 -13866, 65.74844, 118.1262 -13867, 65.92318, 115.5208 -13868, 68.39851, 139.0805 -13869, 67.13347, 117.7219 -13870, 69.06374, 113.4222 -13871, 69.31382, 107.9401 -13872, 68.40244, 130.7315 -13873, 66.16601, 109.7068 -13874, 68.7271, 134.0751 -13875, 67.8651, 100.6523 -13876, 65.13709, 103.7386 -13877, 68.3908, 128.9968 -13878, 69.0989, 140.9024 -13879, 70.78829, 116.0327 -13880, 66.82614, 103.8567 -13881, 68.51919, 135.0276 -13882, 63.42416, 115.1669 -13883, 68.67133, 138.4376 -13884, 68.69668, 141.5566 -13885, 68.74929, 132.1818 -13886, 67.80121, 149.1847 -13887, 66.66077, 133.2206 -13888, 65.65457, 125.0592 -13889, 67.32239, 123.0962 -13890, 65.64744, 135.0891 -13891, 66.16885, 115.675 -13892, 68.84435, 129.7317 -13893, 70.3845, 132.3889 -13894, 64.15154, 121.0638 -13895, 65.93081, 121.1675 -13896, 66.42939, 124.7448 -13897, 67.0965, 128.85 -13898, 67.67338, 118.6532 -13899, 67.32413, 135.3278 -13900, 70.519, 129.3913 -13901, 66.28763, 124.8871 -13902, 66.89899, 131.4067 -13903, 68.60623, 129.9693 -13904, 65.64473, 111.3161 -13905, 67.57584, 116.4266 -13906, 67.27226, 117.229 -13907, 68.58803, 143.4394 -13908, 69.20003, 131.5186 -13909, 69.54645, 115.0614 -13910, 66.96253, 110.8142 -13911, 64.22288, 124.7478 -13912, 65.11698, 129.2592 -13913, 67.36456, 123.3457 -13914, 67.49718, 124.9092 -13915, 68.31028, 142.7313 -13916, 70.80122, 127.9696 -13917, 66.93479, 133.0576 -13918, 67.75842, 131.14 -13919, 63.81449, 119.4379 -13920, 68.51883, 132.3252 -13921, 70.23493, 125.7225 -13922, 68.61403, 133.7697 -13923, 68.03872, 136.8378 -13924, 69.29088, 122.7787 -13925, 71.26954, 135.0683 -13926, 64.91601, 110.2655 -13927, 67.18613, 124.0557 -13928, 70.79073, 125.8297 -13929, 69.88144, 129.0521 -13930, 66.10857, 122.8552 -13931, 70.34043, 129.3487 -13932, 70.71954, 128.7553 -13933, 68.49864, 113.5357 -13934, 64.68471, 118.1635 -13935, 67.81336, 125.1218 -13936, 67.32677, 116.7349 -13937, 70.80715, 139.2165 -13938, 68.27181, 133.8987 -13939, 67.79985, 144.0007 -13940, 70.24363, 127.7861 -13941, 69.0627, 108.916 -13942, 68.64606, 109.8435 -13943, 68.43749, 122.3513 -13944, 66.564, 118.0219 -13945, 68.73434, 132.5926 -13946, 70.34988, 131.2347 -13947, 68.32147, 132.9566 -13948, 68.85217, 150.0004 -13949, 70.0906, 138.4704 -13950, 71.53276, 125.8273 -13951, 68.42484, 131.4501 -13952, 68.58043, 122.8021 -13953, 68.58863, 121.4833 -13954, 66.78852, 125.8598 -13955, 71.05294, 140.8371 -13956, 67.87961, 119.2717 -13957, 68.17244, 135.1764 -13958, 70.42742, 141.1003 -13959, 67.19885, 119.4295 -13960, 68.59893, 123.1239 -13961, 68.32595, 117.3794 -13962, 65.62714, 121.2559 -13963, 70.04301, 154.9343 -13964, 68.38119, 122.0905 -13965, 67.52926, 126.9393 -13966, 68.10619, 124.0167 -13967, 65.46141, 108.8987 -13968, 67.06246, 128.834 -13969, 65.34267, 129.1537 -13970, 70.5704, 130.5011 -13971, 72.34839, 157.8066 -13972, 60.27836, 110.1138 -13973, 67.61855, 103.0198 -13974, 71.49569, 144.1566 -13975, 68.74794, 124.4705 -13976, 69.91849, 135.1641 -13977, 65.19504, 112.8648 -13978, 68.38232, 126.0162 -13979, 67.25518, 122.1221 -13980, 68.93483, 127.7623 -13981, 68.44699, 123.1308 -13982, 66.32658, 132.9695 -13983, 69.33376, 117.9713 -13984, 67.53281, 125.2872 -13985, 70.46549, 125.7753 -13986, 66.48216, 114.7755 -13987, 65.5645, 124.9968 -13988, 68.55191, 136.3553 -13989, 69.95594, 139.5419 -13990, 69.92062, 140.3966 -13991, 67.83218, 133.3225 -13992, 67.42913, 130.3175 -13993, 66.70177, 124.9376 -13994, 70.21284, 122.9461 -13995, 67.96958, 126.7309 -13996, 67.92194, 120.0718 -13997, 68.80637, 134.3642 -13998, 69.10289, 139.7602 -13999, 70.25784, 123.1635 -14000, 66.35824, 122.6852 -14001, 66.29874, 118.2763 -14002, 69.23979, 134.1059 -14003, 69.96459, 123.4101 -14004, 70.33325, 130.2675 -14005, 67.8791, 123.0713 -14006, 69.80115, 140.0347 -14007, 71.85087, 149.4641 -14008, 68.86095, 135.3824 -14009, 68.26626, 139.32 -14010, 68.22977, 132.8191 -14011, 68.87266, 134.2836 -14012, 68.69331, 119.1176 -14013, 69.50191, 124.9842 -14014, 67.13278, 126.6367 -14015, 68.07784, 112.9545 -14016, 65.60161, 132.3679 -14017, 66.25651, 108.6773 -14018, 65.57211, 117.4159 -14019, 69.01055, 100.181 -14020, 64.2501, 107.6959 -14021, 70.00883, 129.8113 -14022, 67.42102, 147.3407 -14023, 65.37725, 142.2231 -14024, 66.4546, 122.3176 -14025, 66.25961, 135.4493 -14026, 64.69471, 112.4972 -14027, 70.89926, 149.3595 -14028, 67.05572, 126.9729 -14029, 66.16531, 132.4495 -14030, 67.22303, 135.8181 -14031, 69.51503, 124.8695 -14032, 65.44081, 115.6159 -14033, 66.5001, 109.6408 -14034, 66.04055, 121.2501 -14035, 67.5518, 132.2297 -14036, 69.06258, 129.0295 -14037, 65.86704, 129.4721 -14038, 66.38913, 136.9183 -14039, 67.06884, 123.9572 -14040, 65.41938, 119.476 -14041, 70.53863, 128.5198 -14042, 66.42745, 128.774 -14043, 67.52661, 121.3385 -14044, 70.4217, 123.358 -14045, 69.38026, 130.7818 -14046, 66.94303, 134.8107 -14047, 66.50907, 123.5263 -14048, 67.29972, 128.9403 -14049, 69.81584, 139.2252 -14050, 67.38016, 120.8477 -14051, 67.70214, 126.4529 -14052, 69.10227, 130.6785 -14053, 67.94031, 121.4563 -14054, 68.26271, 123.7273 -14055, 67.5991, 132.0902 -14056, 70.1651, 143.8473 -14057, 68.83927, 134.9782 -14058, 68.96635, 117.2842 -14059, 67.11342, 128.5372 -14060, 67.68551, 121.7078 -14061, 66.45664, 123.3311 -14062, 66.89404, 106.7602 -14063, 69.61824, 120.5271 -14064, 74.04804, 149.6303 -14065, 69.64822, 142.7772 -14066, 68.92365, 115.4178 -14067, 67.36277, 119.6295 -14068, 68.34878, 134.3189 -14069, 66.00426, 128.4332 -14070, 69.14864, 126.6413 -14071, 68.49425, 117.5148 -14072, 68.06637, 134.2341 -14073, 72.93887, 144.9647 -14074, 66.18115, 132.6478 -14075, 67.99965, 119.7057 -14076, 66.96461, 117.8036 -14077, 67.74233, 137.5251 -14078, 67.25235, 127.1944 -14079, 68.93064, 118.6825 -14080, 67.66692, 122.408 -14081, 68.36323, 127.859 -14082, 68.5151, 124.2807 -14083, 68.59649, 126.3488 -14084, 67.89703, 117.1268 -14085, 68.54559, 123.3066 -14086, 68.57763, 130.224 -14087, 65.30062, 129.1373 -14088, 69.64468, 132.1716 -14089, 68.60546, 139.3675 -14090, 66.67257, 120.0443 -14091, 67.51525, 135.3145 -14092, 69.19989, 128.2222 -14093, 69.93288, 144.365 -14094, 67.73185, 129.3353 -14095, 69.01928, 126.148 -14096, 68.85323, 122.8646 -14097, 64.28729, 107.047 -14098, 72.16006, 143.1819 -14099, 67.89779, 141.3709 -14100, 69.10375, 122.7892 -14101, 65.65523, 137.5148 -14102, 68.82547, 117.8694 -14103, 68.48097, 122.2078 -14104, 66.68648, 117.8087 -14105, 66.62504, 126.9058 -14106, 64.97433, 103.1333 -14107, 61.90725, 78.56785 -14108, 66.97721, 139.1241 -14109, 66.48817, 111.8809 -14110, 66.08182, 128.2333 -14111, 67.8436, 120.26 -14112, 68.57876, 148.3076 -14113, 68.22504, 142.7289 -14114, 65.79376, 113.9473 -14115, 69.42855, 137.6963 -14116, 69.73313, 128.2394 -14117, 66.27846, 96.95428 -14118, 70.91261, 149.4527 -14119, 69.76864, 138.425 -14120, 66.6929, 123.4958 -14121, 67.84359, 138.9076 -14122, 69.76751, 123.4689 -14123, 70.53942, 148.3832 -14124, 68.88232, 134.5561 -14125, 67.76694, 132.0017 -14126, 69.68007, 115.6036 -14127, 70.30177, 114.5099 -14128, 68.39681, 131.135 -14129, 68.67559, 137.2308 -14130, 67.25836, 113.6762 -14131, 68.33766, 135.9751 -14132, 68.73641, 133.9187 -14133, 69.74424, 135.1867 -14134, 66.69188, 119.4333 -14135, 62.52876, 108.1177 -14136, 65.53571, 117.106 -14137, 66.18274, 115.6559 -14138, 69.41864, 117.3108 -14139, 67.08846, 119.7923 -14140, 65.80637, 134.2886 -14141, 70.23935, 147.1002 -14142, 65.33009, 112.1983 -14143, 65.74455, 121.3022 -14144, 68.90467, 126.1829 -14145, 69.09536, 121.7585 -14146, 68.01171, 130.9674 -14147, 67.90225, 120.5844 -14148, 67.34009, 123.8478 -14149, 66.46165, 108.9752 -14150, 66.75233, 134.2032 -14151, 70.18221, 120.1313 -14152, 66.7024, 122.7568 -14153, 67.3595, 128.4038 -14154, 69.08157, 123.6703 -14155, 70.2507, 132.496 -14156, 69.6539, 138.9897 -14157, 68.02248, 139.3765 -14158, 69.56277, 127.1687 -14159, 68.46777, 137.1892 -14160, 67.83868, 124.7676 -14161, 65.61422, 107.7261 -14162, 69.45527, 139.142 -14163, 66.28291, 126.9862 -14164, 67.56837, 129.8583 -14165, 70.12988, 120.9723 -14166, 68.93421, 124.3325 -14167, 68.81879, 126.6826 -14168, 65.99333, 130.4177 -14169, 66.81007, 127.9307 -14170, 67.94457, 124.4599 -14171, 71.4938, 145.451 -14172, 65.07798, 131.2823 -14173, 69.62029, 137.4994 -14174, 67.5144, 139.3524 -14175, 68.40947, 134.8715 -14176, 66.00603, 110.5781 -14177, 68.33191, 123.6727 -14178, 67.87778, 112.5046 -14179, 68.97539, 119.726 -14180, 68.35379, 130.8928 -14181, 67.18885, 139.5173 -14182, 64.66663, 125.7713 -14183, 70.8471, 141.3167 -14184, 65.85219, 123.4676 -14185, 65.77447, 117.2936 -14186, 67.52969, 133.6229 -14187, 67.40883, 137.1679 -14188, 66.12206, 126.2247 -14189, 67.61112, 133.3822 -14190, 65.59254, 128.3061 -14191, 66.38916, 121.0049 -14192, 68.18774, 121.2644 -14193, 66.10402, 112.9015 -14194, 67.64821, 122.4457 -14195, 66.43868, 125.0148 -14196, 63.50433, 117.6413 -14197, 67.40581, 140.1673 -14198, 68.88553, 144.6597 -14199, 64.19132, 109.6336 -14200, 64.87451, 124.6717 -14201, 67.55913, 128.8533 -14202, 71.62407, 143.172 -14203, 67.8134, 121.2207 -14204, 67.20623, 127.9349 -14205, 67.80392, 114.6993 -14206, 67.19869, 130.2931 -14207, 67.85377, 109.7363 -14208, 66.70262, 128.6075 -14209, 72.60211, 142.884 -14210, 68.85807, 120.9967 -14211, 69.56765, 121.9698 -14212, 66.10458, 120.3264 -14213, 67.18371, 132.8096 -14214, 71.11644, 128.7753 -14215, 70.62083, 144.7966 -14216, 66.12419, 120.1358 -14217, 68.95687, 150.6544 -14218, 65.39463, 119.9506 -14219, 70.83034, 134.1303 -14220, 68.86758, 132.4712 -14221, 68.49492, 132.0698 -14222, 72.26615, 149.0804 -14223, 65.71143, 105.5179 -14224, 67.46158, 105.7427 -14225, 68.12008, 114.3532 -14226, 69.77291, 140.5532 -14227, 67.17396, 104.8758 -14228, 69.58187, 149.3951 -14229, 64.85647, 112.4751 -14230, 66.92813, 113.5514 -14231, 66.84465, 116.7548 -14232, 66.43222, 115.7098 -14233, 70.39773, 142.9501 -14234, 69.64527, 112.6102 -14235, 67.05199, 112.1167 -14236, 66.43058, 144.3144 -14237, 67.29006, 127.7941 -14238, 67.97572, 123.5864 -14239, 68.42735, 105.5294 -14240, 66.59713, 131.487 -14241, 68.31497, 130.6901 -14242, 64.94728, 106.985 -14243, 68.8079, 138.3584 -14244, 71.29561, 144.5436 -14245, 66.60855, 110.2896 -14246, 71.44829, 138.6818 -14247, 69.38522, 126.5717 -14248, 69.28534, 138.3463 -14249, 67.09518, 104.3434 -14250, 66.14266, 127.4558 -14251, 65.73548, 122.9376 -14252, 68.80922, 119.2303 -14253, 66.25755, 123.4953 -14254, 67.38101, 118.9634 -14255, 65.25753, 123.4155 -14256, 67.71714, 114.8697 -14257, 65.88163, 125.7726 -14258, 65.66446, 123.9655 -14259, 66.97416, 129.4752 -14260, 68.27905, 114.2066 -14261, 66.07261, 114.2463 -14262, 67.56389, 110.8099 -14263, 67.94376, 116.0348 -14264, 64.40307, 105.3112 -14265, 69.2191, 123.4273 -14266, 67.70481, 140.9132 -14267, 65.15201, 129.0039 -14268, 67.30379, 135.3481 -14269, 66.98384, 114.4659 -14270, 68.08508, 109.06 -14271, 64.70474, 122.3172 -14272, 66.42674, 122.363 -14273, 66.91386, 125.1168 -14274, 67.22538, 114.5379 -14275, 70.21976, 134.8329 -14276, 71.3139, 132.3451 -14277, 65.53063, 116.6307 -14278, 69.46173, 134.8631 -14279, 66.22806, 118.1414 -14280, 70.16115, 124.8956 -14281, 68.41222, 135.25 -14282, 69.82319, 148.0173 -14283, 67.17432, 120.4157 -14284, 69.29115, 129.6002 -14285, 67.82581, 130.5398 -14286, 66.40623, 132.3121 -14287, 67.73226, 124.3289 -14288, 69.2642, 139.6425 -14289, 69.89742, 126.3862 -14290, 69.27103, 112.6904 -14291, 70.4306, 118.9721 -14292, 64.2193, 110.3825 -14293, 66.07677, 121.521 -14294, 68.1361, 124.7791 -14295, 64.23356, 105.3489 -14296, 65.91925, 119.0062 -14297, 69.39355, 138.3937 -14298, 67.73392, 125.8656 -14299, 69.48989, 129.9777 -14300, 67.33814, 132.0128 -14301, 66.07833, 126.8215 -14302, 65.98334, 117.0051 -14303, 66.44921, 124.4335 -14304, 69.69715, 147.0065 -14305, 67.12772, 133.4775 -14306, 66.57638, 129.6103 -14307, 68.47646, 159.4214 -14308, 66.73179, 124.7975 -14309, 69.19577, 145.742 -14310, 68.83063, 124.7159 -14311, 67.66406, 123.54 -14312, 65.43432, 124.2937 -14313, 66.14658, 113.9478 -14314, 67.8811, 128.1522 -14315, 68.13498, 119.9046 -14316, 67.73894, 135.291 -14317, 65.59068, 141.912 -14318, 67.95201, 133.4959 -14319, 69.19122, 135.3263 -14320, 69.51645, 140.1555 -14321, 68.74287, 121.1786 -14322, 66.52495, 123.7826 -14323, 69.12783, 145.0336 -14324, 67.94469, 126.01 -14325, 66.97412, 114.544 -14326, 68.3347, 118.5872 -14327, 67.80615, 125.4137 -14328, 68.84585, 118.6805 -14329, 66.41209, 123.1756 -14330, 70.29823, 112.5476 -14331, 69.26533, 146.1078 -14332, 66.6775, 112.6632 -14333, 67.20009, 134.6615 -14334, 66.72465, 123.5835 -14335, 68.44557, 117.5098 -14336, 68.83239, 124.6579 -14337, 69.08936, 140.3997 -14338, 67.16286, 116.5837 -14339, 67.39555, 132.9801 -14340, 66.28334, 116.9799 -14341, 68.24699, 117.2319 -14342, 64.78907, 113.6457 -14343, 64.50572, 106.108 -14344, 70.29401, 136.8676 -14345, 65.22177, 110.3999 -14346, 65.86641, 123.509 -14347, 66.10418, 99.16114 -14348, 68.80487, 119.6668 -14349, 69.24299, 131.5827 -14350, 66.09521, 110.0727 -14351, 71.18037, 150.4801 -14352, 68.1098, 124.4662 -14353, 68.53379, 134.3146 -14354, 63.70189, 109.2781 -14355, 66.46061, 122.5196 -14356, 68.8741, 127.0227 -14357, 66.09188, 142.6998 -14358, 65.6822, 134.6381 -14359, 68.95243, 126.922 -14360, 67.89356, 122.4413 -14361, 64.73622, 110.5326 -14362, 68.01956, 107.7515 -14363, 69.49761, 128.5874 -14364, 65.30787, 115.544 -14365, 70.31537, 115.9457 -14366, 67.79292, 120.1893 -14367, 66.2732, 114.6297 -14368, 68.62718, 152.5129 -14369, 69.24794, 125.3082 -14370, 66.17435, 127.7298 -14371, 68.1089, 100.4395 -14372, 68.11469, 101.8313 -14373, 70.97341, 139.3387 -14374, 69.87424, 132.6157 -14375, 71.52707, 147.3411 -14376, 68.44659, 129.7181 -14377, 66.41665, 144.0879 -14378, 67.10768, 120.6801 -14379, 69.32189, 138.5631 -14380, 68.39004, 118.9528 -14381, 65.45785, 129.6689 -14382, 72.09267, 137.1995 -14383, 67.60688, 133.6038 -14384, 66.92747, 122.0855 -14385, 70.1229, 116.8609 -14386, 69.09843, 127.5529 -14387, 67.41743, 122.343 -14388, 69.45134, 128.3776 -14389, 66.41985, 105.8868 -14390, 65.69863, 114.4188 -14391, 65.31739, 130.3437 -14392, 64.80359, 122.8058 -14393, 68.13705, 133.896 -14394, 70.08693, 130.9994 -14395, 64.03691, 107.6519 -14396, 67.33761, 118.6397 -14397, 71.8434, 136.2137 -14398, 69.1154, 118.8989 -14399, 65.39821, 90.24255 -14400, 65.70757, 135.8894 -14401, 69.66027, 116.0218 -14402, 68.84382, 133.186 -14403, 65.39271, 101.6976 -14404, 70.31722, 134.6496 -14405, 69.19909, 136.7189 -14406, 66.2882, 100.3062 -14407, 66.12228, 119.4939 -14408, 68.15336, 121.0773 -14409, 67.44349, 122.0805 -14410, 66.41455, 112.3032 -14411, 65.35315, 103.4902 -14412, 69.30321, 137.4465 -14413, 67.12751, 150.4042 -14414, 69.30029, 139.6598 -14415, 69.11462, 123.185 -14416, 69.26369, 129.9973 -14417, 66.93177, 107.3342 -14418, 70.80801, 126.0434 -14419, 66.77406, 135.7989 -14420, 65.86587, 126.4569 -14421, 66.72211, 121.3037 -14422, 64.44234, 116.1346 -14423, 69.67413, 135.2951 -14424, 64.92037, 107.1751 -14425, 67.63239, 133.8608 -14426, 68.70454, 137.8656 -14427, 68.82445, 111.7483 -14428, 68.93421, 113.9161 -14429, 70.01339, 139.3902 -14430, 71.44878, 119.4079 -14431, 66.91364, 126.6312 -14432, 68.4292, 122.169 -14433, 68.45391, 113.4185 -14434, 65.33618, 119.0882 -14435, 71.88803, 147.8657 -14436, 68.62216, 135.2735 -14437, 68.10589, 115.1755 -14438, 65.49264, 129.8366 -14439, 66.33612, 125.7748 -14440, 69.07199, 143.9889 -14441, 68.76917, 131.4778 -14442, 68.89473, 133.2498 -14443, 68.77062, 142.0926 -14444, 68.33215, 125.3459 -14445, 67.72393, 134.167 -14446, 65.49304, 103.0317 -14447, 71.06055, 138.7811 -14448, 69.50278, 120.9324 -14449, 68.61663, 125.2735 -14450, 68.54709, 133.5241 -14451, 69.26721, 157.2972 -14452, 70.14424, 119.6536 -14453, 65.9849, 140.6229 -14454, 66.281, 108.7205 -14455, 65.7289, 126.3947 -14456, 70.38391, 142.3535 -14457, 67.47381, 133.874 -14458, 66.16001, 128.3664 -14459, 66.57927, 120.7005 -14460, 69.6185, 134.1051 -14461, 65.77941, 117.2822 -14462, 69.46372, 125.2725 -14463, 63.93234, 99.99409 -14464, 70.09165, 134.6921 -14465, 64.94173, 98.26427 -14466, 68.09547, 109.3772 -14467, 68.83226, 134.4107 -14468, 66.96947, 128.823 -14469, 65.08668, 124.1525 -14470, 69.08362, 131.3282 -14471, 66.0827, 116.0096 -14472, 67.05865, 110.0584 -14473, 68.9081, 108.0602 -14474, 66.81199, 119.9277 -14475, 66.52751, 118.3217 -14476, 67.59674, 125.118 -14477, 68.57752, 127.8544 -14478, 65.15613, 125.1617 -14479, 69.88332, 136.8899 -14480, 67.76589, 131.4036 -14481, 69.48716, 122.6178 -14482, 68.99586, 118.7286 -14483, 71.62687, 154.9613 -14484, 68.30079, 143.765 -14485, 66.99909, 126.4922 -14486, 67.16066, 127.2396 -14487, 68.84511, 118.3629 -14488, 69.77163, 126.8724 -14489, 67.24519, 111.6843 -14490, 67.28553, 133.6576 -14491, 68.62133, 136.9199 -14492, 72.50636, 143.4605 -14493, 71.5681, 124.3189 -14494, 64.55855, 122.9763 -14495, 68.77468, 130.5148 -14496, 65.10069, 104.1238 -14497, 71.21872, 148.4113 -14498, 65.66079, 108.9173 -14499, 64.2657, 116.527 -14500, 68.88757, 107.0324 -14501, 68.44905, 146.4124 -14502, 70.33787, 155.1755 -14503, 71.22339, 140.4949 -14504, 65.94774, 133.6787 -14505, 67.91684, 128.4836 -14506, 65.97902, 129.7483 -14507, 69.27942, 146.3625 -14508, 68.53226, 126.4504 -14509, 71.2069, 123.6671 -14510, 67.2503, 125.7628 -14511, 65.30132, 131.154 -14512, 69.08772, 127.8638 -14513, 66.59265, 124.9371 -14514, 66.49666, 138.0897 -14515, 70.95412, 162.4844 -14516, 65.49834, 121.217 -14517, 69.39388, 124.5431 -14518, 65.27883, 118.9227 -14519, 67.52017, 134.0552 -14520, 68.14598, 111.6476 -14521, 68.81275, 136.0553 -14522, 67.89924, 114.0947 -14523, 69.5175, 136.6971 -14524, 68.07055, 129.4733 -14525, 71.2464, 149.7435 -14526, 68.71642, 121.0296 -14527, 63.99425, 114.3488 -14528, 67.65074, 126.7524 -14529, 66.52185, 133.1447 -14530, 67.39334, 124.7861 -14531, 72.31226, 150.9437 -14532, 68.0661, 104.7306 -14533, 65.20757, 114.5092 -14534, 70.31989, 137.4822 -14535, 66.73391, 126.6537 -14536, 67.2038, 124.1829 -14537, 68.97216, 136.0664 -14538, 67.7248, 132.6022 -14539, 69.56606, 120.6638 -14540, 67.86326, 148.5846 -14541, 69.23555, 130.78 -14542, 63.85084, 121.5242 -14543, 69.77742, 142.0076 -14544, 67.25759, 133.6365 -14545, 64.55164, 116.6069 -14546, 65.91736, 127.4018 -14547, 66.34956, 137.8456 -14548, 62.92407, 121.7441 -14549, 67.15032, 127.7838 -14550, 65.46455, 131.0676 -14551, 70.09519, 142.3265 -14552, 68.66443, 146.0821 -14553, 64.54016, 110.5523 -14554, 66.50297, 122.3483 -14555, 70.7413, 140.665 -14556, 67.63475, 118.3144 -14557, 65.29548, 102.0506 -14558, 67.6782, 136.8665 -14559, 68.11521, 131.2592 -14560, 66.43231, 109.4461 -14561, 67.45289, 135.255 -14562, 67.88061, 127.982 -14563, 65.27546, 127.3989 -14564, 71.80443, 142.3012 -14565, 68.32755, 119.5403 -14566, 68.86515, 115.9509 -14567, 67.11834, 110.0601 -14568, 66.53695, 122.495 -14569, 67.1505, 110.2815 -14570, 68.68724, 130.5799 -14571, 68.22897, 136.0111 -14572, 65.42104, 132.8507 -14573, 67.63027, 126.2376 -14574, 66.9449, 129.0043 -14575, 67.98826, 127.4057 -14576, 69.67882, 139.1821 -14577, 66.46151, 120.111 -14578, 66.54514, 126.768 -14579, 69.65715, 133.1626 -14580, 67.36842, 114.6626 -14581, 67.21698, 125.2345 -14582, 69.12349, 135.3012 -14583, 67.93756, 115.0436 -14584, 68.46766, 116.7778 -14585, 70.4462, 111.9601 -14586, 67.64692, 125.7248 -14587, 67.07315, 140.2758 -14588, 65.37352, 99.56696 -14589, 65.3428, 116.0859 -14590, 69.51448, 131.435 -14591, 69.33945, 126.1415 -14592, 66.86743, 124.1513 -14593, 65.10865, 126.4611 -14594, 72.1849, 144.6639 -14595, 69.02571, 141.4309 -14596, 65.04762, 112.8743 -14597, 69.27824, 148.6852 -14598, 69.11397, 136.755 -14599, 65.39362, 126.2681 -14600, 64.92242, 103.2442 -14601, 68.01742, 124.8878 -14602, 66.84525, 117.8475 -14603, 66.5209, 115.0964 -14604, 67.07104, 124.4466 -14605, 66.20762, 123.8278 -14606, 68.65422, 131.0723 -14607, 67.81484, 130.5051 -14608, 67.97735, 137.2246 -14609, 64.20041, 105.6563 -14610, 71.04071, 127.05 -14611, 71.69734, 131.2912 -14612, 67.752, 115.235 -14613, 69.64704, 149.9833 -14614, 69.3531, 128.1011 -14615, 68.69464, 136.1453 -14616, 67.23085, 122.6459 -14617, 69.33763, 124.0222 -14618, 65.86675, 128.6403 -14619, 68.70414, 130.2447 -14620, 68.64444, 118.1935 -14621, 68.6705, 118.7838 -14622, 66.83271, 134.949 -14623, 68.69297, 143.3212 -14624, 66.51348, 117.2734 -14625, 68.28119, 132.4379 -14626, 69.39405, 123.72 -14627, 67.3979, 129.8379 -14628, 72.86535, 125.1006 -14629, 67.52936, 138.9031 -14630, 64.60023, 106.0584 -14631, 69.98289, 134.2094 -14632, 70.333, 127.7615 -14633, 64.3196, 115.4439 -14634, 67.49125, 113.672 -14635, 67.80629, 118.8678 -14636, 65.30266, 104.9205 -14637, 70.81212, 133.9088 -14638, 68.19915, 117.0917 -14639, 69.13698, 140.5356 -14640, 66.59934, 144.2746 -14641, 70.58075, 131.9826 -14642, 66.90518, 105.7686 -14643, 66.74813, 115.058 -14644, 66.83292, 119.15 -14645, 69.35713, 151.3173 -14646, 68.63272, 128.2595 -14647, 69.12693, 125.7313 -14648, 67.0631, 128.2475 -14649, 67.46642, 124.2242 -14650, 66.60284, 131.8328 -14651, 70.1147, 135.0549 -14652, 70.12917, 131.9033 -14653, 68.76147, 131.2722 -14654, 70.05388, 150.4834 -14655, 68.16839, 122.3354 -14656, 67.51951, 119.7932 -14657, 68.27418, 132.6718 -14658, 67.30217, 113.9822 -14659, 66.31157, 128.2458 -14660, 70.05639, 121.4094 -14661, 70.24768, 140.4239 -14662, 69.86768, 123.2387 -14663, 68.9313, 112.5828 -14664, 67.73389, 134.9801 -14665, 67.93682, 113.7462 -14666, 67.92146, 130.6895 -14667, 70.4633, 118.4807 -14668, 68.16156, 131.5248 -14669, 68.81242, 144.2511 -14670, 70.05484, 125.4148 -14671, 65.61528, 111.0683 -14672, 70.77456, 124.4918 -14673, 68.13409, 134.5848 -14674, 68.87718, 135.3765 -14675, 66.85615, 114.1814 -14676, 65.19143, 115.6044 -14677, 69.53261, 134.0578 -14678, 71.28136, 135.9541 -14679, 66.47317, 106.9388 -14680, 69.85972, 137.5864 -14681, 66.56784, 120.5673 -14682, 64.99896, 121.0243 -14683, 65.5967, 131.1701 -14684, 65.11179, 119.3086 -14685, 72.43607, 137.4056 -14686, 66.27465, 129.0097 -14687, 67.6844, 118.539 -14688, 64.94671, 129.5048 -14689, 66.09981, 117.7368 -14690, 66.84125, 114.8767 -14691, 67.23393, 127.1033 -14692, 67.9501, 110.3671 -14693, 66.34338, 130.6015 -14694, 71.54739, 152.425 -14695, 71.10011, 133.8311 -14696, 66.80152, 124.965 -14697, 71.09075, 120.9877 -14698, 67.42631, 131.6672 -14699, 68.87576, 135.248 -14700, 67.6317, 118.7798 -14701, 65.61406, 138.9284 -14702, 67.09963, 113.8329 -14703, 68.15761, 119.3325 -14704, 67.06521, 104.9855 -14705, 67.00626, 138.5947 -14706, 69.21534, 133.6759 -14707, 65.49959, 119.6168 -14708, 67.12282, 131.6157 -14709, 66.27818, 129.3183 -14710, 68.05092, 129.3991 -14711, 71.21378, 150.0079 -14712, 65.8059, 128.0218 -14713, 69.01341, 127.8369 -14714, 64.38771, 103.3323 -14715, 71.28885, 132.8358 -14716, 68.01059, 136.4326 -14717, 67.40277, 131.675 -14718, 65.86277, 122.7182 -14719, 70.04407, 141.6413 -14720, 64.66349, 118.2509 -14721, 66.20468, 129.3437 -14722, 72.42652, 142.1927 -14723, 68.18756, 125.1862 -14724, 65.09832, 134.0936 -14725, 64.94607, 123.7487 -14726, 68.74582, 132.8903 -14727, 67.48779, 124.9625 -14728, 65.11114, 94.45359 -14729, 68.70291, 123.1642 -14730, 64.81203, 122.4859 -14731, 68.35035, 128.6184 -14732, 72.14415, 142.8257 -14733, 68.23639, 147.0343 -14734, 66.90007, 121.555 -14735, 68.96221, 145.2393 -14736, 69.44312, 119.8432 -14737, 65.04087, 131.9553 -14738, 67.33467, 126.2769 -14739, 70.00111, 139.7206 -14740, 65.86413, 114.5532 -14741, 66.76124, 121.4799 -14742, 68.6178, 138.031 -14743, 66.49285, 129.3542 -14744, 68.45981, 119.1174 -14745, 69.6046, 125.9209 -14746, 71.62721, 151.8017 -14747, 66.56949, 100.3424 -14748, 65.36772, 115.6658 -14749, 71.5466, 134.8652 -14750, 67.9212, 121.8751 -14751, 68.53005, 127.0172 -14752, 66.29177, 125.542 -14753, 70.0892, 148.1898 -14754, 66.45724, 137.0889 -14755, 66.90417, 124.4345 -14756, 71.96531, 160.8373 -14757, 65.79737, 111.0351 -14758, 71.99473, 135.4855 -14759, 67.88118, 125.1443 -14760, 67.9713, 132.0724 -14761, 66.68833, 124.6627 -14762, 69.08259, 120.4445 -14763, 67.7725, 120.6289 -14764, 67.54727, 127.846 -14765, 64.64468, 122.7172 -14766, 69.69364, 126.2985 -14767, 68.70439, 134.8945 -14768, 68.16991, 120.5405 -14769, 68.33163, 123.6751 -14770, 65.19663, 120.1252 -14771, 69.12973, 147.2327 -14772, 66.76336, 149.5213 -14773, 66.10726, 114.3077 -14774, 68.69461, 118.3486 -14775, 69.51345, 129.3136 -14776, 67.15638, 116.1097 -14777, 66.52538, 118.2619 -14778, 71.057, 150.4875 -14779, 69.19665, 124.4735 -14780, 66.76492, 120.8445 -14781, 68.09253, 121.9168 -14782, 67.35046, 129.862 -14783, 68.25237, 114.1292 -14784, 67.66866, 121.0367 -14785, 66.21079, 116.8308 -14786, 70.37472, 141.5234 -14787, 67.8132, 118.614 -14788, 66.42694, 115.2073 -14789, 68.20158, 114.2983 -14790, 68.77079, 135.0788 -14791, 70.60585, 124.6664 -14792, 68.09479, 129.3895 -14793, 64.8915, 121.5407 -14794, 67.12568, 137.1491 -14795, 69.97844, 129.5848 -14796, 67.77866, 130.9258 -14797, 71.39205, 144.5625 -14798, 67.96867, 144.8993 -14799, 72.76728, 158.5479 -14800, 73.38719, 154.6609 -14801, 69.32501, 135.3784 -14802, 66.65826, 124.0843 -14803, 68.63739, 137.5213 -14804, 70.10928, 126.2247 -14805, 68.39804, 141.12 -14806, 72.29783, 123.4305 -14807, 70.62523, 136.39 -14808, 71.44332, 141.1457 -14809, 70.41386, 133.5107 -14810, 64.86518, 114.7467 -14811, 68.80394, 111.0717 -14812, 69.49145, 138.1768 -14813, 66.01854, 113.5605 -14814, 70.48654, 127.2451 -14815, 66.80862, 125.5152 -14816, 70.6607, 132.6907 -14817, 66.68431, 104.9599 -14818, 65.58814, 132.2702 -14819, 66.36507, 124.7192 -14820, 67.09404, 97.52424 -14821, 66.48373, 109.9676 -14822, 68.82707, 132.1645 -14823, 64.69002, 114.4221 -14824, 69.01948, 113.5284 -14825, 69.43111, 141.7182 -14826, 70.07435, 133.3257 -14827, 66.8212, 121.7781 -14828, 68.06909, 129.9501 -14829, 69.6444, 124.8979 -14830, 64.80698, 121.6822 -14831, 67.37179, 125.3064 -14832, 67.39488, 108.6014 -14833, 68.39465, 118.6916 -14834, 68.4231, 156.2505 -14835, 69.41607, 124.4915 -14836, 66.82138, 120.3149 -14837, 65.58027, 109.5115 -14838, 71.02776, 160.1136 -14839, 67.8096, 141.57 -14840, 71.01235, 136.6575 -14841, 67.45353, 137.7991 -14842, 69.77346, 143.6829 -14843, 64.07515, 111.1404 -14844, 68.36516, 143.9045 -14845, 69.40935, 119.8486 -14846, 66.43953, 104.0047 -14847, 69.77091, 126.6292 -14848, 71.29182, 148.3832 -14849, 67.26889, 119.2626 -14850, 68.52627, 140.521 -14851, 63.95467, 100.0358 -14852, 68.27822, 114.3188 -14853, 69.01564, 129.8548 -14854, 68.33275, 131.6805 -14855, 65.91471, 111.3135 -14856, 65.5471, 119.9587 -14857, 66.88448, 124.6394 -14858, 67.50342, 116.6803 -14859, 71.35101, 148.2762 -14860, 66.5912, 128.9648 -14861, 65.14281, 105.1575 -14862, 67.26097, 128.2402 -14863, 68.77974, 134.0494 -14864, 66.92786, 125.5997 -14865, 70.20106, 154.8632 -14866, 68.1684, 109.4807 -14867, 65.9685, 121.0642 -14868, 69.2944, 139.0479 -14869, 68.18398, 115.8062 -14870, 67.3956, 138.3648 -14871, 69.32049, 127.5045 -14872, 66.66937, 120.5405 -14873, 68.62135, 145.4409 -14874, 69.82043, 135.6144 -14875, 68.00272, 139.2716 -14876, 69.35468, 129.8923 -14877, 70.19606, 147.7932 -14878, 69.94747, 138.2673 -14879, 69.48896, 117.94 -14880, 70.48888, 119.9716 -14881, 65.70003, 115.1262 -14882, 69.24694, 126.8539 -14883, 67.30239, 133.8636 -14884, 69.64951, 135.6532 -14885, 65.50558, 130.4526 -14886, 72.17516, 134.4131 -14887, 67.65538, 140.6611 -14888, 69.96429, 130.0129 -14889, 66.61309, 124.0167 -14890, 67.43982, 136.3044 -14891, 63.73814, 126.0077 -14892, 68.71436, 134.623 -14893, 70.77193, 133.9877 -14894, 69.37902, 141.4066 -14895, 68.95079, 137.57 -14896, 68.90363, 131.0382 -14897, 65.21203, 116.4051 -14898, 67.31722, 117.2372 -14899, 64.38819, 124.1841 -14900, 66.35807, 119.5823 -14901, 66.38672, 131.7982 -14902, 66.6684, 143.8648 -14903, 65.19706, 95.36862 -14904, 69.42103, 117.8366 -14905, 64.06378, 123.079 -14906, 68.24753, 133.6979 -14907, 68.89321, 133.5338 -14908, 70.65875, 141.7325 -14909, 66.17187, 132.7272 -14910, 69.79746, 139.5868 -14911, 69.39866, 149.026 -14912, 67.93777, 117.9616 -14913, 67.26378, 127.81 -14914, 67.44849, 139.9993 -14915, 68.57844, 127.3023 -14916, 68.18689, 116.6239 -14917, 71.21952, 142.336 -14918, 69.32096, 123.3451 -14919, 65.65913, 110.7946 -14920, 70.37, 143.1529 -14921, 64.79003, 131.5436 -14922, 65.92313, 97.29027 -14923, 66.73192, 128.011 -14924, 65.40144, 111.9967 -14925, 66.71355, 121.5899 -14926, 65.52829, 120.2156 -14927, 68.39107, 127.4346 -14928, 69.32446, 131.3958 -14929, 73.19305, 144.5579 -14930, 68.08406, 116.6268 -14931, 70.00156, 122.5793 -14932, 70.67706, 117.6249 -14933, 66.43552, 134.1497 -14934, 68.10398, 133.4111 -14935, 70.03197, 126.462 -14936, 64.56491, 114.9612 -14937, 68.39336, 132.7568 -14938, 68.0955, 127.074 -14939, 66.25512, 137.4863 -14940, 67.61981, 113.9223 -14941, 67.10991, 130.6669 -14942, 68.30287, 122.2908 -14943, 70.05068, 126.1234 -14944, 67.69089, 132.2541 -14945, 69.26578, 122.9495 -14946, 70.84848, 131.7416 -14947, 67.14127, 133.1617 -14948, 65.6565, 121.3197 -14949, 67.91043, 120.8734 -14950, 66.40429, 130.1516 -14951, 67.17903, 126.7042 -14952, 65.97607, 136.9425 -14953, 66.04298, 114.3685 -14954, 71.71449, 153.2031 -14955, 66.09004, 125.3156 -14956, 68.28237, 137.1149 -14957, 69.2815, 127.2959 -14958, 65.76268, 113.9716 -14959, 66.98438, 122.2353 -14960, 65.6529, 131.5253 -14961, 68.95828, 138.3287 -14962, 68.66489, 119.6475 -14963, 63.28472, 134.2575 -14964, 69.3378, 145.5026 -14965, 68.23957, 129.4421 -14966, 67.91304, 111.7014 -14967, 66.16765, 133.5217 -14968, 67.31495, 115.6811 -14969, 66.97137, 118.4895 -14970, 65.80597, 124.801 -14971, 66.79723, 118.5487 -14972, 65.12057, 115.9726 -14973, 66.84355, 123.2907 -14974, 68.38863, 110.792 -14975, 68.68709, 138.8422 -14976, 71.59953, 129.4179 -14977, 68.32022, 137.7368 -14978, 68.31, 108.7164 -14979, 66.47004, 122.2851 -14980, 68.12458, 130.3549 -14981, 72.0858, 138.3812 -14982, 68.82191, 114.476 -14983, 66.5675, 113.8546 -14984, 70.19345, 131.3116 -14985, 68.39855, 142.0522 -14986, 68.23971, 132.4932 -14987, 71.56445, 137.2813 -14988, 68.85791, 137.9349 -14989, 70.46101, 133.3018 -14990, 68.19618, 119.5517 -14991, 67.34632, 123.2255 -14992, 67.57452, 119.1006 -14993, 70.49071, 137.8164 -14994, 69.00788, 133.1503 -14995, 69.18618, 120.7711 -14996, 69.27963, 134.9563 -14997, 68.30928, 132.4946 -14998, 69.85509, 112.2776 -14999, 66.99205, 154.8623 -15000, 68.83483, 132.5996 -15001, 65.51992, 111.0786 -15002, 69.3211, 128.1426 -15003, 64.91352, 132.2049 -15004, 67.44463, 136.2209 -15005, 68.36722, 135.6455 -15006, 65.47213, 83.33859 -15007, 69.36933, 134.65 -15008, 69.54885, 134.6695 -15009, 65.32827, 114.8547 -15010, 67.09904, 118.2642 -15011, 66.42256, 133.6799 -15012, 71.0263, 128.2917 -15013, 69.2985, 121.2343 -15014, 66.85983, 116.8298 -15015, 65.68344, 116.4899 -15016, 68.44039, 131.2274 -15017, 66.09236, 124.9588 -15018, 66.89796, 105.0615 -15019, 67.65639, 126.238 -15020, 69.01429, 132.3267 -15021, 67.95663, 134.3919 -15022, 62.63031, 98.87507 -15023, 70.47594, 118.9593 -15024, 70.99287, 132.9842 -15025, 68.86312, 137.4119 -15026, 71.61657, 126.9508 -15027, 65.17342, 110.3023 -15028, 66.6864, 134.4681 -15029, 68.20849, 133.9785 -15030, 67.12074, 115.4099 -15031, 68.43384, 124.156 -15032, 67.80769, 139.6569 -15033, 69.55436, 126.1296 -15034, 69.626, 130.6209 -15035, 66.73544, 127.3142 -15036, 66.85735, 115.6542 -15037, 68.73859, 114.5677 -15038, 67.84689, 129.8946 -15039, 67.12274, 132.4266 -15040, 65.01406, 124.2521 -15041, 67.47471, 102.7244 -15042, 67.25719, 144.0751 -15043, 67.24826, 127.6367 -15044, 66.30738, 104.6319 -15045, 67.41475, 125.3851 -15046, 66.58363, 126.1534 -15047, 65.93812, 104.2595 -15048, 69.80661, 115.1499 -15049, 68.54967, 139.205 -15050, 70.66876, 133.3968 -15051, 68.59748, 123.4007 -15052, 69.92431, 124.9688 -15053, 69.29221, 140.663 -15054, 70.8323, 114.6896 -15055, 69.47654, 150.3265 -15056, 65.12741, 109.1273 -15057, 66.52541, 100.9191 -15058, 66.75392, 109.0707 -15059, 67.60759, 132.4966 -15060, 70.49105, 131.9175 -15061, 62.95883, 122.8187 -15062, 67.16728, 126.6304 -15063, 67.37938, 115.0117 -15064, 66.73605, 120.1152 -15065, 66.50685, 120.364 -15066, 66.30539, 103.8522 -15067, 69.84097, 139.6097 -15068, 68.43171, 111.0371 -15069, 70.21848, 113.2947 -15070, 67.94852, 118.2123 -15071, 67.36696, 118.6315 -15072, 69.06908, 146.7647 -15073, 64.44615, 113.4007 -15074, 65.42316, 122.9447 -15075, 66.9796, 129.0708 -15076, 69.01274, 116.1521 -15077, 67.59833, 136.7678 -15078, 65.9525, 130.6652 -15079, 67.12379, 125.5072 -15080, 70.19532, 126.5499 -15081, 69.38455, 131.5782 -15082, 69.88289, 143.9437 -15083, 66.33476, 124.6417 -15084, 69.86933, 127.138 -15085, 69.17547, 142.2736 -15086, 63.69076, 100.3788 -15087, 68.94349, 112.6258 -15088, 67.82915, 103.9962 -15089, 68.71299, 133.2248 -15090, 71.78816, 143.102 -15091, 70.80693, 142.3487 -15092, 67.04918, 116.1558 -15093, 70.7374, 143.0558 -15094, 63.99731, 102.6267 -15095, 68.44638, 132.1454 -15096, 64.8252, 117.1635 -15097, 70.32462, 131.8657 -15098, 70.20879, 163.8728 -15099, 68.04153, 137.4699 -15100, 68.99917, 129.7717 -15101, 67.06517, 120.3846 -15102, 69.51164, 124.2078 -15103, 63.43652, 126.3691 -15104, 70.20568, 136.4101 -15105, 67.06886, 127.1024 -15106, 70.71333, 141.4736 -15107, 66.53558, 133.3857 -15108, 66.33691, 123.5988 -15109, 66.76051, 131.4503 -15110, 69.23838, 126.2803 -15111, 64.43238, 92.31443 -15112, 67.65387, 114.1495 -15113, 65.28297, 121.8429 -15114, 67.29254, 122.4833 -15115, 66.67426, 108.0738 -15116, 67.18934, 126.9589 -15117, 68.86103, 148.8058 -15118, 65.91764, 136.8749 -15119, 67.48274, 137.6678 -15120, 65.86101, 123.4096 -15121, 69.58332, 131.3107 -15122, 66.48236, 121.0822 -15123, 67.12587, 130.7108 -15124, 68.03928, 118.5115 -15125, 70.60422, 133.7741 -15126, 67.35277, 134.1125 -15127, 64.96602, 124.6932 -15128, 69.73659, 126.8534 -15129, 67.85001, 116.5084 -15130, 67.11269, 137.5854 -15131, 68.91724, 126.4464 -15132, 66.10288, 143.3539 -15133, 66.92685, 114.6862 -15134, 67.62461, 123.238 -15135, 67.68375, 146.636 -15136, 69.69504, 131.1339 -15137, 67.53015, 109.7927 -15138, 66.49217, 112.7151 -15139, 67.49556, 115.8608 -15140, 65.22979, 118.5155 -15141, 65.14555, 109.0792 -15142, 69.96429, 118.1581 -15143, 66.96921, 119.725 -15144, 72.68406, 140.7454 -15145, 70.62989, 143.2336 -15146, 66.28962, 127.5244 -15147, 66.87942, 118.188 -15148, 69.63736, 138.7506 -15149, 72.13221, 133.896 -15150, 67.64678, 116.0453 -15151, 66.29793, 130.1744 -15152, 66.24001, 114.7215 -15153, 69.04627, 123.7546 -15154, 68.95959, 124.4974 -15155, 67.50624, 145.7484 -15156, 67.53604, 137.2567 -15157, 68.20346, 121.3491 -15158, 67.12901, 119.374 -15159, 67.57283, 123.2969 -15160, 66.67624, 140.9397 -15161, 65.26043, 101.1571 -15162, 69.96595, 142.8463 -15163, 69.89433, 130.4151 -15164, 69.40222, 126.5053 -15165, 69.38557, 139.4706 -15166, 68.37978, 126.2987 -15167, 69.18198, 139.8423 -15168, 71.88614, 134.319 -15169, 69.07546, 114.2239 -15170, 66.55796, 117.9522 -15171, 65.84951, 135.0075 -15172, 69.30328, 128.4679 -15173, 70.56769, 137.2495 -15174, 65.70932, 124.1531 -15175, 68.28887, 129.7135 -15176, 68.64234, 126.0445 -15177, 66.48124, 124.1437 -15178, 66.33382, 128.3406 -15179, 67.14291, 110.4774 -15180, 68.01799, 131.4676 -15181, 67.99908, 132.4317 -15182, 66.54521, 125.3635 -15183, 66.48652, 133.496 -15184, 68.49951, 106.7804 -15185, 67.05746, 140.4379 -15186, 67.81343, 122.49 -15187, 70.76865, 141.9201 -15188, 67.35674, 119.6444 -15189, 66.58169, 140.4575 -15190, 68.81841, 115.7801 -15191, 67.78353, 138.1807 -15192, 70.59967, 133.0057 -15193, 66.17798, 117.8164 -15194, 64.52454, 122.6902 -15195, 69.19398, 124.8873 -15196, 72.00347, 115.7439 -15197, 68.22649, 135.6941 -15198, 64.9649, 110.6567 -15199, 68.72693, 140.5141 -15200, 65.62412, 102.6406 -15201, 67.93149, 119.2796 -15202, 68.15359, 136.3666 -15203, 67.10444, 119.5672 -15204, 66.78636, 115.2495 -15205, 67.47237, 119.3153 -15206, 69.15877, 134.0016 -15207, 66.94609, 124.1271 -15208, 64.64516, 121.6082 -15209, 68.23103, 119.5605 -15210, 74.59993, 147.0372 -15211, 69.17074, 116.6371 -15212, 64.4579, 106.3788 -15213, 67.89229, 136.952 -15214, 67.93228, 139.162 -15215, 65.63166, 124.0105 -15216, 69.93332, 151.8863 -15217, 67.06235, 119.6547 -15218, 68.72155, 134.1575 -15219, 67.99221, 120.0651 -15220, 69.48024, 131.2464 -15221, 69.63642, 134.5954 -15222, 68.6781, 113.8461 -15223, 68.93508, 135.1919 -15224, 65.25731, 113.4053 -15225, 69.55037, 150.3096 -15226, 64.50942, 126.2417 -15227, 66.76791, 105.8579 -15228, 68.19097, 119.0327 -15229, 71.36573, 149.988 -15230, 71.51642, 134.707 -15231, 70.1695, 143.5692 -15232, 67.27132, 113.8254 -15233, 63.92789, 122.9493 -15234, 70.109, 114.8256 -15235, 70.32118, 130.2398 -15236, 68.62967, 125.1725 -15237, 64.68249, 116.3063 -15238, 65.62406, 127.038 -15239, 68.33608, 130.0088 -15240, 68.15973, 128.8837 -15241, 66.39703, 129.2909 -15242, 68.7637, 133.8946 -15243, 62.73218, 115.6746 -15244, 67.25989, 119.323 -15245, 67.31674, 127.174 -15246, 70.01359, 144.3033 -15247, 66.29943, 123.5503 -15248, 69.3621, 134.9359 -15249, 67.36081, 126.2309 -15250, 66.67762, 117.7297 -15251, 67.48578, 118.3315 -15252, 69.01325, 126.9036 -15253, 68.93436, 113.2651 -15254, 67.98407, 142.2802 -15255, 64.70492, 113.5925 -15256, 68.71176, 142.4521 -15257, 66.65959, 121.0303 -15258, 67.62403, 118.5923 -15259, 69.56171, 137.7018 -15260, 66.20244, 118.5927 -15261, 69.69845, 133.8294 -15262, 64.18408, 128.3516 -15263, 67.04695, 116.5957 -15264, 65.07655, 112.7787 -15265, 66.54927, 119.9512 -15266, 64.94199, 118.4685 -15267, 70.72113, 138.7877 -15268, 65.72731, 105.9051 -15269, 70.72856, 132.1233 -15270, 69.73747, 142.4348 -15271, 70.38866, 118.807 -15272, 66.2377, 127.8696 -15273, 69.15005, 119.5495 -15274, 71.55308, 143.2831 -15275, 67.3427, 120.6477 -15276, 70.81002, 147.7208 -15277, 68.94879, 134.6874 -15278, 67.83322, 107.5648 -15279, 66.80215, 115.2344 -15280, 62.38539, 105.2355 -15281, 70.19469, 134.5963 -15282, 68.78438, 134.1788 -15283, 69.24853, 109.9131 -15284, 70.30374, 125.2977 -15285, 70.82191, 129.2991 -15286, 71.00821, 146.8951 -15287, 68.13521, 130.0498 -15288, 69.55141, 125.0764 -15289, 66.80746, 99.00428 -15290, 64.38131, 117.1049 -15291, 68.01762, 114.3042 -15292, 69.57085, 124.6849 -15293, 67.64249, 131.7347 -15294, 67.09186, 115.918 -15295, 71.33608, 136.9999 -15296, 68.33188, 134.8577 -15297, 68.19698, 141.5204 -15298, 71.61186, 138.5029 -15299, 68.58219, 125.3785 -15300, 69.51224, 127.0237 -15301, 68.94224, 121.7044 -15302, 67.56831, 130.4685 -15303, 62.70761, 121.0772 -15304, 69.65338, 144.7186 -15305, 69.17779, 123.8314 -15306, 69.1034, 128.4483 -15307, 66.22062, 142.7467 -15308, 63.90675, 120.7712 -15309, 68.0134, 142.6934 -15310, 67.39766, 124.2776 -15311, 67.86913, 123.3232 -15312, 68.93266, 109.3652 -15313, 64.65561, 129.5612 -15314, 67.64286, 116.2336 -15315, 68.5499, 144.1276 -15316, 66.47408, 122.8267 -15317, 65.95487, 112.2416 -15318, 66.32695, 113.5088 -15319, 68.26741, 123.2998 -15320, 70.78463, 134.7647 -15321, 70.4697, 139.8125 -15322, 64.96269, 122.9922 -15323, 68.34706, 130.6799 -15324, 73.07882, 147.7522 -15325, 70.32529, 134.3631 -15326, 72.11328, 143.5666 -15327, 72.90519, 139.1213 -15328, 64.87304, 118.9879 -15329, 68.88989, 123.4282 -15330, 69.17388, 122.9818 -15331, 66.71493, 123.5503 -15332, 67.02678, 140.1351 -15333, 67.30884, 118.4517 -15334, 62.58703, 102.193 -15335, 68.64869, 129.519 -15336, 67.74901, 120.7554 -15337, 71.64536, 122.4384 -15338, 66.66707, 121.7723 -15339, 68.299, 127.1307 -15340, 67.18546, 119.8945 -15341, 67.60484, 145.6195 -15342, 67.42626, 110.1731 -15343, 66.47848, 117.1419 -15344, 70.4336, 135.951 -15345, 66.14942, 114.8362 -15346, 65.24499, 133.7044 -15347, 68.29032, 124.673 -15348, 68.78918, 132.8131 -15349, 69.25119, 130.8556 -15350, 67.81337, 131.5901 -15351, 67.14685, 129.0973 -15352, 66.38206, 119.9348 -15353, 69.90033, 135.8803 -15354, 69.87924, 147.5404 -15355, 67.05535, 123.0133 -15356, 69.92107, 150.7238 -15357, 66.75984, 108.9817 -15358, 66.63653, 106.6289 -15359, 68.95163, 126.1426 -15360, 70.80464, 141.4493 -15361, 70.82565, 142.3535 -15362, 65.81239, 142.3511 -15363, 68.58827, 121.4297 -15364, 69.97348, 121.2647 -15365, 65.8631, 120.7951 -15366, 67.18395, 137.6251 -15367, 65.3295, 112.2046 -15368, 70.54919, 143.444 -15369, 64.27425, 115.4872 -15370, 70.23423, 129.5721 -15371, 68.52809, 140.6879 -15372, 66.50366, 132.8973 -15373, 66.6848, 109.0765 -15374, 68.96487, 122.8685 -15375, 65.95854, 122.3757 -15376, 71.1723, 127.8293 -15377, 70.53792, 125.9055 -15378, 68.59623, 121.8365 -15379, 63.09214, 105.3814 -15380, 70.15201, 128.9654 -15381, 69.93896, 135.1878 -15382, 68.3899, 150.545 -15383, 66.77273, 118.2023 -15384, 68.0307, 112.1099 -15385, 68.32284, 117.0799 -15386, 68.70199, 135.324 -15387, 69.18134, 134.7164 -15388, 70.76125, 131.4654 -15389, 67.4487, 138.5211 -15390, 65.80367, 112.9028 -15391, 67.84868, 135.7776 -15392, 70.37215, 117.2445 -15393, 68.05707, 115.4099 -15394, 67.83306, 122.5637 -15395, 68.36174, 128.5694 -15396, 67.68101, 117.5547 -15397, 65.56852, 116.2469 -15398, 65.84858, 118.0476 -15399, 67.48284, 113.4292 -15400, 68.15474, 127.9674 -15401, 67.60055, 115.2546 -15402, 66.3466, 136.7939 -15403, 68.00428, 141.7709 -15404, 65.89079, 111.1971 -15405, 69.71858, 129.3685 -15406, 66.92519, 123.8781 -15407, 67.86156, 134.4959 -15408, 72.30671, 145.3807 -15409, 69.04887, 132.7148 -15410, 68.37203, 137.6722 -15411, 69.46166, 129.7161 -15412, 64.55413, 109.6147 -15413, 62.91846, 111.747 -15414, 69.66751, 114.9432 -15415, 68.7226, 114.1321 -15416, 66.99763, 119.7136 -15417, 67.96265, 129.548 -15418, 62.54756, 102.5937 -15419, 67.69388, 115.6799 -15420, 68.17765, 125.0763 -15421, 66.84001, 140.2859 -15422, 70.49117, 127.9204 -15423, 64.38355, 115.77 -15424, 67.4107, 115.8599 -15425, 68.71162, 136.6454 -15426, 69.38429, 112.8169 -15427, 68.19334, 121.7475 -15428, 67.66466, 120.6145 -15429, 68.85946, 136.1552 -15430, 70.88504, 132.1232 -15431, 68.90069, 128.3104 -15432, 69.74202, 148.7868 -15433, 65.32131, 122.75 -15434, 66.05517, 105.019 -15435, 67.46121, 124.1873 -15436, 66.97366, 119.5436 -15437, 71.24954, 125.3502 -15438, 66.25833, 105.2265 -15439, 65.33602, 127.9746 -15440, 67.81863, 124.7162 -15441, 68.88544, 123.1058 -15442, 68.50931, 123.0264 -15443, 68.59759, 132.1907 -15444, 69.57731, 143.1516 -15445, 69.94225, 131.2863 -15446, 68.32527, 127.9279 -15447, 67.709, 137.9562 -15448, 68.14718, 142.613 -15449, 69.38748, 135.7762 -15450, 67.74435, 131.3401 -15451, 70.22145, 133.1431 -15452, 67.57101, 127.27 -15453, 67.8206, 125.5015 -15454, 66.2936, 114.019 -15455, 68.27218, 119.0224 -15456, 67.90289, 140.4732 -15457, 71.51032, 134.635 -15458, 69.78562, 135.451 -15459, 67.5308, 123.7992 -15460, 68.60276, 140.7911 -15461, 72.9157, 137.3991 -15462, 68.39973, 114.1057 -15463, 68.743, 134.3778 -15464, 67.07172, 126.1538 -15465, 66.5829, 115.1352 -15466, 68.20199, 110.4711 -15467, 68.5013, 136.1652 -15468, 67.65171, 137.7229 -15469, 69.73023, 128.6487 -15470, 65.67533, 95.8643 -15471, 68.98154, 147.9151 -15472, 68.41366, 130.7171 -15473, 67.65729, 128.6169 -15474, 70.93404, 135.8496 -15475, 71.4025, 163.3466 -15476, 68.66985, 119.7289 -15477, 67.29176, 131.9414 -15478, 69.39537, 129.0571 -15479, 67.96799, 121.7029 -15480, 66.18912, 112.539 -15481, 69.42809, 133.8009 -15482, 67.49189, 117.2768 -15483, 68.53399, 120.6305 -15484, 69.81642, 119.9056 -15485, 68.63746, 127.091 -15486, 68.8994, 131.4347 -15487, 67.9315, 105.7268 -15488, 71.5028, 119.767 -15489, 67.15119, 127.6184 -15490, 69.00578, 123.6567 -15491, 71.94177, 158.7778 -15492, 64.97172, 133.6738 -15493, 66.55485, 134.9888 -15494, 68.68354, 132.3782 -15495, 68.36506, 124.8407 -15496, 64.1255, 115.6005 -15497, 66.19137, 129.8423 -15498, 64.14117, 121.0525 -15499, 67.96989, 133.8695 -15500, 69.18067, 133.8081 -15501, 69.19612, 119.4294 -15502, 73.29095, 153.6943 -15503, 69.45026, 117.4511 -15504, 70.48029, 146.3542 -15505, 65.61927, 127.5175 -15506, 66.73212, 120.9633 -15507, 66.97858, 135.7225 -15508, 65.35568, 131.9 -15509, 66.13306, 132.2003 -15510, 66.19537, 111.411 -15511, 69.60618, 115.0129 -15512, 64.85576, 131.9602 -15513, 66.14641, 117.3194 -15514, 68.06858, 147.1991 -15515, 68.42537, 139.2146 -15516, 64.72761, 113.471 -15517, 67.12449, 120.4451 -15518, 68.2669, 120.1299 -15519, 64.63001, 130.0922 -15520, 65.93702, 123.0907 -15521, 69.72134, 134.9164 -15522, 67.2083, 115.8391 -15523, 72.91999, 154.2153 -15524, 69.98652, 129.3433 -15525, 67.19622, 109.1018 -15526, 68.80471, 121.8463 -15527, 68.95943, 131.1717 -15528, 70.71013, 107.6082 -15529, 69.31161, 110.585 -15530, 68.37667, 139.5479 -15531, 65.87762, 108.2863 -15532, 67.57576, 137.937 -15533, 69.04748, 120.0193 -15534, 64.96906, 130.7477 -15535, 65.00848, 112.3542 -15536, 69.66271, 112.7833 -15537, 68.36325, 93.56304 -15538, 67.78303, 135.3219 -15539, 68.35589, 130.4797 -15540, 69.08049, 137.2105 -15541, 66.18595, 116.7954 -15542, 69.8707, 127.2318 -15543, 68.14345, 119.3634 -15544, 71.50856, 147.4461 -15545, 67.58713, 152.0826 -15546, 69.32161, 127.0991 -15547, 64.32043, 101.6548 -15548, 70.04715, 129.3431 -15549, 67.95275, 120.5799 -15550, 69.3643, 115.9751 -15551, 65.61191, 115.1222 -15552, 66.45951, 117.4793 -15553, 67.01312, 116.3448 -15554, 67.15306, 133.1964 -15555, 68.38756, 123.0091 -15556, 66.91337, 123.0284 -15557, 69.39488, 125.889 -15558, 67.43209, 136.7256 -15559, 67.25651, 125.2836 -15560, 70.1574, 129.8738 -15561, 68.21801, 145.046 -15562, 66.54598, 131.5953 -15563, 67.91875, 134.6972 -15564, 65.47246, 125.9926 -15565, 68.64399, 123.5308 -15566, 67.54097, 133.869 -15567, 67.67111, 127.5556 -15568, 67.54769, 129.9528 -15569, 68.83269, 116.6869 -15570, 66.9893, 116.2079 -15571, 68.12926, 139.5733 -15572, 67.21663, 117.1835 -15573, 66.64897, 119.2815 -15574, 67.21762, 127.3762 -15575, 66.21812, 121.0712 -15576, 67.3438, 133.4411 -15577, 68.11292, 109.9029 -15578, 69.87913, 127.7891 -15579, 68.21125, 138.5343 -15580, 65.68767, 141.1901 -15581, 65.99233, 113.6949 -15582, 67.60517, 102.2036 -15583, 65.90505, 139.2275 -15584, 70.34152, 127.0828 -15585, 66.07605, 120.0142 -15586, 65.77453, 126.9642 -15587, 65.71341, 112.0802 -15588, 68.57546, 141.1028 -15589, 67.93372, 112.6789 -15590, 67.70726, 136.6165 -15591, 69.36386, 143.3529 -15592, 70.64307, 133.4741 -15593, 69.04345, 143.0016 -15594, 69.57571, 154.5079 -15595, 67.52772, 136.2476 -15596, 66.33405, 120.4514 -15597, 65.23795, 115.1459 -15598, 71.71197, 127.5762 -15599, 66.40209, 110.5565 -15600, 66.41322, 123.2217 -15601, 65.24322, 132.3124 -15602, 69.37652, 144.9025 -15603, 66.97944, 116.5849 -15604, 66.94715, 116.96 -15605, 68.35779, 119.4615 -15606, 67.72118, 116.2328 -15607, 66.6547, 123.8393 -15608, 71.16116, 131.0291 -15609, 69.76995, 132.3991 -15610, 67.08047, 123.6803 -15611, 70.16271, 132.0564 -15612, 67.20725, 125.4732 -15613, 66.441, 109.2837 -15614, 70.43908, 128.0154 -15615, 67.42411, 117.7129 -15616, 67.23794, 115.5231 -15617, 65.54462, 116.0185 -15618, 68.58579, 131.2912 -15619, 71.46377, 140.9955 -15620, 67.02704, 152.026 -15621, 70.74595, 150.4723 -15622, 64.55871, 123.1474 -15623, 66.43466, 128.8558 -15624, 71.88538, 129.4843 -15625, 67.35006, 136.4792 -15626, 67.26021, 123.2473 -15627, 69.42105, 131.1226 -15628, 67.02923, 118.0796 -15629, 70.15598, 143.471 -15630, 68.16962, 123.4292 -15631, 69.33135, 118.6 -15632, 68.82239, 119.6967 -15633, 70.70061, 132.7463 -15634, 63.01405, 116.679 -15635, 70.79121, 129.9765 -15636, 70.10094, 140.6238 -15637, 67.68598, 113.3493 -15638, 70.44934, 130.0917 -15639, 68.47164, 143.6588 -15640, 69.22334, 147.1708 -15641, 69.05267, 126.3728 -15642, 69.22824, 128.1722 -15643, 69.30531, 140.5582 -15644, 67.3569, 114.6302 -15645, 68.14178, 133.9639 -15646, 67.50705, 127.7368 -15647, 68.87072, 139.0535 -15648, 67.27839, 134.3672 -15649, 66.97126, 116.9116 -15650, 67.27037, 121.5396 -15651, 66.01214, 116.2959 -15652, 65.90324, 117.2595 -15653, 65.97601, 115.5695 -15654, 65.01385, 117.3807 -15655, 68.3634, 126.2682 -15656, 66.71134, 130.885 -15657, 70.69657, 120.929 -15658, 70.69145, 134.6101 -15659, 71.82796, 136.3967 -15660, 65.57821, 112.8178 -15661, 67.87092, 141.7216 -15662, 69.38038, 135.5633 -15663, 69.34518, 139.0857 -15664, 67.16737, 134.124 -15665, 68.26749, 122.9496 -15666, 67.82439, 129.221 -15667, 63.97761, 114.6071 -15668, 68.59532, 135.5424 -15669, 65.85937, 131.0302 -15670, 65.73705, 112.9266 -15671, 68.55083, 137.6187 -15672, 66.17839, 125.057 -15673, 63.43905, 103.7247 -15674, 64.61373, 115.6394 -15675, 64.14292, 114.1789 -15676, 64.25756, 122.5431 -15677, 67.52237, 137.2828 -15678, 66.64326, 119.2689 -15679, 68.4414, 129.9912 -15680, 70.65253, 114.6167 -15681, 68.04596, 113.3741 -15682, 68.07645, 115.4976 -15683, 66.06383, 119.0574 -15684, 69.31688, 138.3508 -15685, 68.35005, 130.7714 -15686, 68.11006, 121.5984 -15687, 67.60474, 132.0105 -15688, 65.64374, 111.5052 -15689, 69.18597, 145.8104 -15690, 70.15414, 127.0499 -15691, 68.92615, 117.2627 -15692, 71.21385, 125.7487 -15693, 70.58186, 116.7541 -15694, 69.20943, 126.4311 -15695, 68.11377, 133.0339 -15696, 67.54765, 130.4505 -15697, 65.63714, 130.5983 -15698, 67.39903, 143.0303 -15699, 68.25314, 120.4308 -15700, 67.56373, 130.1949 -15701, 63.40403, 138.8565 -15702, 67.13774, 114.4542 -15703, 66.48756, 135.5376 -15704, 66.61374, 123.9797 -15705, 68.4256, 130.75 -15706, 71.18574, 143.5065 -15707, 67.99548, 104.9198 -15708, 68.42032, 129.021 -15709, 67.75353, 110.3398 -15710, 68.99095, 135.43 -15711, 66.73917, 118.7027 -15712, 73.15071, 147.0571 -15713, 66.71381, 115.7718 -15714, 67.26833, 122.3568 -15715, 69.68744, 146.7596 -15716, 71.24277, 150.5403 -15717, 67.21908, 128.3988 -15718, 67.04756, 129.4247 -15719, 68.03582, 133.8249 -15720, 66.73546, 123.987 -15721, 64.51386, 145.7486 -15722, 68.14688, 109.3535 -15723, 69.3206, 149.6076 -15724, 68.78965, 136.5204 -15725, 68.86876, 136.3434 -15726, 68.21886, 131.5544 -15727, 70.3612, 110.3731 -15728, 65.26249, 108.1267 -15729, 69.42921, 124.1743 -15730, 65.74235, 129.9598 -15731, 63.94659, 130.0202 -15732, 66.16987, 127.7085 -15733, 64.40661, 114.9881 -15734, 67.26361, 111.7895 -15735, 67.44707, 130.3438 -15736, 65.40338, 102.6185 -15737, 70.44362, 129.8482 -15738, 70.22944, 138.4534 -15739, 68.02875, 132.7304 -15740, 66.88354, 116.153 -15741, 68.52738, 108.5851 -15742, 68.12687, 127.3693 -15743, 69.64371, 137.753 -15744, 66.28769, 122.0997 -15745, 67.5751, 129.523 -15746, 68.65998, 123.6958 -15747, 65.92461, 120.7062 -15748, 70.10254, 139.5667 -15749, 66.8777, 132.8097 -15750, 70.26733, 136.3759 -15751, 65.16569, 137.0949 -15752, 67.89454, 133.6111 -15753, 67.6881, 131.3197 -15754, 63.98477, 117.5309 -15755, 73.2731, 120.6557 -15756, 67.38426, 148.594 -15757, 69.40435, 143.1126 -15758, 67.50653, 114.2218 -15759, 68.20742, 126.5535 -15760, 71.0084, 138.5358 -15761, 66.08852, 127.8555 -15762, 67.10118, 116.9214 -15763, 68.0587, 108.7064 -15764, 68.40527, 141.2409 -15765, 68.86958, 126.5546 -15766, 69.42117, 140.9856 -15767, 66.8765, 114.5692 -15768, 67.38679, 145.2286 -15769, 69.73443, 145.9757 -15770, 67.22426, 117.1126 -15771, 67.8476, 128.6058 -15772, 70.25478, 132.2171 -15773, 65.66468, 132.7203 -15774, 65.68942, 120.1367 -15775, 70.35956, 140.5765 -15776, 67.89833, 117.8036 -15777, 71.29145, 133.9801 -15778, 68.07826, 129.8407 -15779, 67.88304, 109.2468 -15780, 65.7471, 129.3293 -15781, 70.82378, 136.3718 -15782, 68.98715, 130.8191 -15783, 68.20438, 123.5732 -15784, 69.0132, 142.563 -15785, 65.20002, 100.3488 -15786, 65.63714, 135.9242 -15787, 69.41814, 121.004 -15788, 69.3546, 135.1652 -15789, 69.87385, 128.9834 -15790, 69.48099, 123.9738 -15791, 63.8773, 111.8653 -15792, 67.05966, 116.0247 -15793, 66.56715, 130.2285 -15794, 67.36107, 116.0479 -15795, 67.11625, 111.0254 -15796, 69.29711, 135.6468 -15797, 69.78731, 133.3097 -15798, 69.29322, 129.2499 -15799, 70.9491, 131.2845 -15800, 66.63025, 129.8742 -15801, 65.36933, 132.5488 -15802, 68.85029, 120.5336 -15803, 67.71967, 123.9878 -15804, 69.43243, 137.2161 -15805, 70.39465, 137.8235 -15806, 68.07996, 128.6478 -15807, 68.71273, 115.1458 -15808, 67.11097, 134.6806 -15809, 65.95239, 131.6371 -15810, 66.32713, 150.0352 -15811, 68.22637, 120.5216 -15812, 70.70513, 143.6464 -15813, 67.97221, 112.9209 -15814, 69.24506, 145.094 -15815, 69.11257, 129.4851 -15816, 64.77694, 114.4425 -15817, 67.58057, 117.4571 -15818, 69.07466, 130.3215 -15819, 70.55491, 145.2355 -15820, 66.22396, 109.8105 -15821, 64.38465, 109.9922 -15822, 69.10443, 130.7489 -15823, 66.15927, 144.2465 -15824, 66.80091, 112.0282 -15825, 68.97519, 128.6123 -15826, 68.97731, 133.5575 -15827, 71.23152, 142.6203 -15828, 68.61435, 140.4561 -15829, 62.37781, 124.7478 -15830, 66.18523, 121.0028 -15831, 68.24677, 133.8376 -15832, 68.39773, 128.4398 -15833, 69.75441, 131.3891 -15834, 67.40124, 110.1077 -15835, 66.15482, 121.3213 -15836, 67.53005, 146.2208 -15837, 67.82452, 132.4239 -15838, 68.04693, 132.7561 -15839, 66.67182, 107.1052 -15840, 66.66155, 127.8097 -15841, 63.09378, 126.804 -15842, 67.74892, 141.0813 -15843, 70.21034, 142.8787 -15844, 64.37686, 105.2929 -15845, 71.11437, 137.9506 -15846, 67.62251, 131.9704 -15847, 67.05012, 124.1539 -15848, 67.02249, 121.239 -15849, 66.0373, 107.355 -15850, 68.17467, 119.334 -15851, 68.12509, 125.4845 -15852, 67.9441, 129.4576 -15853, 65.23296, 134.0644 -15854, 66.99444, 134.4277 -15855, 69.08538, 127.8524 -15856, 68.18635, 121.5633 -15857, 72.32435, 131.5309 -15858, 68.13306, 110.3872 -15859, 66.18912, 112.8697 -15860, 69.37225, 124.8294 -15861, 66.07944, 134.7904 -15862, 66.44596, 118.9311 -15863, 67.61141, 113.2781 -15864, 68.53111, 131.2487 -15865, 68.06372, 123.56 -15866, 68.76919, 136.6776 -15867, 71.16472, 129.4277 -15868, 70.48029, 119.135 -15869, 70.28214, 134.233 -15870, 70.8243, 149.1779 -15871, 66.79418, 137.4535 -15872, 64.55907, 112.1905 -15873, 68.29073, 127.4853 -15874, 67.16584, 110.988 -15875, 68.85305, 131.1517 -15876, 68.67427, 126.2711 -15877, 70.50813, 129.325 -15878, 69.12074, 131.7384 -15879, 69.05772, 142.9574 -15880, 68.48742, 130.3869 -15881, 66.55005, 113.3649 -15882, 66.25859, 125.5129 -15883, 67.67373, 137.0173 -15884, 66.59621, 115.5486 -15885, 68.5454, 122.0308 -15886, 68.01326, 136.465 -15887, 71.39722, 145.4316 -15888, 65.66147, 113.4022 -15889, 69.0446, 121.1875 -15890, 66.10215, 121.1734 -15891, 68.29647, 140.8319 -15892, 68.92003, 137.5018 -15893, 69.63445, 137.2601 -15894, 68.19362, 122.2916 -15895, 67.68318, 110.2839 -15896, 68.81011, 135.7101 -15897, 67.44676, 125.4474 -15898, 67.81835, 114.9293 -15899, 69.42357, 138.1367 -15900, 69.66435, 135.0944 -15901, 70.1609, 118.3303 -15902, 67.91643, 134.0842 -15903, 69.72084, 129.8715 -15904, 66.27692, 123.4119 -15905, 68.83848, 108.7075 -15906, 66.70584, 128.4442 -15907, 69.88419, 146.8151 -15908, 69.77301, 136.3172 -15909, 67.31753, 118.5609 -15910, 70.62492, 136.7641 -15911, 66.38894, 118.7559 -15912, 67.15444, 127.4159 -15913, 68.86083, 121.9486 -15914, 65.47601, 119.0022 -15915, 67.33502, 125.7401 -15916, 68.45368, 113.8913 -15917, 67.32573, 130.848 -15918, 65.63352, 96.94675 -15919, 69.09134, 128.7349 -15920, 66.68162, 123.8286 -15921, 67.27892, 119.8219 -15922, 66.83412, 141.3197 -15923, 64.8425, 104.1389 -15924, 68.13785, 139.2758 -15925, 67.83599, 145.5619 -15926, 68.43267, 128.1718 -15927, 68.44093, 118.326 -15928, 68.90259, 135.902 -15929, 67.65946, 115.9803 -15930, 64.72884, 126.7694 -15931, 65.16943, 107.2528 -15932, 68.30429, 134.5369 -15933, 67.49387, 137.5206 -15934, 67.59123, 124.1155 -15935, 65.05233, 128.8537 -15936, 71.06411, 129.7451 -15937, 66.51821, 107.858 -15938, 68.41937, 122.5515 -15939, 69.47786, 129.6483 -15940, 66.99148, 126.63 -15941, 67.36273, 126.6374 -15942, 67.06229, 126.849 -15943, 65.89625, 136.3139 -15944, 70.22917, 145.3402 -15945, 65.93523, 118.384 -15946, 69.97458, 126.3133 -15947, 66.95063, 125.1891 -15948, 70.3091, 140.2088 -15949, 70.12037, 133.0408 -15950, 65.7668, 126.4413 -15951, 69.57565, 134.8488 -15952, 65.92296, 108.4948 -15953, 70.79414, 130.4189 -15954, 69.44383, 131.4925 -15955, 66.62863, 130.4575 -15956, 67.80396, 139.6093 -15957, 68.95013, 138.8719 -15958, 71.30744, 146.9161 -15959, 67.58884, 134.6915 -15960, 69.10194, 123.2658 -15961, 71.06352, 147.8189 -15962, 69.84568, 115.9428 -15963, 66.83921, 104.2683 -15964, 69.76971, 137.6183 -15965, 67.58215, 139.1822 -15966, 69.18909, 134.7638 -15967, 74.25069, 150.0567 -15968, 69.13383, 135.5109 -15969, 66.30129, 117.319 -15970, 68.25075, 124.1859 -15971, 70.71204, 156.4888 -15972, 65.20837, 110.58 -15973, 63.79465, 122.6602 -15974, 71.69954, 145.9436 -15975, 68.00717, 141.6695 -15976, 67.55854, 132.8552 -15977, 65.6403, 143.5714 -15978, 64.35459, 107.3014 -15979, 69.7329, 136.9779 -15980, 73.36407, 140.0662 -15981, 65.08527, 120.9151 -15982, 67.59317, 122.3761 -15983, 68.82592, 123.6124 -15984, 66.47578, 117.2748 -15985, 68.44873, 125.3048 -15986, 66.23119, 133.229 -15987, 66.32448, 116.0772 -15988, 67.293, 137.0363 -15989, 65.65561, 124.1935 -15990, 66.92149, 109.5993 -15991, 65.07498, 105.2216 -15992, 67.96785, 131.2363 -15993, 66.14877, 120.1462 -15994, 69.45894, 120.3336 -15995, 65.77765, 123.8685 -15996, 65.23996, 116.0991 -15997, 68.39398, 117.3044 -15998, 66.57914, 113.7488 -15999, 67.67032, 113.9851 -16000, 68.46821, 114.5627 -16001, 67.94276, 147.1207 -16002, 68.41071, 114.7406 -16003, 67.81453, 120.7329 -16004, 66.13517, 135.6964 -16005, 68.84075, 128.7526 -16006, 69.82133, 130.4452 -16007, 70.69125, 131.4881 -16008, 69.67354, 127.5423 -16009, 67.11306, 112.9442 -16010, 67.76652, 113.787 -16011, 67.98509, 117.4293 -16012, 66.10635, 119.1248 -16013, 70.25508, 130.6601 -16014, 69.69406, 127.8872 -16015, 70.62853, 154.1866 -16016, 66.46828, 115.0219 -16017, 65.83352, 118.1788 -16018, 69.43541, 133.457 -16019, 67.18957, 126.4289 -16020, 67.85753, 132.5879 -16021, 70.80011, 130.9031 -16022, 68.23846, 111.4887 -16023, 69.24097, 145.3706 -16024, 69.30102, 127.2747 -16025, 69.52276, 130.5737 -16026, 69.22084, 141.1106 -16027, 67.85295, 129.5885 -16028, 65.77801, 128.725 -16029, 66.55636, 124.4 -16030, 65.75154, 134.4078 -16031, 65.79782, 128.8091 -16032, 68.06347, 118.8537 -16033, 68.3986, 102.3968 -16034, 68.21292, 123.15 -16035, 66.66365, 130.5961 -16036, 65.77131, 112.8459 -16037, 64.85413, 117.4122 -16038, 69.30353, 158.2312 -16039, 67.96803, 111.7532 -16040, 68.60519, 137.1098 -16041, 66.8475, 123.4111 -16042, 67.11017, 116.3094 -16043, 69.15094, 129.7406 -16044, 66.13712, 106.6076 -16045, 66.42691, 138.0277 -16046, 70.39729, 118.1795 -16047, 68.66476, 137.9495 -16048, 70.14358, 133.6875 -16049, 66.8426, 130.6206 -16050, 70.37678, 133.2398 -16051, 68.74193, 116.7499 -16052, 65.41171, 110.589 -16053, 71.92922, 135.987 -16054, 69.84558, 130.0924 -16055, 68.54234, 139.991 -16056, 68.97866, 124.9344 -16057, 67.76261, 112.8224 -16058, 66.49068, 124.7065 -16059, 64.95423, 93.85997 -16060, 67.37242, 132.68 -16061, 71.21076, 136.9751 -16062, 69.7826, 130.0858 -16063, 69.90597, 139.7374 -16064, 70.10361, 151.6632 -16065, 68.52806, 128.6134 -16066, 67.44755, 124.6756 -16067, 68.69408, 121.506 -16068, 68.10934, 131.7102 -16069, 67.69214, 116.534 -16070, 67.63227, 116.31 -16071, 64.61927, 121.4863 -16072, 67.29108, 124.9753 -16073, 69.87057, 140.744 -16074, 67.21068, 135.6258 -16075, 67.51395, 106.5245 -16076, 66.91739, 120.4203 -16077, 69.39064, 147.6976 -16078, 68.90895, 136.3169 -16079, 67.95984, 113.1916 -16080, 67.44107, 126.8993 -16081, 68.93723, 131.1289 -16082, 68.20281, 138.466 -16083, 66.81433, 120.1186 -16084, 69.65587, 127.9894 -16085, 69.37795, 136.1519 -16086, 69.82831, 123.4697 -16087, 65.75387, 112.9789 -16088, 65.7493, 123.9453 -16089, 65.71657, 131.5604 -16090, 67.83512, 131.2806 -16091, 69.31119, 135.1037 -16092, 67.7191, 120.699 -16093, 66.34019, 109.6276 -16094, 67.49858, 120.7825 -16095, 67.31243, 126.4223 -16096, 69.86285, 134.3626 -16097, 65.53745, 123.5052 -16098, 64.59321, 115.3473 -16099, 70.94415, 137.818 -16100, 65.10856, 142.4697 -16101, 65.90327, 121.5589 -16102, 68.98332, 130.488 -16103, 71.82366, 157.4164 -16104, 64.24852, 126.0415 -16105, 70.8681, 147.1265 -16106, 66.96278, 135.505 -16107, 66.12878, 129.3979 -16108, 71.94824, 136.8933 -16109, 65.07127, 108.6386 -16110, 69.67868, 126.0584 -16111, 64.74361, 114.9174 -16112, 69.15274, 125.9758 -16113, 67.27984, 109.7412 -16114, 67.47621, 121.506 -16115, 69.72662, 139.0893 -16116, 70.1707, 111.1782 -16117, 66.61857, 128.6381 -16118, 67.53201, 126.1899 -16119, 66.70138, 122.2916 -16120, 67.70153, 133.0479 -16121, 69.13985, 127.8006 -16122, 68.40056, 133.3174 -16123, 67.09034, 116.1753 -16124, 64.56582, 101.6407 -16125, 65.83884, 112.2939 -16126, 67.8546, 120.8841 -16127, 67.56548, 164.5865 -16128, 68.95006, 150.9348 -16129, 66.88926, 127.4484 -16130, 63.7295, 119.2318 -16131, 67.57752, 139.8852 -16132, 69.1283, 117.7473 -16133, 68.01587, 112.7753 -16134, 67.06685, 117.2326 -16135, 70.64588, 108.4964 -16136, 68.04523, 125.317 -16137, 65.18191, 122.3296 -16138, 67.95231, 125.4864 -16139, 69.25011, 141.4465 -16140, 65.96393, 140.1776 -16141, 67.5947, 115.7894 -16142, 71.04171, 124.8506 -16143, 67.77341, 118.673 -16144, 69.13759, 140.5952 -16145, 66.80684, 118.2042 -16146, 74.47517, 130.9092 -16147, 68.0331, 139.2995 -16148, 68.0644, 122.5887 -16149, 70.12434, 135.7782 -16150, 66.81391, 114.3368 -16151, 69.99107, 145.8768 -16152, 68.46712, 123.8385 -16153, 65.36962, 119.4041 -16154, 66.36395, 118.9485 -16155, 65.26932, 120.7947 -16156, 67.70041, 133.7415 -16157, 65.96714, 117.3999 -16158, 66.02222, 135.7149 -16159, 70.2321, 135.7227 -16160, 68.38172, 131.2653 -16161, 69.64098, 145.0634 -16162, 67.28414, 99.15936 -16163, 69.58655, 151.417 -16164, 65.99345, 109.9817 -16165, 65.25013, 125.8024 -16166, 67.79735, 119.3893 -16167, 70.76063, 149.9261 -16168, 66.54695, 107.2944 -16169, 69.24477, 141.3338 -16170, 67.45018, 151.1216 -16171, 68.89261, 136.2221 -16172, 68.01896, 133.4202 -16173, 68.55845, 127.7299 -16174, 67.35986, 117.0648 -16175, 71.41989, 131.9403 -16176, 68.12119, 134.7049 -16177, 63.85395, 117.3799 -16178, 69.21935, 113.3789 -16179, 70.98516, 134.2274 -16180, 67.06622, 112.0892 -16181, 68.33204, 143.2136 -16182, 68.07284, 117.0658 -16183, 64.26234, 117.8436 -16184, 67.0604, 133.9787 -16185, 67.00242, 109.9566 -16186, 66.31913, 122.8827 -16187, 70.46814, 130.5875 -16188, 64.43246, 119.6113 -16189, 68.4489, 132.9983 -16190, 66.65345, 116.5059 -16191, 65.46283, 128.9968 -16192, 67.0748, 131.4424 -16193, 66.19921, 107.072 -16194, 68.7179, 114.1472 -16195, 66.31607, 114.3084 -16196, 66.64692, 120.2193 -16197, 69.25969, 130.928 -16198, 67.45099, 127.3075 -16199, 64.42715, 93.77605 -16200, 65.53849, 142.5842 -16201, 66.89782, 124.9394 -16202, 70.67184, 144.1236 -16203, 67.93222, 132.3346 -16204, 66.92724, 125.4446 -16205, 66.53067, 109.4724 -16206, 69.31518, 120.3775 -16207, 70.82934, 131.3445 -16208, 66.16717, 114.8612 -16209, 69.87971, 117.8718 -16210, 65.03428, 99.61482 -16211, 69.47601, 143.0517 -16212, 67.9457, 118.4858 -16213, 69.66532, 137.5848 -16214, 69.81227, 140.3692 -16215, 64.61603, 113.1176 -16216, 68.70534, 122.9617 -16217, 67.86034, 116.6122 -16218, 64.56665, 109.1744 -16219, 67.55567, 134.4666 -16220, 68.56515, 143.9649 -16221, 66.91835, 129.4116 -16222, 72.41732, 134.7621 -16223, 71.08753, 135.5392 -16224, 63.93158, 106.8868 -16225, 68.00087, 134.7445 -16226, 66.42765, 120.6609 -16227, 68.58748, 124.3152 -16228, 68.73243, 148.0622 -16229, 67.08349, 127.3686 -16230, 69.95792, 126.6491 -16231, 69.72909, 121.2628 -16232, 69.26196, 138.9057 -16233, 66.69, 128.5966 -16234, 70.36077, 142.2321 -16235, 67.46372, 124.3689 -16236, 68.5373, 121.8393 -16237, 67.50827, 122.1101 -16238, 65.75245, 120.3636 -16239, 66.74609, 129.2159 -16240, 72.21651, 139.8698 -16241, 66.94817, 107.6458 -16242, 67.49868, 157.1014 -16243, 68.42975, 147.8209 -16244, 68.52518, 119.6524 -16245, 66.78274, 118.6653 -16246, 64.79988, 121.5981 -16247, 70.23712, 136.9404 -16248, 73.10806, 140.7235 -16249, 66.2469, 112.0223 -16250, 67.16625, 118.2065 -16251, 69.34644, 125.3572 -16252, 64.6456, 121.8469 -16253, 68.87184, 120.4789 -16254, 66.36918, 123.2573 -16255, 71.20713, 119.6618 -16256, 70.73217, 138.1571 -16257, 68.33913, 111.1084 -16258, 67.79893, 137.6869 -16259, 65.85082, 134.2529 -16260, 68.60721, 144.9214 -16261, 68.04752, 121.127 -16262, 67.92398, 140.6038 -16263, 66.91439, 119.9645 -16264, 64.70896, 118.9869 -16265, 70.77016, 120.547 -16266, 67.3468, 121.395 -16267, 64.86953, 109.9266 -16268, 64.19615, 122.1719 -16269, 68.42556, 129.0887 -16270, 67.23216, 127.4021 -16271, 69.29292, 140.8615 -16272, 66.12768, 124.4191 -16273, 67.15976, 135.3002 -16274, 68.92731, 129.8894 -16275, 70.35575, 126.1017 -16276, 66.56554, 131.7885 -16277, 70.41469, 133.3264 -16278, 66.30858, 132.2852 -16279, 64.92028, 123.1736 -16280, 68.38333, 120.7131 -16281, 66.60948, 128.4356 -16282, 67.74654, 132.4136 -16283, 67.76365, 120.8272 -16284, 67.826, 133.2988 -16285, 68.81311, 130.7308 -16286, 69.31322, 137.2461 -16287, 62.99079, 128.0345 -16288, 68.01395, 127.4918 -16289, 67.88325, 128.8534 -16290, 64.34993, 116.5172 -16291, 69.17264, 121.2414 -16292, 65.01635, 112.8708 -16293, 69.49107, 134.9546 -16294, 71.6126, 140.2298 -16295, 68.13264, 120.655 -16296, 71.05107, 146.4425 -16297, 69.16088, 137.6839 -16298, 70.64956, 136.3774 -16299, 68.2516, 122.4347 -16300, 65.20641, 111.7598 -16301, 69.1875, 100.505 -16302, 68.26068, 121.9934 -16303, 69.44096, 127.7445 -16304, 66.8189, 128.3391 -16305, 68.97099, 122.6575 -16306, 70.46407, 136.6546 -16307, 70.04348, 137.2425 -16308, 67.31087, 141.1151 -16309, 69.03446, 119.7233 -16310, 67.49014, 112.3328 -16311, 67.33983, 119.2277 -16312, 72.06505, 133.0291 -16313, 68.44578, 134.0888 -16314, 70.93858, 151.7394 -16315, 65.99061, 100.1656 -16316, 65.69995, 129.2969 -16317, 67.88781, 123.7831 -16318, 68.71714, 130.7432 -16319, 70.58546, 130.0892 -16320, 70.50692, 132.8177 -16321, 64.89796, 112.7778 -16322, 68.03452, 119.2309 -16323, 68.37598, 142.8062 -16324, 65.31335, 109.2026 -16325, 64.68155, 110.3814 -16326, 67.81472, 130.8844 -16327, 68.72087, 134.8805 -16328, 66.31745, 112.7879 -16329, 64.69964, 128.1228 -16330, 63.19011, 97.85324 -16331, 67.04974, 123.1772 -16332, 69.77631, 133.7446 -16333, 71.20739, 122.73 -16334, 70.1551, 122.5107 -16335, 70.25528, 114.2026 -16336, 68.26686, 131.6032 -16337, 68.34684, 141.2898 -16338, 70.30878, 140.619 -16339, 67.08135, 110.5151 -16340, 70.55462, 140.4344 -16341, 68.8199, 130.0868 -16342, 66.44443, 126.4245 -16343, 67.62411, 130.7663 -16344, 69.99611, 135.4407 -16345, 70.85949, 146.443 -16346, 67.22633, 127.3791 -16347, 65.79897, 109.5994 -16348, 68.8133, 121.8595 -16349, 68.15897, 137.1696 -16350, 68.13434, 137.7671 -16351, 66.03575, 129.8433 -16352, 71.1392, 136.5394 -16353, 65.7611, 139.533 -16354, 66.4562, 116.1557 -16355, 71.43418, 139.566 -16356, 66.21723, 117.6091 -16357, 65.29847, 110.1183 -16358, 69.93212, 124.5161 -16359, 68.65961, 126.7685 -16360, 68.31157, 127.5313 -16361, 68.86473, 131.0624 -16362, 66.81505, 125.3619 -16363, 71.22412, 144.8558 -16364, 66.51076, 136.4399 -16365, 65.78246, 117.0782 -16366, 66.03177, 131.3673 -16367, 67.44959, 105.4248 -16368, 67.60525, 118.4955 -16369, 67.3143, 138.3905 -16370, 70.86729, 131.1195 -16371, 65.48255, 141.0259 -16372, 68.22266, 141.3689 -16373, 71.31566, 122.9654 -16374, 71.48733, 141.9901 -16375, 64.96432, 119.0701 -16376, 69.49516, 139.2006 -16377, 67.88913, 118.218 -16378, 68.90454, 145.1237 -16379, 68.07183, 127.9641 -16380, 64.39356, 96.18308 -16381, 66.65415, 107.8738 -16382, 68.40425, 110.1585 -16383, 64.65508, 144.2053 -16384, 66.44203, 126.6712 -16385, 71.50072, 133.5473 -16386, 73.88318, 134.2179 -16387, 66.35681, 129.7247 -16388, 64.5294, 129.0555 -16389, 65.86448, 106.1127 -16390, 66.79915, 111.6206 -16391, 72.1822, 134.0295 -16392, 69.3837, 132.8476 -16393, 68.19583, 146.2667 -16394, 70.5114, 128.1338 -16395, 65.80641, 130.8923 -16396, 70.16053, 123.3076 -16397, 67.43844, 122.1914 -16398, 70.71361, 135.7651 -16399, 68.07891, 153.5097 -16400, 68.35342, 131.2236 -16401, 67.20032, 130.9151 -16402, 68.69189, 125.636 -16403, 70.46936, 133.4589 -16404, 66.90871, 133.8009 -16405, 69.88209, 136.8009 -16406, 68.06727, 130.8548 -16407, 69.20068, 133.185 -16408, 67.47538, 131.3843 -16409, 68.32743, 117.697 -16410, 69.00192, 138.9638 -16411, 65.35322, 105.7026 -16412, 65.4318, 116.5828 -16413, 66.26909, 122.9144 -16414, 68.69404, 125.9645 -16415, 66.1094, 134.3551 -16416, 64.41092, 134.127 -16417, 69.49636, 133.8557 -16418, 64.59448, 104.7582 -16419, 67.74181, 124.6148 -16420, 67.86035, 114.8292 -16421, 66.5956, 131.0129 -16422, 67.29007, 108.9249 -16423, 68.4697, 126.7364 -16424, 68.39686, 139.9312 -16425, 65.81488, 118.5393 -16426, 68.31099, 125.4367 -16427, 65.55142, 129.8399 -16428, 68.78688, 151.5744 -16429, 68.9762, 136.3059 -16430, 69.73827, 126.5047 -16431, 68.61113, 149.0624 -16432, 70.29214, 136.9524 -16433, 69.02156, 126.4165 -16434, 65.24243, 111.3249 -16435, 67.79481, 109.7919 -16436, 65.14929, 125.4005 -16437, 67.85083, 104.3679 -16438, 67.95407, 126.1482 -16439, 68.07138, 104.5138 -16440, 67.96206, 125.8946 -16441, 68.0562, 123.0662 -16442, 69.54373, 140.905 -16443, 67.44763, 136.8386 -16444, 69.93226, 143.142 -16445, 68.4428, 123.9019 -16446, 67.14705, 121.2435 -16447, 68.09321, 127.1611 -16448, 70.98751, 160.6929 -16449, 69.63262, 136.2754 -16450, 66.83325, 135.069 -16451, 67.48442, 128.1263 -16452, 70.30599, 146.687 -16453, 70.9558, 146.0678 -16454, 65.56472, 128.1536 -16455, 67.08322, 121.2183 -16456, 70.07861, 108.5745 -16457, 71.39547, 149.9232 -16458, 69.43051, 141.5282 -16459, 66.80894, 122.0407 -16460, 69.62216, 138.2071 -16461, 65.8652, 118.6262 -16462, 66.59005, 141.7685 -16463, 71.13173, 130.8381 -16464, 66.01563, 129.1451 -16465, 66.28735, 116.4058 -16466, 68.99924, 117.7849 -16467, 67.84324, 144.1374 -16468, 67.4654, 105.317 -16469, 67.49195, 123.4161 -16470, 65.34945, 115.779 -16471, 67.83551, 126.1946 -16472, 69.79369, 126.8353 -16473, 68.87143, 125.5759 -16474, 67.82667, 124.1151 -16475, 68.81413, 121.4105 -16476, 70.47876, 130.5729 -16477, 73.16304, 161.2538 -16478, 71.95209, 146.3936 -16479, 67.44715, 119.2209 -16480, 68.85059, 114.7156 -16481, 69.72712, 130.6584 -16482, 67.43691, 136.2537 -16483, 71.11399, 122.0355 -16484, 67.71312, 138.2236 -16485, 66.77008, 112.6772 -16486, 70.90585, 132.9018 -16487, 67.47875, 104.2591 -16488, 68.08728, 111.6015 -16489, 68.54271, 125.7349 -16490, 67.38204, 139.3863 -16491, 67.62489, 123.9918 -16492, 65.71741, 96.56954 -16493, 66.75033, 119.5639 -16494, 70.03827, 138.7756 -16495, 66.8036, 110.2972 -16496, 71.80215, 139.9054 -16497, 69.75691, 137.0891 -16498, 68.62702, 100.7525 -16499, 68.03554, 113.0308 -16500, 70.44384, 141.5947 -16501, 69.53504, 130.0973 -16502, 65.56302, 115.0701 -16503, 67.68639, 123.3297 -16504, 68.31423, 120.6889 -16505, 71.41559, 149.3469 -16506, 70.86132, 135.3213 -16507, 70.19919, 135.138 -16508, 67.31745, 132.8306 -16509, 66.67461, 111.7658 -16510, 68.52431, 98.28103 -16511, 68.08513, 128.1996 -16512, 65.22726, 135.7065 -16513, 67.02577, 114.7573 -16514, 63.12846, 115.988 -16515, 68.91849, 135.5944 -16516, 65.4037, 126.7384 -16517, 66.72667, 137.0383 -16518, 68.0043, 117.1869 -16519, 68.24197, 128.0584 -16520, 68.80229, 123.4378 -16521, 68.76843, 132.3484 -16522, 66.26798, 118.6096 -16523, 64.62832, 138.6254 -16524, 68.20142, 131.4314 -16525, 70.85424, 134.0073 -16526, 66.81173, 114.561 -16527, 69.9304, 139.4913 -16528, 69.89558, 137.409 -16529, 65.211, 109.6018 -16530, 64.95554, 109.2972 -16531, 63.80198, 116.5058 -16532, 69.32363, 133.9561 -16533, 68.08572, 119.1548 -16534, 66.42673, 133.7442 -16535, 68.7483, 121.1914 -16536, 71.42063, 138.9418 -16537, 69.99781, 134.018 -16538, 66.0776, 113.0542 -16539, 68.02381, 116.4733 -16540, 63.40728, 127.6054 -16541, 65.35444, 115.174 -16542, 68.65199, 129.7975 -16543, 67.8743, 129.9449 -16544, 69.21034, 139.2897 -16545, 68.81727, 128.4544 -16546, 69.74177, 135.2069 -16547, 68.01296, 138.7343 -16548, 65.96554, 119.0405 -16549, 70.1201, 114.3885 -16550, 69.52643, 131.3148 -16551, 68.13839, 118.1307 -16552, 68.01789, 137.0494 -16553, 65.5277, 90.67684 -16554, 70.11106, 140.9521 -16555, 69.55787, 136.3448 -16556, 67.8112, 123.8181 -16557, 69.41543, 131.7001 -16558, 69.16396, 125.1731 -16559, 67.10355, 129.3964 -16560, 66.59023, 102.0816 -16561, 65.69038, 128.0027 -16562, 65.87218, 114.5395 -16563, 65.7737, 116.1954 -16564, 67.08497, 118.8063 -16565, 66.64738, 96.76496 -16566, 69.90009, 139.5857 -16567, 69.36888, 135.4301 -16568, 69.41881, 145.6596 -16569, 69.35477, 133.5585 -16570, 66.78976, 124.5194 -16571, 69.98352, 112.0653 -16572, 70.76035, 144.9425 -16573, 68.82168, 134.7195 -16574, 69.50397, 139.8523 -16575, 71.0584, 149.2104 -16576, 66.55888, 120.3692 -16577, 69.08809, 139.7369 -16578, 67.78232, 130.9741 -16579, 66.14817, 119.4163 -16580, 67.02309, 126.8851 -16581, 66.63003, 133.8063 -16582, 68.09397, 135.3716 -16583, 71.62587, 143.5679 -16584, 68.36727, 128.1388 -16585, 72.00969, 151.6078 -16586, 72.15628, 148.6441 -16587, 63.81356, 104.9316 -16588, 67.12639, 132.7966 -16589, 68.67044, 114.1316 -16590, 68.76102, 116.1148 -16591, 64.70654, 128.1374 -16592, 67.46362, 136.9027 -16593, 65.60326, 121.0995 -16594, 69.56871, 132.12 -16595, 65.56437, 137.7446 -16596, 70.18009, 120.0385 -16597, 68.01941, 128.8836 -16598, 69.10492, 133.099 -16599, 67.10458, 132.1679 -16600, 71.08347, 130.0081 -16601, 66.56587, 132.1454 -16602, 67.37511, 117.2506 -16603, 69.67643, 135.9639 -16604, 68.01459, 126.2054 -16605, 67.44922, 125.0511 -16606, 67.82831, 131.2811 -16607, 69.48856, 131.6375 -16608, 65.63996, 129.2401 -16609, 66.28026, 116.499 -16610, 68.01966, 113.4327 -16611, 68.88532, 134.1067 -16612, 68.93233, 123.785 -16613, 71.28853, 128.2775 -16614, 68.47003, 119.0145 -16615, 69.90329, 137.8499 -16616, 70.09202, 130.0885 -16617, 67.96698, 121.0001 -16618, 66.22404, 119.1531 -16619, 67.40603, 124.1916 -16620, 68.18165, 133.6314 -16621, 67.49878, 122.5922 -16622, 70.19817, 138.2708 -16623, 67.46387, 133.6333 -16624, 67.63478, 126.7765 -16625, 68.42936, 136.7083 -16626, 69.11146, 130.5486 -16627, 65.34682, 112.6957 -16628, 72.27679, 161.0088 -16629, 67.17652, 127.4839 -16630, 69.97887, 144.2267 -16631, 69.67383, 129.6119 -16632, 69.89009, 147.7944 -16633, 67.64807, 130.4777 -16634, 67.32703, 118.8394 -16635, 68.97336, 124.6298 -16636, 67.66967, 103.1117 -16637, 66.91254, 126.6126 -16638, 67.55359, 118.7322 -16639, 65.03493, 117.367 -16640, 68.02707, 131.5474 -16641, 67.16576, 143.1687 -16642, 67.45939, 125.3672 -16643, 66.40605, 113.0716 -16644, 65.39009, 131.09 -16645, 67.73618, 122.0743 -16646, 69.51989, 128.0201 -16647, 67.10018, 124.7517 -16648, 68.17712, 124.787 -16649, 68.95359, 139.1428 -16650, 69.43474, 135.4955 -16651, 66.85504, 111.9391 -16652, 67.64108, 143.9 -16653, 69.00734, 121.8109 -16654, 70.25934, 120.8223 -16655, 71.33493, 129.5699 -16656, 69.57026, 136.1203 -16657, 67.42577, 123.4668 -16658, 68.74418, 126.2233 -16659, 71.13567, 160.9951 -16660, 66.54732, 118.107 -16661, 69.35688, 115.1244 -16662, 67.57381, 121.1601 -16663, 68.81213, 122.6589 -16664, 65.97049, 122.2612 -16665, 65.43348, 111.2886 -16666, 67.26682, 126.8626 -16667, 70.48056, 152.8963 -16668, 69.31844, 134.0819 -16669, 69.98038, 149.3003 -16670, 64.3997, 115.6996 -16671, 69.96882, 124.6241 -16672, 71.17805, 139.8145 -16673, 68.17807, 125.2121 -16674, 69.71877, 134.9651 -16675, 66.17811, 120.8511 -16676, 68.06493, 135.2143 -16677, 66.93792, 118.5464 -16678, 71.94764, 122.5813 -16679, 72.71997, 139.6902 -16680, 68.0762, 129.4436 -16681, 71.29571, 120.3065 -16682, 68.7298, 123.5816 -16683, 66.50822, 126.5994 -16684, 63.39372, 112.3913 -16685, 70.08816, 144.335 -16686, 73.11184, 155.5572 -16687, 67.76753, 109.0503 -16688, 67.15813, 122.3345 -16689, 68.88047, 126.3416 -16690, 67.53793, 125.1591 -16691, 69.00373, 121.6103 -16692, 66.91915, 110.2502 -16693, 69.65967, 139.838 -16694, 69.25047, 119.2207 -16695, 70.17827, 136.39 -16696, 70.83539, 151.0733 -16697, 66.47563, 113.5574 -16698, 69.6208, 137.7365 -16699, 67.58201, 132.9915 -16700, 69.74971, 133.1771 -16701, 68.22141, 126.4871 -16702, 66.27854, 137.3219 -16703, 70.31002, 124.259 -16704, 66.09817, 117.8259 -16705, 67.33954, 122.5026 -16706, 69.08954, 128.0095 -16707, 65.74714, 97.61486 -16708, 72.40729, 137.7315 -16709, 69.67981, 151.5938 -16710, 68.74902, 143.562 -16711, 67.52317, 135.6893 -16712, 68.05693, 111.02 -16713, 67.64343, 112.8759 -16714, 68.27843, 116.785 -16715, 66.4448, 118.6193 -16716, 70.06553, 139.9915 -16717, 69.7225, 133.2241 -16718, 69.07385, 131.4765 -16719, 68.89215, 121.5688 -16720, 65.51454, 116.4836 -16721, 68.92231, 151.3009 -16722, 65.2828, 129.6922 -16723, 68.00088, 112.1066 -16724, 69.8297, 119.9775 -16725, 65.88089, 108.9088 -16726, 70.64935, 151.5471 -16727, 67.96283, 129.5435 -16728, 68.2472, 127.8725 -16729, 69.55032, 133.0538 -16730, 70.02152, 134.9774 -16731, 68.66464, 110.6549 -16732, 66.73719, 134.6728 -16733, 68.61698, 126.5903 -16734, 64.54407, 129.9997 -16735, 69.37595, 127.3132 -16736, 67.89117, 125.831 -16737, 67.40181, 133.8403 -16738, 68.42249, 129.9916 -16739, 67.05087, 115.058 -16740, 67.8955, 122.598 -16741, 70.42079, 155.3236 -16742, 68.60394, 104.6119 -16743, 64.82265, 129.7365 -16744, 70.38424, 128.7931 -16745, 71.90845, 130.2846 -16746, 67.98612, 127.0032 -16747, 69.53721, 138.9628 -16748, 66.62497, 125.5671 -16749, 65.79605, 112.9191 -16750, 66.84543, 132.9089 -16751, 67.6002, 120.1248 -16752, 66.30012, 141.2673 -16753, 74.8489, 122.1664 -16754, 65.31147, 119.5294 -16755, 66.60502, 129.9128 -16756, 65.18103, 121.9562 -16757, 69.60249, 127.613 -16758, 68.16866, 119.7595 -16759, 67.46028, 123.7713 -16760, 67.72802, 112.5012 -16761, 66.00024, 126.5343 -16762, 70.91361, 124.7404 -16763, 67.80093, 134.8097 -16764, 68.87869, 137.271 -16765, 71.6397, 151.672 -16766, 68.29438, 127.4005 -16767, 65.12886, 144.2723 -16768, 70.57005, 145.8051 -16769, 73.05003, 153.7847 -16770, 66.13913, 126.1211 -16771, 67.15543, 143.3497 -16772, 67.61729, 115.5436 -16773, 72.08878, 129.3443 -16774, 65.56805, 103.6442 -16775, 68.27811, 139.1479 -16776, 66.11831, 117.6246 -16777, 67.41631, 117.7373 -16778, 67.14346, 123.637 -16779, 67.82005, 106.7011 -16780, 67.84632, 124.327 -16781, 69.31979, 146.8154 -16782, 67.7887, 117.1692 -16783, 69.47633, 127.5222 -16784, 67.58136, 124.4768 -16785, 69.76561, 125.7431 -16786, 65.89876, 127.5898 -16787, 64.31284, 107.3859 -16788, 64.16388, 110.6961 -16789, 63.87961, 112.6594 -16790, 67.43935, 122.1224 -16791, 69.91231, 136.4495 -16792, 70.18686, 122.3744 -16793, 70.58163, 142.9256 -16794, 68.39877, 144.8047 -16795, 69.9265, 152.4115 -16796, 66.84336, 113.3828 -16797, 65.37327, 117.2876 -16798, 69.85898, 109.0503 -16799, 66.18835, 117.1775 -16800, 67.39835, 133.0561 -16801, 64.43316, 122.8413 -16802, 66.94628, 120.0223 -16803, 67.21511, 109.3795 -16804, 69.1414, 132.0737 -16805, 69.60375, 136.9242 -16806, 68.52138, 128.8991 -16807, 67.69719, 117.6493 -16808, 69.5896, 117.4173 -16809, 66.24536, 122.8327 -16810, 69.5915, 139.744 -16811, 70.11961, 115.9145 -16812, 69.77869, 115.5308 -16813, 70.92696, 145.3057 -16814, 68.12409, 127.4662 -16815, 67.03516, 126.9587 -16816, 71.11926, 147.0918 -16817, 67.08274, 145.5487 -16818, 62.59583, 115.9968 -16819, 68.20021, 130.1191 -16820, 69.0616, 105.8284 -16821, 68.03726, 122.7997 -16822, 70.14716, 128.8113 -16823, 67.86308, 129.1697 -16824, 67.97814, 134.905 -16825, 68.54857, 112.7721 -16826, 69.63469, 102.4555 -16827, 67.85196, 138.0472 -16828, 68.15862, 125.2674 -16829, 70.15549, 132.9178 -16830, 71.0108, 150.7492 -16831, 66.5613, 122.0259 -16832, 68.75828, 131.4859 -16833, 69.70189, 117.1029 -16834, 67.25892, 125.4424 -16835, 71.01041, 149.5342 -16836, 66.776, 133.1845 -16837, 69.61543, 144.8825 -16838, 67.75246, 115.1501 -16839, 68.96307, 129.6337 -16840, 67.31179, 137.4955 -16841, 70.40367, 122.8706 -16842, 67.13402, 126.5206 -16843, 64.17145, 107.1466 -16844, 67.39792, 144.818 -16845, 66.64574, 130.3053 -16846, 70.47683, 127.1804 -16847, 72.08897, 125.1799 -16848, 68.85095, 122.5428 -16849, 71.93306, 138.5143 -16850, 67.65224, 129.6587 -16851, 68.43764, 121.4169 -16852, 65.59721, 113.7814 -16853, 73.6454, 131.3343 -16854, 69.86288, 133.5317 -16855, 66.14574, 121.4186 -16856, 68.67138, 114.288 -16857, 68.80011, 117.6921 -16858, 66.91779, 123.5822 -16859, 66.04945, 124.0043 -16860, 65.30509, 123.3602 -16861, 68.64586, 132.2452 -16862, 66.70357, 104.9227 -16863, 66.60702, 122.1239 -16864, 71.36658, 141.775 -16865, 64.98614, 120.1492 -16866, 67.18185, 133.6072 -16867, 66.73989, 113.6685 -16868, 68.74927, 140.856 -16869, 65.12487, 120.8855 -16870, 68.26456, 148.7064 -16871, 68.68431, 140.626 -16872, 65.31203, 117.7404 -16873, 67.47503, 128.9104 -16874, 65.82022, 125.859 -16875, 67.1693, 117.1032 -16876, 67.82189, 139.6111 -16877, 69.64113, 145.7304 -16878, 67.83312, 117.2119 -16879, 68.91669, 129.7441 -16880, 67.11653, 138.9936 -16881, 67.80382, 122.4382 -16882, 65.90289, 115.8894 -16883, 67.9672, 130.3415 -16884, 68.2107, 126.7824 -16885, 69.2622, 117.3759 -16886, 63.75507, 94.05081 -16887, 71.24135, 129.6411 -16888, 67.99301, 122.6971 -16889, 67.71177, 126.3918 -16890, 69.07788, 131.0112 -16891, 72.29087, 146.8726 -16892, 63.41812, 116.5908 -16893, 68.11899, 136.6926 -16894, 68.70919, 124.6256 -16895, 65.98196, 108.0272 -16896, 66.78125, 140.4767 -16897, 68.77375, 118.9486 -16898, 70.74718, 130.7772 -16899, 68.70966, 134.7851 -16900, 67.56819, 135.5679 -16901, 70.10034, 135.3067 -16902, 65.7134, 118.2903 -16903, 67.77136, 114.8094 -16904, 68.40923, 129.7769 -16905, 70.18595, 128.0279 -16906, 67.10295, 136.7551 -16907, 67.02015, 138.9499 -16908, 67.12731, 146.9289 -16909, 68.63305, 126.9655 -16910, 70.39135, 129.4393 -16911, 66.77894, 116.5019 -16912, 68.00799, 128.7606 -16913, 68.46274, 111.8667 -16914, 66.66252, 132.5196 -16915, 65.30234, 123.0112 -16916, 69.79619, 137.8177 -16917, 66.49651, 119.2178 -16918, 70.21724, 141.7782 -16919, 66.59252, 119.3649 -16920, 68.04983, 138.8169 -16921, 67.13235, 120.2113 -16922, 67.06311, 144.4981 -16923, 72.02884, 143.6152 -16924, 68.22696, 134.011 -16925, 69.39149, 141.595 -16926, 69.59227, 142.5185 -16927, 69.35974, 130.6723 -16928, 66.03004, 106.6019 -16929, 70.57617, 142.7081 -16930, 67.70133, 133.1967 -16931, 69.06556, 123.8482 -16932, 71.46669, 132.9282 -16933, 69.7224, 143.5373 -16934, 67.3639, 124.0105 -16935, 63.96076, 122.1277 -16936, 66.18589, 138.4375 -16937, 66.7947, 106.7529 -16938, 66.8782, 120.5632 -16939, 65.922, 114.9806 -16940, 69.87458, 131.6044 -16941, 67.50107, 128.0883 -16942, 67.53167, 121.1148 -16943, 64.66379, 113.5736 -16944, 69.01351, 142.5127 -16945, 66.9502, 117.4488 -16946, 68.36938, 122.3564 -16947, 67.50898, 145.7299 -16948, 66.42924, 131.8816 -16949, 63.68444, 117.4249 -16950, 66.97479, 122.3144 -16951, 69.49132, 124.8853 -16952, 68.71402, 131.9578 -16953, 66.58675, 135.4122 -16954, 67.63831, 130.5276 -16955, 70.58074, 133.9982 -16956, 69.4379, 138.0011 -16957, 66.73525, 110.2324 -16958, 66.89482, 114.4542 -16959, 66.70729, 116.0486 -16960, 70.52264, 146.0748 -16961, 67.99362, 128.7902 -16962, 67.31407, 123.3903 -16963, 68.92624, 144.3117 -16964, 69.95962, 135.4521 -16965, 67.3748, 133.9821 -16966, 68.75228, 126.4009 -16967, 70.92144, 134.0307 -16968, 68.52252, 115.4861 -16969, 69.5209, 145.7846 -16970, 66.05943, 97.01374 -16971, 68.27952, 138.6687 -16972, 71.08797, 138.9202 -16973, 67.74228, 110.9634 -16974, 71.04532, 137.5639 -16975, 68.01494, 116.0504 -16976, 67.42681, 119.6089 -16977, 67.79463, 122.4231 -16978, 67.40071, 121.1187 -16979, 68.11235, 122.6629 -16980, 69.66975, 135.1748 -16981, 70.08741, 128.3117 -16982, 66.90838, 133.2205 -16983, 65.48822, 130.85 -16984, 66.35895, 130.5585 -16985, 65.52836, 114.1016 -16986, 66.52176, 114.8809 -16987, 71.81138, 132.3429 -16988, 70.19514, 134.2615 -16989, 69.85682, 139.1729 -16990, 64.30305, 108.1925 -16991, 67.19538, 128.889 -16992, 67.82321, 146.2227 -16993, 65.77148, 130.2604 -16994, 66.3694, 113.7416 -16995, 68.50592, 113.7442 -16996, 67.68043, 130.7277 -16997, 68.80924, 138.9852 -16998, 67.59109, 117.7681 -16999, 67.01374, 110.6789 -17000, 70.23199, 134.3019 -17001, 68.08186, 140.965 -17002, 64.89975, 103.2639 -17003, 67.93563, 127.6112 -17004, 68.24257, 132.3379 -17005, 67.34695, 107.9964 -17006, 69.00004, 147.6115 -17007, 69.11678, 117.4892 -17008, 69.14144, 124.4207 -17009, 67.20212, 124.519 -17010, 64.8577, 111.4153 -17011, 69.24196, 137.1028 -17012, 67.50147, 140.3687 -17013, 66.74043, 123.4565 -17014, 67.64341, 130.851 -17015, 69.60678, 130.557 -17016, 67.98121, 115.1045 -17017, 67.37402, 108.3712 -17018, 67.84743, 132.2256 -17019, 71.84403, 131.7296 -17020, 72.02089, 152.0369 -17021, 65.79883, 130.2469 -17022, 67.91801, 140.0335 -17023, 70.91753, 141.4748 -17024, 69.48346, 133.2048 -17025, 70.345, 138.3456 -17026, 69.42982, 130.7436 -17027, 69.83005, 140.1611 -17028, 68.26316, 127.53 -17029, 71.29705, 145.9248 -17030, 69.28155, 125.0306 -17031, 68.08146, 129.9596 -17032, 69.35917, 122.6629 -17033, 69.65365, 135.0822 -17034, 67.50973, 131.7685 -17035, 70.17333, 134.3438 -17036, 63.83399, 93.14015 -17037, 68.23777, 145.3722 -17038, 68.92202, 134.5452 -17039, 68.62749, 119.4845 -17040, 70.00309, 142.5081 -17041, 69.31001, 134.6324 -17042, 67.31293, 114.2869 -17043, 68.96777, 138.8055 -17044, 68.17941, 147.7557 -17045, 67.45506, 102.6064 -17046, 67.66003, 119.0371 -17047, 68.95279, 123.2895 -17048, 69.78643, 119.9806 -17049, 67.28659, 103.0959 -17050, 67.61536, 143.7498 -17051, 70.61988, 129.2067 -17052, 70.04763, 140.4727 -17053, 67.1607, 126.5374 -17054, 66.93887, 130.979 -17055, 72.07925, 126.6152 -17056, 71.16948, 107.4929 -17057, 65.24695, 123.1823 -17058, 66.28952, 125.5371 -17059, 66.64777, 128.3512 -17060, 68.12185, 141.3107 -17061, 66.72556, 124.2101 -17062, 66.25773, 120.1568 -17063, 64.60513, 121.87 -17064, 68.3871, 124.28 -17065, 68.8693, 132.342 -17066, 69.08858, 128.4363 -17067, 65.67589, 107.7892 -17068, 67.07057, 119.175 -17069, 67.46812, 133.0635 -17070, 67.25401, 138.7418 -17071, 67.55824, 129.857 -17072, 68.50476, 127.7725 -17073, 66.59871, 120.4203 -17074, 67.45933, 145.1994 -17075, 70.19351, 155.8501 -17076, 66.68331, 112.3272 -17077, 65.01213, 131.4172 -17078, 70.23551, 137.7941 -17079, 66.38253, 100.1526 -17080, 74.2957, 170.5479 -17081, 68.3967, 133.9416 -17082, 69.51862, 126.795 -17083, 68.35522, 152.8346 -17084, 66.981, 125.7192 -17085, 66.15165, 127.648 -17086, 68.12739, 135.7452 -17087, 71.00404, 147.3999 -17088, 69.18084, 121.0461 -17089, 69.25157, 142.0283 -17090, 65.89909, 116.6285 -17091, 65.01016, 113.665 -17092, 70.67025, 145.5058 -17093, 67.91307, 117.1901 -17094, 66.83902, 135.9237 -17095, 69.24982, 141.832 -17096, 68.20219, 123.4755 -17097, 65.00478, 114.8875 -17098, 67.44928, 121.8513 -17099, 65.66549, 115.9641 -17100, 68.33879, 120.0566 -17101, 66.00157, 138.16 -17102, 69.60672, 147.4894 -17103, 66.81635, 117.8826 -17104, 71.57686, 130.2389 -17105, 71.3565, 153.339 -17106, 67.98793, 126.4604 -17107, 65.56672, 120.8202 -17108, 70.39966, 122.8004 -17109, 65.7372, 115.6365 -17110, 67.38494, 145.9888 -17111, 70.00988, 135.2099 -17112, 67.69492, 112.0235 -17113, 68.71585, 126.3978 -17114, 69.6456, 133.6615 -17115, 65.67921, 97.5587 -17116, 66.4272, 140.3629 -17117, 69.16499, 130.7432 -17118, 64.99349, 95.53404 -17119, 69.29714, 135.1842 -17120, 67.03529, 127.6698 -17121, 70.17991, 141.2059 -17122, 68.42657, 139.0159 -17123, 67.42189, 115.3929 -17124, 71.6334, 144.9499 -17125, 68.4183, 118.4396 -17126, 69.58501, 116.3081 -17127, 68.2946, 134.5639 -17128, 68.29736, 114.556 -17129, 67.23158, 111.2912 -17130, 68.15698, 124.7231 -17131, 67.58915, 113.8607 -17132, 66.48084, 131.7704 -17133, 67.83819, 112.8704 -17134, 66.22459, 120.3185 -17135, 69.32855, 148.7261 -17136, 68.7643, 138.8232 -17137, 66.60467, 117.4884 -17138, 68.06631, 111.7891 -17139, 65.82945, 113.0426 -17140, 67.10438, 111.593 -17141, 68.05392, 98.44388 -17142, 67.04599, 116.846 -17143, 69.75999, 140.1723 -17144, 68.62962, 128.635 -17145, 67.21518, 113.1391 -17146, 66.65893, 130.1087 -17147, 66.61554, 124.7657 -17148, 68.8524, 153.9203 -17149, 68.11909, 139.9683 -17150, 68.84217, 133.1024 -17151, 69.28642, 117.1763 -17152, 67.43359, 134.4193 -17153, 68.4407, 131.7304 -17154, 72.56003, 143.5421 -17155, 65.07677, 102.0212 -17156, 68.07466, 139.4078 -17157, 69.87283, 133.8259 -17158, 67.54613, 136.548 -17159, 68.99154, 136.0463 -17160, 65.93494, 114.2724 -17161, 67.50424, 124.5354 -17162, 67.8023, 127.3532 -17163, 68.36515, 133.1667 -17164, 68.72643, 119.8404 -17165, 65.63641, 115.1096 -17166, 71.53079, 139.728 -17167, 68.27154, 119.8697 -17168, 65.48714, 125.6218 -17169, 68.25275, 140.0211 -17170, 69.62553, 134.1744 -17171, 71.33776, 151.6827 -17172, 65.22591, 113.2357 -17173, 68.33965, 116.1773 -17174, 67.44352, 131.3575 -17175, 67.0122, 115.7769 -17176, 70.45836, 113.9029 -17177, 65.74525, 132.905 -17178, 68.08006, 131.2455 -17179, 70.3959, 132.2152 -17180, 72.96003, 141.0356 -17181, 69.00062, 139.347 -17182, 69.51925, 142.2807 -17183, 69.3335, 132.628 -17184, 71.19641, 136.2158 -17185, 69.76816, 131.0426 -17186, 70.62661, 113.2917 -17187, 67.28616, 145.1271 -17188, 68.66966, 116.3694 -17189, 69.29476, 134.6555 -17190, 64.09493, 115.4626 -17191, 63.6884, 107.0641 -17192, 69.35389, 130.634 -17193, 65.60857, 102.9622 -17194, 69.51197, 140.5772 -17195, 69.14868, 125.3518 -17196, 66.54976, 118.1047 -17197, 68.73761, 113.9191 -17198, 68.61752, 143.5086 -17199, 64.7415, 122.214 -17200, 69.43114, 129.3049 -17201, 67.66681, 133.1967 -17202, 69.5546, 140.8539 -17203, 68.32029, 145.1288 -17204, 69.69178, 137.9446 -17205, 72.88636, 136.2642 -17206, 62.60367, 120.4839 -17207, 69.89894, 129.4752 -17208, 68.74855, 116.7264 -17209, 70.15073, 114.7623 -17210, 70.25185, 126.8904 -17211, 70.05622, 128.2033 -17212, 71.56915, 139.758 -17213, 66.7109, 105.7077 -17214, 67.85257, 129.604 -17215, 70.69405, 133.8317 -17216, 69.26246, 118.5224 -17217, 64.55678, 107.7334 -17218, 66.24054, 118.7468 -17219, 71.68073, 149.2518 -17220, 71.21093, 133.7609 -17221, 70.00062, 139.8029 -17222, 71.0916, 154.3139 -17223, 67.21865, 106.4772 -17224, 66.45714, 115.509 -17225, 67.47694, 127.3133 -17226, 67.50358, 121.8309 -17227, 67.20873, 125.5948 -17228, 66.71667, 135.6625 -17229, 66.70363, 131.4875 -17230, 69.96498, 143.9715 -17231, 68.36676, 146.4269 -17232, 66.05514, 110.1934 -17233, 68.55523, 121.336 -17234, 67.98234, 148.4537 -17235, 68.30939, 138.8029 -17236, 69.34515, 128.481 -17237, 68.52656, 117.759 -17238, 69.20707, 119.3487 -17239, 71.47479, 145.6045 -17240, 65.5345, 104.6023 -17241, 67.78592, 115.9959 -17242, 66.59132, 127.1836 -17243, 67.13782, 128.8127 -17244, 67.00111, 123.5243 -17245, 66.61654, 114.8299 -17246, 72.32507, 140.0185 -17247, 66.90281, 137.8036 -17248, 67.55171, 155.8602 -17249, 68.48654, 135.2003 -17250, 67.5987, 120.4145 -17251, 68.32615, 126.5379 -17252, 67.53167, 136.8568 -17253, 69.72754, 133.9694 -17254, 69.6497, 138.7263 -17255, 66.74817, 120.5369 -17256, 68.68338, 137.2761 -17257, 68.09093, 112.3863 -17258, 70.61191, 129.0103 -17259, 67.37954, 122.8752 -17260, 68.13334, 138.094 -17261, 68.91805, 141.2478 -17262, 70.53026, 120.2164 -17263, 66.74661, 123.1471 -17264, 63.66612, 92.91629 -17265, 68.93518, 128.9977 -17266, 62.95082, 89.82395 -17267, 68.93593, 128.2837 -17268, 68.73095, 136.5794 -17269, 66.31924, 111.7375 -17270, 70.48056, 143.0927 -17271, 69.12774, 139.3958 -17272, 67.81338, 123.9796 -17273, 69.70128, 137.1688 -17274, 68.20119, 124.0966 -17275, 68.43567, 135.5799 -17276, 66.59979, 122.0255 -17277, 69.57976, 121.9471 -17278, 66.89298, 153.7224 -17279, 68.44356, 133.3465 -17280, 64.02299, 133.0834 -17281, 68.08549, 126.3244 -17282, 64.19319, 131.872 -17283, 68.1466, 126.907 -17284, 66.59019, 112.2 -17285, 71.77869, 136.6592 -17286, 65.45623, 120.6365 -17287, 66.91902, 109.6637 -17288, 70.47505, 147.7924 -17289, 70.45755, 130.7421 -17290, 69.23837, 140.1161 -17291, 70.43378, 123.3224 -17292, 66.66166, 108.7235 -17293, 66.202, 116.2268 -17294, 69.01369, 123.5196 -17295, 67.89474, 109.0678 -17296, 65.09125, 115.2931 -17297, 65.61432, 118.1457 -17298, 67.83938, 120.6424 -17299, 67.93244, 149.6971 -17300, 68.77471, 147.1688 -17301, 65.27402, 123.5437 -17302, 64.87507, 107.5534 -17303, 68.12084, 144.7017 -17304, 68.10385, 122.944 -17305, 66.60491, 123.4707 -17306, 64.98909, 126.5752 -17307, 65.48748, 123.3998 -17308, 71.20181, 135.5595 -17309, 69.63121, 145.3661 -17310, 67.94288, 132.4093 -17311, 69.47689, 137.9974 -17312, 67.00352, 125.768 -17313, 67.33913, 140.9204 -17314, 69.99442, 124.9403 -17315, 66.61274, 122.8743 -17316, 64.62708, 119.5881 -17317, 67.33036, 129.4347 -17318, 67.80582, 122.0169 -17319, 67.32409, 131.2304 -17320, 70.96058, 154.6305 -17321, 68.98601, 128.4208 -17322, 69.46885, 126.7239 -17323, 67.27957, 151.1432 -17324, 70.18223, 118.0108 -17325, 67.0326, 138.4939 -17326, 66.39075, 120.1294 -17327, 67.89527, 134.1851 -17328, 66.14899, 130.3818 -17329, 69.54063, 144.5497 -17330, 70.14756, 134.8804 -17331, 66.89045, 99.50583 -17332, 67.23624, 137.2681 -17333, 69.78805, 125.1333 -17334, 68.41729, 132.5489 -17335, 65.77199, 124.1671 -17336, 68.65215, 123.5174 -17337, 68.65431, 140.2481 -17338, 70.68047, 147.894 -17339, 66.9118, 138.9373 -17340, 69.86836, 127.2331 -17341, 63.23208, 111.9702 -17342, 64.72051, 104.9827 -17343, 65.24398, 124.1485 -17344, 70.89385, 133.8627 -17345, 64.25659, 125.7283 -17346, 70.04462, 135.2964 -17347, 68.1956, 132.6032 -17348, 66.98148, 139.9306 -17349, 67.94824, 139.7195 -17350, 67.09869, 118.7587 -17351, 71.84299, 149.6695 -17352, 68.44482, 131.4924 -17353, 67.24833, 120.8204 -17354, 69.21266, 125.3578 -17355, 64.62267, 110.5318 -17356, 66.34307, 135.219 -17357, 67.53967, 125.4678 -17358, 66.34283, 122.1693 -17359, 66.21181, 102.0376 -17360, 67.4587, 123.1343 -17361, 66.25568, 125.5099 -17362, 67.24089, 110.9775 -17363, 65.92673, 132.2059 -17364, 67.96507, 124.3027 -17365, 67.12922, 137.0875 -17366, 69.75762, 117.7232 -17367, 69.35818, 136.1109 -17368, 66.49944, 130.8294 -17369, 65.84519, 116.6415 -17370, 68.6028, 138.3946 -17371, 65.50146, 105.7827 -17372, 69.52765, 135.0961 -17373, 68.34357, 130.8423 -17374, 68.39615, 146.7625 -17375, 66.43119, 133.4835 -17376, 68.33665, 101.9516 -17377, 69.47857, 135.9337 -17378, 66.01032, 131.8757 -17379, 64.46887, 94.18679 -17380, 67.68763, 118.7816 -17381, 69.57526, 138.27 -17382, 69.0155, 135.8559 -17383, 70.21523, 127.0247 -17384, 72.33756, 124.8651 -17385, 70.90167, 120.6197 -17386, 68.87665, 133.8123 -17387, 67.92675, 127.4273 -17388, 69.62929, 129.0453 -17389, 67.59691, 110.7002 -17390, 63.85158, 96.09962 -17391, 68.01914, 119.6914 -17392, 69.86323, 149.4407 -17393, 69.23452, 141.8186 -17394, 66.7337, 121.9367 -17395, 67.6231, 109.1208 -17396, 69.04787, 135.6889 -17397, 66.66643, 134.4328 -17398, 65.62201, 121.1309 -17399, 68.02126, 130.6948 -17400, 68.08905, 134.0382 -17401, 67.5556, 134.2413 -17402, 69.35112, 142.6964 -17403, 67.77226, 129.9275 -17404, 70.44505, 127.7974 -17405, 68.2744, 132.4472 -17406, 66.20602, 104.8284 -17407, 68.40548, 141.5327 -17408, 67.28425, 125.0764 -17409, 69.86408, 137.2586 -17410, 70.17631, 122.8945 -17411, 68.57961, 125.8787 -17412, 68.45722, 154.869 -17413, 70.16449, 138.963 -17414, 67.94165, 150.0432 -17415, 68.94539, 124.4079 -17416, 66.95864, 121.0411 -17417, 67.13623, 137.279 -17418, 69.5223, 129.8503 -17419, 69.18085, 117.7637 -17420, 66.22712, 122.3249 -17421, 65.79575, 128.0249 -17422, 68.66855, 128.7411 -17423, 70.65926, 147.8487 -17424, 67.12482, 128.5421 -17425, 69.51048, 131.1724 -17426, 69.71101, 137.643 -17427, 66.2875, 129.1074 -17428, 65.99484, 128.2892 -17429, 68.42721, 106.4421 -17430, 70.19993, 129.7897 -17431, 67.513, 126.6537 -17432, 64.9103, 126.3234 -17433, 67.90483, 133.3319 -17434, 68.72117, 110.1285 -17435, 69.82383, 132.965 -17436, 66.35869, 134.4128 -17437, 64.96389, 112.9538 -17438, 68.10303, 120.6951 -17439, 66.75597, 128.8385 -17440, 70.61415, 125.407 -17441, 68.98555, 144.2759 -17442, 66.08359, 124.9939 -17443, 68.9074, 114.1931 -17444, 70.61363, 117.2962 -17445, 70.6372, 151.222 -17446, 70.41624, 148.9906 -17447, 70.83968, 145.3063 -17448, 70.65043, 117.1631 -17449, 65.80934, 138.862 -17450, 66.92804, 128.9616 -17451, 70.39752, 126.0571 -17452, 72.50206, 147.8171 -17453, 64.03816, 120.2204 -17454, 67.21913, 123.7812 -17455, 67.61897, 129.5538 -17456, 68.35799, 134.8242 -17457, 68.28884, 132.8389 -17458, 69.1259, 137.0335 -17459, 69.41682, 128.1469 -17460, 67.77817, 138.1283 -17461, 66.81717, 143.9722 -17462, 66.75222, 128.8606 -17463, 70.87992, 148.1767 -17464, 67.89296, 119.2523 -17465, 68.241, 134.4452 -17466, 69.38423, 145.2439 -17467, 67.65062, 131.6738 -17468, 64.91414, 127.9493 -17469, 69.34408, 128.3066 -17470, 67.92756, 130.1062 -17471, 67.10739, 132.5064 -17472, 70.39954, 116.3744 -17473, 68.23497, 138.2569 -17474, 65.60851, 122.0313 -17475, 69.05463, 130.5581 -17476, 69.12682, 140.6556 -17477, 70.88868, 142.4583 -17478, 67.58599, 132.6764 -17479, 67.32745, 119.78 -17480, 67.12344, 124.6291 -17481, 67.61494, 123.2273 -17482, 67.66575, 128.987 -17483, 69.5664, 147.4409 -17484, 69.15809, 132.131 -17485, 68.67322, 130.7502 -17486, 66.99931, 114.139 -17487, 65.92524, 135.0721 -17488, 71.79475, 128.5656 -17489, 69.80914, 128.4846 -17490, 68.67485, 147.9136 -17491, 69.78355, 144.2045 -17492, 66.4674, 126.0095 -17493, 67.7098, 102.0889 -17494, 68.07478, 121.1104 -17495, 68.83845, 127.8095 -17496, 66.26448, 116.7611 -17497, 67.13351, 109.3082 -17498, 71.7536, 135.465 -17499, 69.04101, 135.8275 -17500, 66.32523, 118.2465 -17501, 66.14545, 105.8383 -17502, 66.29814, 122.1135 -17503, 69.04615, 124.2771 -17504, 68.4843, 137.9207 -17505, 69.22513, 152.3623 -17506, 65.09487, 116.8324 -17507, 69.82687, 137.7917 -17508, 71.35732, 141.2236 -17509, 69.78746, 144.7297 -17510, 67.53645, 132.4694 -17511, 71.56001, 134.0619 -17512, 66.63729, 110.7138 -17513, 70.40909, 152.2089 -17514, 69.48909, 127.0428 -17515, 66.23063, 125.2783 -17516, 68.48589, 121.0761 -17517, 67.04085, 123.1234 -17518, 67.27063, 137.0571 -17519, 71.97956, 143.4563 -17520, 70.96103, 146.4419 -17521, 66.91292, 131.9401 -17522, 68.28653, 131.3733 -17523, 67.93407, 114.6522 -17524, 69.21084, 126.1387 -17525, 69.30884, 126.5639 -17526, 70.80526, 135.2671 -17527, 67.93951, 109.9232 -17528, 67.56284, 107.6989 -17529, 68.09715, 124.0935 -17530, 70.12763, 129.9578 -17531, 66.98102, 131.5794 -17532, 68.86713, 146.9701 -17533, 65.2471, 104.3321 -17534, 68.7895, 112.7259 -17535, 66.34859, 115.9226 -17536, 65.34809, 115.9247 -17537, 68.56905, 142.9977 -17538, 68.42731, 128.6519 -17539, 63.02668, 117.3216 -17540, 70.48699, 108.167 -17541, 68.76397, 116.1651 -17542, 67.79336, 125.918 -17543, 70.62234, 128.4205 -17544, 70.83431, 133.99 -17545, 66.67394, 104.0444 -17546, 68.11247, 115.8479 -17547, 69.17367, 126.6247 -17548, 64.44211, 106.5789 -17549, 64.78017, 116.4003 -17550, 66.10999, 133.4851 -17551, 65.87608, 125.1903 -17552, 66.10888, 117.348 -17553, 68.80248, 128.6236 -17554, 66.81104, 131.7218 -17555, 69.08557, 113.5234 -17556, 65.7806, 111.8252 -17557, 71.0256, 126.3278 -17558, 66.96471, 114.1668 -17559, 67.35775, 125.6802 -17560, 68.96066, 115.0578 -17561, 70.45835, 131.7719 -17562, 65.83663, 125.7059 -17563, 69.09294, 140.4586 -17564, 70.01214, 135.788 -17565, 70.05774, 131.9843 -17566, 68.80506, 118.9164 -17567, 71.03993, 114.2464 -17568, 66.96363, 119.7721 -17569, 68.13431, 143.9173 -17570, 68.12636, 134.6963 -17571, 65.78844, 115.5098 -17572, 66.52245, 141.3431 -17573, 66.4821, 119.7862 -17574, 66.78109, 111.4848 -17575, 70.63527, 129.1964 -17576, 64.84494, 125.1476 -17577, 66.94689, 113.3937 -17578, 69.9777, 146.588 -17579, 68.47808, 126.7218 -17580, 71.90407, 129.2662 -17581, 66.16301, 134.7019 -17582, 70.373, 127.0987 -17583, 69.51213, 154.7542 -17584, 68.62782, 115.5711 -17585, 68.02584, 112.8388 -17586, 68.93595, 128.5597 -17587, 68.45787, 143.0222 -17588, 71.04919, 150.0566 -17589, 68.41924, 133.9914 -17590, 66.17319, 129.4204 -17591, 68.25954, 123.7291 -17592, 69.45543, 126.2942 -17593, 67.36318, 131.4997 -17594, 70.46899, 129.5623 -17595, 65.38946, 122.8568 -17596, 66.58764, 107.3435 -17597, 68.94909, 123.1888 -17598, 71.99101, 132.4664 -17599, 66.52168, 90.28757 -17600, 65.33005, 103.7244 -17601, 70.78015, 122.0199 -17602, 67.59295, 150.5815 -17603, 70.60438, 130.0759 -17604, 65.41199, 127.4417 -17605, 68.62862, 131.5481 -17606, 69.74755, 135.2463 -17607, 68.1019, 124.3764 -17608, 70.11839, 116.9938 -17609, 68.67284, 131.3305 -17610, 67.5545, 130.8208 -17611, 69.10032, 140.3478 -17612, 65.02648, 114.67 -17613, 67.66499, 100.9845 -17614, 66.05669, 127.6383 -17615, 68.56903, 123.1565 -17616, 71.14656, 154.5352 -17617, 68.34943, 142.6295 -17618, 67.52165, 129.4453 -17619, 66.28252, 110.107 -17620, 66.28898, 111.789 -17621, 67.38143, 118.9327 -17622, 64.96211, 116.1956 -17623, 68.06586, 128.5962 -17624, 69.29725, 122.9534 -17625, 68.59195, 124.7235 -17626, 68.36335, 115.9058 -17627, 68.20277, 124.6159 -17628, 67.63228, 113.3939 -17629, 68.55703, 131.2876 -17630, 67.80819, 109.1425 -17631, 69.84982, 124.792 -17632, 67.60338, 124.7089 -17633, 66.71585, 129.8961 -17634, 68.47311, 128.0554 -17635, 66.60304, 145.09 -17636, 67.27537, 118.608 -17637, 70.94362, 119.4777 -17638, 68.47006, 137.1918 -17639, 68.82753, 129.1745 -17640, 70.8099, 140.7936 -17641, 68.3647, 149.1508 -17642, 70.78792, 139.6307 -17643, 67.27509, 123.7572 -17644, 67.20986, 148.5905 -17645, 67.4203, 122.0798 -17646, 69.04477, 126.2105 -17647, 65.38357, 100.095 -17648, 65.61573, 132.7978 -17649, 69.85783, 118.9502 -17650, 67.36017, 105.2444 -17651, 62.6732, 121.4203 -17652, 70.42525, 121.7662 -17653, 67.26572, 126.6487 -17654, 68.51747, 143.4521 -17655, 64.26348, 106.0661 -17656, 70.26415, 145.1632 -17657, 67.41239, 114.509 -17658, 66.90254, 124.9441 -17659, 67.09326, 103.5604 -17660, 69.77547, 130.6445 -17661, 68.33065, 118.0593 -17662, 68.26423, 136.1453 -17663, 71.57294, 143.9069 -17664, 65.40654, 121.508 -17665, 67.34236, 123.9898 -17666, 68.37858, 146.2403 -17667, 66.6348, 124.2302 -17668, 69.29278, 124.7185 -17669, 67.92344, 101.0071 -17670, 69.22177, 109.5712 -17671, 67.81513, 140.0702 -17672, 68.53579, 150.1922 -17673, 68.44375, 116.0455 -17674, 66.7314, 123.9785 -17675, 66.60584, 119.3897 -17676, 68.23841, 130.5193 -17677, 67.80735, 118.0474 -17678, 69.12848, 135.7411 -17679, 68.27442, 125.7874 -17680, 66.25022, 111.829 -17681, 66.69382, 137.1941 -17682, 69.13214, 121.0271 -17683, 65.10633, 124.076 -17684, 66.68091, 114.9335 -17685, 68.83099, 130.5804 -17686, 64.99021, 107.8868 -17687, 65.10463, 119.2647 -17688, 66.23363, 129.517 -17689, 70.40311, 140.5745 -17690, 69.1741, 142.1562 -17691, 70.94219, 155.5272 -17692, 69.77945, 141.9648 -17693, 68.07987, 128.9409 -17694, 71.18967, 135.8515 -17695, 68.68805, 132.4254 -17696, 67.13456, 127.5693 -17697, 69.38753, 140.057 -17698, 69.78403, 112.8273 -17699, 70.54483, 142.3329 -17700, 69.26943, 128.3769 -17701, 62.75187, 123.6565 -17702, 68.67501, 124.052 -17703, 69.80293, 115.4548 -17704, 68.42678, 143.1792 -17705, 69.45741, 138.7257 -17706, 67.9611, 132.2818 -17707, 70.27294, 147.6049 -17708, 69.4698, 115.1695 -17709, 66.0276, 132.7526 -17710, 70.05938, 119.229 -17711, 69.20764, 134.5649 -17712, 67.91794, 128.9604 -17713, 64.29769, 129.4822 -17714, 68.08515, 132.9598 -17715, 64.99793, 130.275 -17716, 67.5616, 113.1737 -17717, 66.51537, 134.7376 -17718, 67.68945, 130.292 -17719, 68.90486, 110.8739 -17720, 66.18914, 115.6845 -17721, 69.75767, 127.8686 -17722, 66.76657, 140.9137 -17723, 67.08656, 119.2133 -17724, 69.01353, 113.2377 -17725, 68.92044, 135.0273 -17726, 65.85728, 126.3403 -17727, 67.17593, 141.6974 -17728, 67.30636, 99.24041 -17729, 66.94324, 130.8662 -17730, 68.50491, 122.4066 -17731, 68.74354, 125.7904 -17732, 65.76227, 104.6801 -17733, 69.09257, 136.0122 -17734, 68.94939, 118.2589 -17735, 70.09213, 125.8561 -17736, 69.18731, 133.4524 -17737, 68.4954, 128.8647 -17738, 69.51338, 125.0658 -17739, 66.63248, 116.099 -17740, 71.0828, 126.8249 -17741, 69.24003, 121.6796 -17742, 67.58275, 107.368 -17743, 67.47076, 135.8448 -17744, 67.46227, 154.3603 -17745, 66.76317, 117.0371 -17746, 68.17367, 146.8522 -17747, 69.46524, 134.8602 -17748, 66.62973, 121.8982 -17749, 66.44354, 107.1741 -17750, 64.64407, 122.6856 -17751, 67.3738, 125.9878 -17752, 67.15214, 118.8415 -17753, 67.02086, 122.0688 -17754, 65.3578, 119.4367 -17755, 68.64967, 135.319 -17756, 65.73185, 107.9237 -17757, 70.26659, 145.7515 -17758, 67.98652, 108.0164 -17759, 68.12168, 103.4226 -17760, 66.71189, 113.731 -17761, 68.95181, 118.5587 -17762, 64.05937, 107.2392 -17763, 67.8327, 99.86461 -17764, 65.13404, 128.6271 -17765, 69.83556, 140.1353 -17766, 64.58079, 117.7762 -17767, 66.27481, 139.9699 -17768, 68.44232, 136.3386 -17769, 69.49662, 126.653 -17770, 67.00532, 136.4169 -17771, 66.56845, 119.5951 -17772, 71.46587, 140.205 -17773, 71.15181, 127.4632 -17774, 67.45321, 120.4057 -17775, 67.04669, 124.6743 -17776, 70.26367, 136.9014 -17777, 67.61734, 124.1445 -17778, 69.14406, 126.3297 -17779, 68.51538, 119.557 -17780, 67.15402, 109.3047 -17781, 67.39338, 116.0406 -17782, 63.98085, 130.7299 -17783, 67.69502, 121.9959 -17784, 63.70691, 115.2735 -17785, 68.96742, 148.4415 -17786, 67.80944, 110.1538 -17787, 65.94609, 123.3123 -17788, 66.7438, 125.529 -17789, 69.28237, 129.4881 -17790, 67.30155, 138.8039 -17791, 64.46644, 122.0999 -17792, 70.54669, 152.5065 -17793, 70.72644, 125.0889 -17794, 70.68136, 124.8044 -17795, 67.64608, 123.3561 -17796, 70.01336, 137.4849 -17797, 70.26996, 132.6404 -17798, 64.43709, 117.2493 -17799, 65.71351, 107.3677 -17800, 67.51238, 115.8008 -17801, 67.41874, 136.2018 -17802, 67.24278, 127.5762 -17803, 66.92857, 122.3716 -17804, 67.00632, 121.4926 -17805, 71.00224, 142.3814 -17806, 65.08169, 131.7073 -17807, 68.68027, 138.8542 -17808, 68.95186, 119.4662 -17809, 65.72262, 125.0601 -17810, 67.25835, 112.9622 -17811, 68.83265, 141.0966 -17812, 66.0971, 114.9541 -17813, 68.72897, 103.6782 -17814, 70.73673, 121.2629 -17815, 67.11241, 102.611 -17816, 68.28176, 132.165 -17817, 66.27818, 111.2475 -17818, 68.17814, 130.9026 -17819, 67.39827, 133.3838 -17820, 68.26178, 140.6728 -17821, 69.16235, 139.975 -17822, 69.95678, 144.1954 -17823, 65.80928, 127.7615 -17824, 70.35926, 115.0103 -17825, 72.16204, 128.699 -17826, 70.5984, 127.022 -17827, 67.54096, 116.5187 -17828, 70.90351, 149.8015 -17829, 66.69164, 116.7514 -17830, 67.12278, 124.5669 -17831, 66.35003, 126.2649 -17832, 67.96086, 123.9389 -17833, 66.60797, 129.7934 -17834, 70.68833, 138.1275 -17835, 67.46758, 120.3863 -17836, 71.41271, 134.6558 -17837, 67.32752, 127.3763 -17838, 70.63214, 135.4599 -17839, 68.45124, 140.1733 -17840, 64.6863, 122.1215 -17841, 70.21472, 128.4004 -17842, 67.95426, 114.9715 -17843, 70.44048, 113.0864 -17844, 68.92179, 132.3365 -17845, 70.6785, 128.997 -17846, 67.61551, 101.6088 -17847, 66.09501, 128.1073 -17848, 68.55704, 121.8583 -17849, 69.19175, 136.8494 -17850, 68.16405, 119.0371 -17851, 69.0402, 121.7373 -17852, 66.66933, 131.2186 -17853, 69.87747, 133.1686 -17854, 71.59021, 143.2877 -17855, 67.38968, 131.6709 -17856, 68.20687, 122.5181 -17857, 69.68547, 129.6884 -17858, 67.93426, 121.8744 -17859, 67.1179, 119.5904 -17860, 67.15852, 131.0955 -17861, 68.59133, 132.2124 -17862, 69.26014, 136.4103 -17863, 70.07126, 135.873 -17864, 67.0628, 123.2518 -17865, 69.13139, 133.561 -17866, 68.40603, 150.925 -17867, 69.7404, 134.901 -17868, 69.49899, 145.542 -17869, 66.14494, 141.4612 -17870, 67.79179, 122.9394 -17871, 66.74223, 123.4556 -17872, 66.63048, 110.9128 -17873, 68.4112, 120.4405 -17874, 69.37198, 129.1054 -17875, 65.74819, 109.5126 -17876, 66.01136, 128.2502 -17877, 67.90718, 125.0989 -17878, 67.16599, 139.2742 -17879, 66.48646, 114.6859 -17880, 65.71394, 130.992 -17881, 68.79098, 141.218 -17882, 67.99196, 133.9622 -17883, 66.5631, 127.67 -17884, 70.817, 125.1695 -17885, 66.64471, 129.4135 -17886, 67.40685, 150.7738 -17887, 66.17396, 103.0751 -17888, 67.97678, 129.4215 -17889, 68.48737, 128.1923 -17890, 69.52669, 154.935 -17891, 67.68157, 119.2703 -17892, 65.55334, 103.3069 -17893, 66.66098, 113.6555 -17894, 66.04091, 134.5409 -17895, 68.13648, 130.8127 -17896, 68.13583, 120.3052 -17897, 67.14269, 123.0069 -17898, 66.04267, 110.8981 -17899, 69.08156, 150.8598 -17900, 66.61972, 112.7862 -17901, 66.93529, 111.1 -17902, 67.35236, 125.911 -17903, 68.51651, 131.9403 -17904, 64.4288, 113.6686 -17905, 67.61939, 135.8584 -17906, 67.13547, 136.8187 -17907, 66.36896, 128.5891 -17908, 68.5461, 121.3929 -17909, 69.13348, 118.3683 -17910, 68.62844, 117.1061 -17911, 65.0907, 107.1077 -17912, 66.98252, 104.5822 -17913, 68.60319, 137.7396 -17914, 71.20318, 127.5626 -17915, 67.03676, 116.6844 -17916, 66.41179, 115.3066 -17917, 66.68877, 127.3655 -17918, 69.89705, 138.6612 -17919, 68.88841, 120.0867 -17920, 68.53916, 124.4342 -17921, 68.01568, 126.3073 -17922, 68.68683, 134.0053 -17923, 65.40277, 128.8785 -17924, 68.67509, 124.1615 -17925, 67.4067, 123.0948 -17926, 67.17129, 117.9041 -17927, 65.59616, 115.5202 -17928, 68.67567, 149.735 -17929, 70.48483, 137.5004 -17930, 68.51527, 129.2966 -17931, 67.69421, 127.8233 -17932, 66.9375, 131.2734 -17933, 67.81, 134.0172 -17934, 64.04524, 104.574 -17935, 67.23027, 117.1627 -17936, 72.83977, 134.8802 -17937, 67.47092, 119.7091 -17938, 65.71528, 129.7431 -17939, 71.92649, 124.2943 -17940, 70.05502, 131.3468 -17941, 67.87492, 132.6076 -17942, 66.50503, 119.4857 -17943, 66.91365, 132.5616 -17944, 67.88395, 128.4869 -17945, 66.72951, 140.1601 -17946, 68.50989, 127.1386 -17947, 66.02751, 116.4385 -17948, 65.83821, 133.1072 -17949, 66.03926, 113.465 -17950, 70.46449, 121.1387 -17951, 67.62774, 139.2346 -17952, 67.34629, 139.7259 -17953, 68.28918, 135.4869 -17954, 66.68415, 131.9723 -17955, 67.9826, 140.5009 -17956, 68.07289, 129.6271 -17957, 69.451, 131.9335 -17958, 69.86608, 153.0546 -17959, 68.37755, 135.7714 -17960, 68.6245, 141.193 -17961, 66.61664, 132.7202 -17962, 70.06392, 145.6707 -17963, 69.15142, 118.9946 -17964, 68.98655, 141.885 -17965, 68.9009, 132.7891 -17966, 68.21302, 120.9478 -17967, 66.3911, 120.5331 -17968, 66.83657, 120.8557 -17969, 66.48676, 128.8555 -17970, 67.74059, 124.7659 -17971, 68.18607, 128.0024 -17972, 69.87665, 113.3553 -17973, 67.0486, 122.6413 -17974, 67.27659, 102.4448 -17975, 66.51091, 119.3634 -17976, 68.91221, 131.2366 -17977, 65.68233, 110.3737 -17978, 72.45968, 133.0092 -17979, 68.18543, 130.0549 -17980, 69.14627, 149.4217 -17981, 66.64452, 128.6803 -17982, 69.28048, 141.1256 -17983, 64.94449, 117.1219 -17984, 67.63184, 129.0595 -17985, 69.17876, 118.432 -17986, 68.17164, 119.7833 -17987, 67.87229, 129.1417 -17988, 66.08932, 116.2913 -17989, 68.80233, 130.847 -17990, 67.47177, 124.7299 -17991, 69.04627, 134.744 -17992, 65.53588, 135.9945 -17993, 66.41675, 118.6227 -17994, 70.97724, 143.0605 -17995, 70.31771, 126.9513 -17996, 68.63439, 123.4122 -17997, 66.04782, 128.4055 -17998, 68.97705, 141.9362 -17999, 68.91452, 133.6861 -18000, 67.87146, 107.1111 -18001, 67.37218, 133.1697 -18002, 66.3178, 118.4692 -18003, 66.48568, 117.9041 -18004, 69.2381, 132.462 -18005, 67.2139, 132.6842 -18006, 68.50477, 134.123 -18007, 63.66317, 136.7526 -18008, 66.32945, 110.6483 -18009, 67.10945, 123.3761 -18010, 70.02339, 132.8187 -18011, 66.06018, 115.8997 -18012, 68.59984, 106.3343 -18013, 67.16997, 133.2448 -18014, 68.15961, 126.2497 -18015, 67.9255, 136.4886 -18016, 68.24803, 131.2595 -18017, 68.63838, 126.5846 -18018, 67.30494, 119.9612 -18019, 68.54865, 134.5564 -18020, 68.53894, 133.6246 -18021, 68.78754, 122.2611 -18022, 69.70884, 135.1988 -18023, 65.90638, 125.9987 -18024, 70.37854, 129.9166 -18025, 70.70388, 139.938 -18026, 67.22265, 114.1903 -18027, 69.80605, 131.4128 -18028, 67.97377, 115.0723 -18029, 69.83246, 129.3358 -18030, 69.33122, 127.4932 -18031, 68.67805, 125.6517 -18032, 69.58794, 131.1589 -18033, 68.42502, 124.2701 -18034, 67.69161, 113.9616 -18035, 70.2256, 145.9646 -18036, 70.04402, 139.6768 -18037, 67.95373, 139.5456 -18038, 68.3128, 121.7718 -18039, 68.40937, 122.1585 -18040, 66.4482, 133.4419 -18041, 65.28092, 124.6637 -18042, 68.09486, 128.0449 -18043, 66.70524, 120.472 -18044, 65.41192, 117.5336 -18045, 65.85663, 135.9652 -18046, 70.74685, 149.2883 -18047, 69.57387, 117.9533 -18048, 68.94783, 128.49 -18049, 68.47448, 126.3915 -18050, 71.04807, 152.0604 -18051, 67.63577, 124.4287 -18052, 65.52926, 134.8985 -18053, 66.79635, 119.705 -18054, 67.76397, 141.058 -18055, 64.71368, 120.2188 -18056, 66.01498, 109.751 -18057, 69.09526, 128.5564 -18058, 69.5558, 117.3931 -18059, 70.0715, 137.8603 -18060, 67.86641, 126.4714 -18061, 70.0659, 152.4405 -18062, 68.80896, 115.4877 -18063, 68.08706, 121.7255 -18064, 69.52669, 136.2363 -18065, 67.03169, 119.8095 -18066, 65.28391, 103.4991 -18067, 69.47478, 140.6912 -18068, 66.37838, 118.5934 -18069, 66.31288, 123.2614 -18070, 71.26059, 139.1393 -18071, 64.42409, 127.9856 -18072, 67.46592, 129.3959 -18073, 69.28848, 132.1143 -18074, 69.92655, 121.1621 -18075, 67.78948, 131.155 -18076, 64.45606, 111.9183 -18077, 69.29649, 141.9219 -18078, 67.70022, 118.3203 -18079, 64.05875, 112.507 -18080, 65.87971, 107.3144 -18081, 64.19588, 111.4285 -18082, 67.50863, 124.7257 -18083, 71.16467, 146.5501 -18084, 68.71092, 109.9617 -18085, 67.60347, 138.4381 -18086, 67.1752, 117.9673 -18087, 68.9361, 128.3238 -18088, 71.93971, 145.1521 -18089, 67.45158, 127.374 -18090, 68.4984, 127.2154 -18091, 66.04641, 131.7895 -18092, 69.16729, 135.4433 -18093, 66.9408, 130.642 -18094, 71.99802, 149.8457 -18095, 66.92567, 121.6816 -18096, 68.41449, 120.9509 -18097, 68.01572, 105.1644 -18098, 70.20919, 139.4911 -18099, 67.59821, 124.802 -18100, 71.51942, 129.1836 -18101, 67.61313, 128.6954 -18102, 68.63738, 128.6178 -18103, 65.69314, 105.1192 -18104, 70.04372, 137.0862 -18105, 66.35456, 122.6138 -18106, 67.49569, 139.7088 -18107, 63.92701, 111.9422 -18108, 67.44722, 120.0132 -18109, 69.96202, 100.6786 -18110, 68.80541, 121.0008 -18111, 67.75075, 114.8156 -18112, 69.7042, 126.8603 -18113, 69.64501, 120.8241 -18114, 69.39123, 130.6514 -18115, 68.9035, 134.7614 -18116, 66.30156, 103.3628 -18117, 65.82235, 137.0039 -18118, 66.6285, 122.64 -18119, 65.68185, 126.536 -18120, 70.3089, 143.4456 -18121, 71.60372, 129.4984 -18122, 70.64766, 125.3179 -18123, 69.25148, 137.409 -18124, 67.11941, 134.9583 -18125, 62.681, 113.2199 -18126, 69.29774, 136.554 -18127, 68.59213, 125.7968 -18128, 70.21639, 126.2265 -18129, 69.27237, 126.6931 -18130, 67.47561, 133.393 -18131, 67.10278, 142.9183 -18132, 68.97598, 136.8493 -18133, 68.87987, 135.7244 -18134, 62.51831, 124.7827 -18135, 70.16181, 133.7963 -18136, 70.11142, 129.0453 -18137, 71.00201, 127.2179 -18138, 68.83197, 126.4874 -18139, 65.55569, 113.4283 -18140, 69.18478, 114.7062 -18141, 67.17728, 130.403 -18142, 67.96749, 116.2167 -18143, 63.09629, 109.8718 -18144, 67.81887, 125.685 -18145, 72.54256, 140.8276 -18146, 68.38361, 114.9645 -18147, 66.57869, 127.7382 -18148, 72.07371, 137.6268 -18149, 66.14913, 118.2779 -18150, 68.70572, 113.5148 -18151, 69.16225, 144.8836 -18152, 69.46824, 112.4765 -18153, 66.60941, 100.0013 -18154, 65.79111, 117.3869 -18155, 65.76647, 112.3201 -18156, 67.22625, 132.7827 -18157, 69.2736, 120.489 -18158, 68.47907, 128.7633 -18159, 70.22812, 138.8851 -18160, 66.46453, 125.1114 -18161, 67.97522, 125.1482 -18162, 68.8071, 120.3047 -18163, 68.32443, 118.6195 -18164, 69.47959, 126.1822 -18165, 68.03194, 137.12 -18166, 69.48829, 139.8606 -18167, 69.37585, 112.6907 -18168, 69.23615, 121.2323 -18169, 68.69017, 131.3072 -18170, 71.45863, 139.9082 -18171, 67.39093, 122.1571 -18172, 68.53211, 134.3921 -18173, 70.2828, 127.9534 -18174, 67.65305, 110.9933 -18175, 67.20857, 123.4236 -18176, 66.31937, 106.9169 -18177, 63.79425, 115.0191 -18178, 69.65965, 132.1418 -18179, 68.64995, 128.8615 -18180, 67.3593, 122.2451 -18181, 70.33984, 131.6924 -18182, 67.34878, 118.4924 -18183, 66.86827, 114.3971 -18184, 69.52901, 127.1832 -18185, 68.90152, 147.9446 -18186, 70.01268, 142.4176 -18187, 70.59863, 145.8138 -18188, 68.57766, 141.3239 -18189, 64.83389, 98.21334 -18190, 65.52077, 120.3068 -18191, 64.95625, 119.2154 -18192, 66.30334, 124.0317 -18193, 69.48549, 106.2442 -18194, 69.49559, 132.4523 -18195, 68.81243, 125.2854 -18196, 69.2587, 136.2841 -18197, 67.39374, 134.3775 -18198, 70.86215, 127.6207 -18199, 65.80325, 130.9248 -18200, 64.61694, 130.3277 -18201, 70.18644, 141.1758 -18202, 65.12985, 145.219 -18203, 66.26916, 122.1385 -18204, 67.64688, 135.0033 -18205, 70.90986, 129.1092 -18206, 68.94223, 140.3829 -18207, 69.88886, 113.3361 -18208, 67.5314, 138.2173 -18209, 65.13228, 118.1327 -18210, 68.75247, 126.3602 -18211, 66.64471, 114.0659 -18212, 65.97446, 120.8874 -18213, 68.73431, 130.3753 -18214, 65.67938, 131.3553 -18215, 65.55778, 115.0373 -18216, 67.69354, 127.2255 -18217, 66.82119, 114.3377 -18218, 68.46759, 131.2031 -18219, 68.89698, 134.2954 -18220, 65.08409, 115.3981 -18221, 71.76925, 117.198 -18222, 69.8877, 124.6225 -18223, 64.86973, 126.3919 -18224, 70.09753, 141.5936 -18225, 67.35945, 130.7049 -18226, 68.02039, 144.4665 -18227, 66.73404, 128.6324 -18228, 65.62875, 127.3425 -18229, 65.79502, 116.3517 -18230, 70.61392, 129.3511 -18231, 71.74355, 123.4305 -18232, 67.49866, 131.0747 -18233, 66.33294, 120.6984 -18234, 67.92479, 134.5304 -18235, 68.63009, 131.2724 -18236, 67.10296, 113.8506 -18237, 64.19394, 104.6135 -18238, 70.73008, 125.7546 -18239, 63.13516, 118.8045 -18240, 69.24981, 129.8799 -18241, 64.52242, 119.4434 -18242, 66.36544, 126.2793 -18243, 67.62992, 125.1355 -18244, 67.45805, 123.2317 -18245, 68.97952, 122.3737 -18246, 66.40492, 126.2988 -18247, 68.53298, 131.8284 -18248, 65.28708, 111.5392 -18249, 68.17779, 149.5809 -18250, 68.97437, 120.1771 -18251, 70.55554, 129.7295 -18252, 68.91172, 121.2899 -18253, 68.38275, 127.8957 -18254, 70.31738, 114.6335 -18255, 67.88363, 140.9839 -18256, 67.42592, 98.99675 -18257, 70.05856, 129.2721 -18258, 70.19548, 145.6526 -18259, 66.16502, 104.1451 -18260, 66.37637, 128.7241 -18261, 69.99829, 130.8869 -18262, 68.99134, 146.4337 -18263, 68.94388, 139.6823 -18264, 64.99491, 123.3346 -18265, 69.11084, 125.0166 -18266, 67.93461, 116.0817 -18267, 67.01411, 134.6481 -18268, 65.32575, 141.6096 -18269, 71.45383, 134.6091 -18270, 68.01152, 124.4252 -18271, 64.87885, 112.5545 -18272, 68.14952, 119.4716 -18273, 66.66531, 116.4358 -18274, 68.66471, 123.5617 -18275, 67.38528, 123.4536 -18276, 68.49113, 120.9934 -18277, 66.78587, 110.6601 -18278, 69.2274, 115.8926 -18279, 65.96948, 127.8767 -18280, 66.35522, 121.45 -18281, 68.54128, 131.7424 -18282, 66.11305, 102.6734 -18283, 68.28863, 112.3732 -18284, 67.43632, 121.4337 -18285, 66.10499, 109.3116 -18286, 68.51568, 127.1865 -18287, 67.35712, 122.5386 -18288, 65.67569, 132.4576 -18289, 66.88722, 133.6719 -18290, 65.12152, 121.4696 -18291, 68.6178, 126.8987 -18292, 66.13103, 113.5217 -18293, 70.83591, 137.3996 -18294, 68.90076, 145.7439 -18295, 66.21815, 129.6257 -18296, 68.06749, 133.4515 -18297, 68.34053, 126.9106 -18298, 68.80582, 137.9986 -18299, 67.06065, 116.3153 -18300, 66.06083, 111.4023 -18301, 62.72779, 117.2561 -18302, 71.20406, 125.0336 -18303, 67.21888, 124.9911 -18304, 65.65855, 111.0068 -18305, 68.06644, 125.4116 -18306, 70.10401, 139.2201 -18307, 66.70493, 120.9451 -18308, 67.71756, 131.8942 -18309, 62.67446, 110.0678 -18310, 65.29473, 106.2219 -18311, 67.20517, 119.7847 -18312, 67.29519, 144.4307 -18313, 68.44048, 133.3402 -18314, 70.78181, 146.3325 -18315, 66.39307, 128.1566 -18316, 67.24037, 112.4023 -18317, 69.33963, 140.6288 -18318, 65.37485, 118.4317 -18319, 71.49449, 124.4993 -18320, 70.83151, 133.3373 -18321, 66.24703, 113.0378 -18322, 65.2573, 113.6279 -18323, 65.20991, 125.9694 -18324, 69.1082, 126.4711 -18325, 71.14384, 125.8373 -18326, 66.79003, 128.9918 -18327, 69.31011, 153.4923 -18328, 64.90285, 132.3529 -18329, 65.45378, 114.0868 -18330, 69.28697, 119.7079 -18331, 65.5537, 112.4582 -18332, 69.72966, 137.5734 -18333, 67.05884, 115.0583 -18334, 70.02535, 133.1753 -18335, 71.40333, 143.8659 -18336, 65.19703, 126.4798 -18337, 66.57693, 122.7911 -18338, 69.39658, 134.2674 -18339, 68.44566, 124.6497 -18340, 72.74185, 122.6723 -18341, 67.46665, 134.8106 -18342, 72.08529, 148.5511 -18343, 66.51478, 134.3474 -18344, 68.49908, 137.7086 -18345, 69.51313, 140.3623 -18346, 72.67841, 160.6777 -18347, 64.87969, 117.6116 -18348, 66.81518, 131.5526 -18349, 64.11176, 128.3093 -18350, 70.18729, 127.4651 -18351, 64.37983, 111.3805 -18352, 67.80292, 128.6796 -18353, 69.3405, 129.3896 -18354, 65.40457, 132.2629 -18355, 69.5795, 139.6768 -18356, 66.21928, 113.7115 -18357, 65.52875, 102.465 -18358, 66.81484, 136.6555 -18359, 67.08464, 126.9116 -18360, 66.42219, 133.5132 -18361, 64.69989, 107.3891 -18362, 67.27032, 124.3337 -18363, 66.53975, 113.5752 -18364, 68.78295, 132.6993 -18365, 68.09623, 129.5183 -18366, 65.65343, 108.2289 -18367, 67.29559, 129.9961 -18368, 70.47152, 141.2098 -18369, 68.77322, 139.9161 -18370, 67.3118, 134.2859 -18371, 71.43053, 132.9983 -18372, 69.27809, 137.9838 -18373, 68.6156, 122.2664 -18374, 70.38529, 144.5917 -18375, 68.90408, 113.6984 -18376, 69.956, 137.618 -18377, 69.08083, 126.6975 -18378, 68.58346, 127.6423 -18379, 69.55913, 135.0345 -18380, 67.87572, 131.5021 -18381, 68.04456, 125.3529 -18382, 69.61629, 130.6801 -18383, 67.38283, 126.7602 -18384, 70.06792, 133.7293 -18385, 65.72838, 126.3271 -18386, 68.66827, 120.6609 -18387, 69.23921, 144.166 -18388, 67.60529, 127.6045 -18389, 67.02823, 130.9427 -18390, 68.52986, 130.1434 -18391, 68.06148, 132.0809 -18392, 69.89291, 121.0481 -18393, 69.95674, 127.3249 -18394, 71.36783, 126.4851 -18395, 71.02923, 132.704 -18396, 67.45478, 124.9489 -18397, 65.64995, 111.3464 -18398, 70.54974, 118.2128 -18399, 64.73194, 127.1272 -18400, 68.39661, 126.2186 -18401, 66.75958, 141.6033 -18402, 70.36383, 143.4256 -18403, 68.07707, 121.5943 -18404, 70.95278, 154.5036 -18405, 65.56764, 123.9059 -18406, 69.43223, 106.3676 -18407, 67.31171, 126.8754 -18408, 70.92227, 133.0625 -18409, 68.71388, 121.1249 -18410, 66.50874, 132.745 -18411, 70.26147, 130.0088 -18412, 67.16654, 111.1425 -18413, 70.24561, 120.9162 -18414, 69.63362, 131.7987 -18415, 66.23707, 119.442 -18416, 69.83489, 125.9842 -18417, 68.70037, 130.8307 -18418, 69.63254, 139.143 -18419, 70.99486, 134.7143 -18420, 70.68998, 149.3115 -18421, 69.36635, 123.4528 -18422, 68.13314, 116.9677 -18423, 70.79422, 120.9634 -18424, 66.18385, 97.99029 -18425, 69.42133, 141.0527 -18426, 69.01491, 117.6252 -18427, 67.27059, 124.4138 -18428, 68.88229, 143.9361 -18429, 67.33816, 125.2068 -18430, 68.66516, 142.6448 -18431, 66.22914, 129.1967 -18432, 68.76597, 122.474 -18433, 69.53247, 115.2221 -18434, 71.49026, 142.5817 -18435, 66.50972, 133.654 -18436, 67.81402, 123.1049 -18437, 65.24439, 121.9487 -18438, 66.01804, 100.4529 -18439, 65.48158, 116.1882 -18440, 68.16192, 125.732 -18441, 65.02381, 134.4425 -18442, 66.88569, 130.0115 -18443, 67.39995, 96.39088 -18444, 65.66171, 109.2462 -18445, 67.95512, 127.9877 -18446, 63.62623, 110.8507 -18447, 69.18472, 108.1881 -18448, 66.551, 105.7101 -18449, 69.236, 110.3032 -18450, 69.26426, 117.98 -18451, 65.99389, 122.8317 -18452, 71.73307, 125.3396 -18453, 66.45155, 115.4263 -18454, 66.39266, 136.1279 -18455, 66.81631, 127.1059 -18456, 67.89039, 124.9759 -18457, 67.84615, 121.3787 -18458, 69.36484, 134.7724 -18459, 64.37297, 123.659 -18460, 72.89808, 138.8161 -18461, 66.99569, 116.2376 -18462, 71.71415, 134.3653 -18463, 70.09297, 135.7937 -18464, 68.57037, 144.2014 -18465, 69.00022, 135.0503 -18466, 69.20893, 120.8345 -18467, 69.46547, 133.6304 -18468, 70.79127, 130.4978 -18469, 68.78851, 118.4584 -18470, 67.9302, 135.4705 -18471, 66.4848, 126.2168 -18472, 65.27146, 101.3705 -18473, 65.50771, 98.70684 -18474, 67.43981, 115.5729 -18475, 69.16119, 151.2058 -18476, 67.83732, 115.3943 -18477, 66.49751, 131.5375 -18478, 68.69063, 116.851 -18479, 67.40924, 142.2469 -18480, 68.69726, 128.5186 -18481, 67.12827, 119.2494 -18482, 69.57438, 125.2213 -18483, 70.35553, 127.9276 -18484, 71.02956, 136.2053 -18485, 67.01715, 119.3356 -18486, 71.66632, 140.0392 -18487, 68.14304, 104.2278 -18488, 69.90342, 145.7605 -18489, 68.65728, 118.4992 -18490, 67.86381, 110.3406 -18491, 67.60299, 124.9038 -18492, 68.42162, 143.2337 -18493, 64.29405, 111.3888 -18494, 70.25668, 130.9311 -18495, 66.92782, 117.0246 -18496, 68.13117, 112.2702 -18497, 68.47671, 125.9732 -18498, 70.70443, 130.0618 -18499, 72.47871, 139.4575 -18500, 66.60089, 121.3741 -18501, 69.52894, 128.6671 -18502, 69.51429, 138.8626 -18503, 69.13138, 146.1917 -18504, 66.80915, 128.2992 -18505, 66.95452, 127.1524 -18506, 65.57553, 132.8521 -18507, 66.99722, 122.4956 -18508, 68.06291, 141.5624 -18509, 67.13541, 149.8053 -18510, 68.78744, 140.3871 -18511, 70.39841, 127.7709 -18512, 67.16952, 112.1317 -18513, 67.6426, 125.1871 -18514, 68.62432, 131.5505 -18515, 66.98255, 129.8261 -18516, 71.15912, 143.7729 -18517, 67.55843, 130.0446 -18518, 68.20677, 131.9831 -18519, 66.78195, 129.1513 -18520, 64.70211, 117.9549 -18521, 66.24742, 118.3215 -18522, 67.50724, 111.2721 -18523, 70.38629, 132.532 -18524, 66.2864, 138.8554 -18525, 66.4173, 110.4561 -18526, 67.91435, 120.5977 -18527, 66.42833, 130.4869 -18528, 70.51451, 144.908 -18529, 69.22832, 117.2825 -18530, 67.99826, 122.5487 -18531, 69.65771, 140.1853 -18532, 72.16883, 136.178 -18533, 69.49369, 118.7416 -18534, 64.38605, 113.8126 -18535, 64.55094, 114.6945 -18536, 68.23747, 112.8025 -18537, 68.02698, 117.2349 -18538, 66.43047, 95.71513 -18539, 69.86725, 148.5763 -18540, 66.96093, 111.8249 -18541, 68.82789, 125.2561 -18542, 66.90197, 129.6533 -18543, 67.30931, 126.2076 -18544, 67.52133, 123.9019 -18545, 66.81174, 137.8045 -18546, 65.82295, 120.199 -18547, 71.38764, 144.7086 -18548, 65.35643, 115.5945 -18549, 63.25179, 105.0179 -18550, 65.59107, 122.5182 -18551, 67.78908, 137.9392 -18552, 68.61336, 118.2248 -18553, 66.90249, 117.65 -18554, 70.02504, 139.5716 -18555, 66.22555, 127.3096 -18556, 67.74102, 142.398 -18557, 68.8943, 131.6782 -18558, 69.12125, 133.2563 -18559, 67.44687, 123.1274 -18560, 67.65991, 120.3186 -18561, 70.9585, 131.0829 -18562, 71.92717, 154.1861 -18563, 67.29513, 132.4132 -18564, 63.95244, 124.3648 -18565, 69.83187, 136.9095 -18566, 68.37524, 114.5381 -18567, 67.95803, 144.8281 -18568, 66.57707, 123.9629 -18569, 67.72062, 141.1541 -18570, 63.92725, 106.6814 -18571, 69.46167, 129.6969 -18572, 68.83466, 131.4672 -18573, 65.94714, 127.9311 -18574, 65.75023, 127.4329 -18575, 70.47518, 139.0174 -18576, 64.98932, 115.5069 -18577, 67.41353, 127.8081 -18578, 68.38407, 122.2271 -18579, 70.05637, 143.8614 -18580, 67.06958, 100.1749 -18581, 69.09877, 125.7953 -18582, 65.96505, 110.9834 -18583, 66.57586, 114.8681 -18584, 67.29729, 125.7866 -18585, 71.21423, 139.5315 -18586, 68.14138, 125.3772 -18587, 68.34001, 132.0128 -18588, 65.93383, 132.1972 -18589, 66.30774, 108.1026 -18590, 67.08573, 110.2558 -18591, 67.53056, 117.9915 -18592, 68.0261, 115.7176 -18593, 68.80557, 108.2525 -18594, 67.85261, 124.1566 -18595, 69.57975, 134.4556 -18596, 65.34904, 102.2823 -18597, 66.65974, 100.292 -18598, 70.67149, 141.6346 -18599, 70.13532, 136.6807 -18600, 67.42062, 114.6369 -18601, 69.4708, 114.7699 -18602, 67.6276, 135.9559 -18603, 67.18211, 131.4971 -18604, 64.45811, 125.6963 -18605, 68.95735, 122.046 -18606, 67.64248, 129.1718 -18607, 64.83179, 112.8573 -18608, 69.27039, 129.563 -18609, 66.83193, 117.5062 -18610, 72.23485, 151.5014 -18611, 65.01063, 95.82746 -18612, 68.34214, 126.7129 -18613, 66.62156, 130.1081 -18614, 67.08814, 133.7359 -18615, 69.05202, 128.0624 -18616, 68.23454, 133.8401 -18617, 68.37516, 135.1791 -18618, 67.03833, 138.5621 -18619, 70.80541, 132.8961 -18620, 66.73256, 141.7823 -18621, 65.72028, 108.2124 -18622, 66.41974, 111.5486 -18623, 67.57764, 134.0803 -18624, 69.56328, 129.1637 -18625, 67.62709, 121.1408 -18626, 65.16098, 122.078 -18627, 67.20458, 130.3198 -18628, 69.59194, 127.5957 -18629, 64.89401, 112.6321 -18630, 68.35388, 126.5067 -18631, 65.82881, 124.3733 -18632, 66.1868, 126.2654 -18633, 70.32643, 129.9479 -18634, 64.06977, 116.5794 -18635, 67.1713, 112.1838 -18636, 64.92458, 130.1598 -18637, 67.43431, 133.5765 -18638, 68.82895, 118.8026 -18639, 69.06337, 119.7953 -18640, 69.7271, 129.4766 -18641, 66.43212, 124.0251 -18642, 67.83192, 129.6701 -18643, 65.52728, 119.5522 -18644, 69.47555, 149.9544 -18645, 65.88912, 120.1125 -18646, 70.92408, 140.4445 -18647, 63.47126, 100.7746 -18648, 65.04097, 136.9673 -18649, 67.16204, 130.3048 -18650, 69.37409, 106.5867 -18651, 69.74416, 130.6283 -18652, 68.68581, 135.8803 -18653, 67.24642, 117.1742 -18654, 65.07326, 105.7219 -18655, 67.29306, 124.5546 -18656, 69.81604, 127.0576 -18657, 70.51899, 121.0529 -18658, 66.6253, 131.1694 -18659, 66.89401, 121.1997 -18660, 67.80165, 105.2037 -18661, 67.97818, 130.5677 -18662, 67.01481, 118.6079 -18663, 64.61004, 120.3031 -18664, 66.19053, 108.752 -18665, 68.07234, 123.3461 -18666, 67.97208, 111.8923 -18667, 64.15535, 128.6441 -18668, 69.75831, 120.5173 -18669, 64.32257, 104.5157 -18670, 69.32868, 128.1567 -18671, 71.4743, 152.8868 -18672, 64.42866, 107.8894 -18673, 68.0485, 139.8643 -18674, 68.41135, 124.3541 -18675, 69.90011, 133.7566 -18676, 68.02798, 134.4956 -18677, 71.979, 152.6473 -18678, 67.06678, 114.378 -18679, 67.47195, 143.9362 -18680, 65.75596, 123.9509 -18681, 69.11893, 117.6573 -18682, 69.61776, 128.4215 -18683, 64.42529, 93.4895 -18684, 68.86031, 124.3513 -18685, 71.35262, 149.7034 -18686, 65.26951, 109.6937 -18687, 67.07489, 116.9079 -18688, 67.17127, 131.3436 -18689, 65.73213, 94.24776 -18690, 68.68319, 133.4584 -18691, 69.1054, 105.3497 -18692, 68.04565, 120.0355 -18693, 69.40605, 128.4936 -18694, 71.15081, 154.0204 -18695, 67.57653, 124.0439 -18696, 66.19606, 113.86 -18697, 67.87278, 147.5407 -18698, 65.36336, 139.1989 -18699, 69.80543, 155.6269 -18700, 66.64909, 119.51 -18701, 68.84986, 128.6154 -18702, 69.83458, 135.5907 -18703, 65.32506, 119.5717 -18704, 64.73504, 130.5975 -18705, 63.47841, 100.2383 -18706, 69.27949, 144.9208 -18707, 68.85303, 130.5177 -18708, 66.69499, 106.0517 -18709, 64.29055, 124.4514 -18710, 66.35597, 128.4833 -18711, 69.72637, 122.6604 -18712, 66.76502, 121.0101 -18713, 68.47077, 136.9773 -18714, 71.66733, 157.2045 -18715, 70.31301, 134.2708 -18716, 67.27406, 125.2117 -18717, 69.53611, 153.2106 -18718, 72.7748, 152.2564 -18719, 69.75516, 131.9829 -18720, 69.31731, 113.889 -18721, 67.59655, 113.7564 -18722, 68.80522, 126.4774 -18723, 66.10887, 105.4664 -18724, 66.65045, 116.9397 -18725, 69.55086, 155.5237 -18726, 70.22757, 145.7376 -18727, 68.77158, 129.6204 -18728, 69.14943, 141.3192 -18729, 65.67652, 115.6393 -18730, 68.16672, 107.975 -18731, 67.61212, 123.8621 -18732, 70.24321, 125.2896 -18733, 69.19034, 141.7787 -18734, 68.81631, 131.713 -18735, 66.33019, 114.6571 -18736, 67.42121, 139.7828 -18737, 67.57223, 122.4153 -18738, 64.35103, 132.7265 -18739, 68.57516, 134.564 -18740, 67.05546, 117.4663 -18741, 68.09799, 124.307 -18742, 71.57853, 117.4121 -18743, 70.06625, 149.8354 -18744, 65.68016, 124.5133 -18745, 66.07335, 112.1744 -18746, 67.57426, 104.5494 -18747, 67.15108, 122.4038 -18748, 69.04551, 132.6149 -18749, 69.20252, 145.5692 -18750, 69.71079, 128.8631 -18751, 65.29563, 113.4145 -18752, 63.64036, 120.7483 -18753, 67.44444, 121.6074 -18754, 67.26357, 155.4769 -18755, 69.67211, 150.7134 -18756, 69.49824, 128.3236 -18757, 69.39577, 132.9491 -18758, 69.61772, 128.1457 -18759, 66.95073, 125.8741 -18760, 65.10061, 101.0707 -18761, 70.60484, 133.2398 -18762, 69.8036, 132.7216 -18763, 64.08148, 119.2167 -18764, 71.7491, 132.2534 -18765, 69.86149, 138.9225 -18766, 70.57948, 121.235 -18767, 69.3868, 107.0816 -18768, 73.40755, 129.8191 -18769, 67.11939, 121.4565 -18770, 66.20766, 120.7871 -18771, 68.55431, 121.6152 -18772, 66.19609, 112.1678 -18773, 69.9654, 142.061 -18774, 69.29187, 129.3865 -18775, 67.8538, 114.4474 -18776, 67.96589, 141.6129 -18777, 68.55128, 123.8771 -18778, 68.75419, 123.9171 -18779, 66.55678, 134.4236 -18780, 70.59726, 130.2703 -18781, 67.02605, 119.901 -18782, 67.41396, 116.1679 -18783, 69.19909, 117.1203 -18784, 70.80766, 144.2022 -18785, 67.60947, 110.2511 -18786, 69.04609, 124.0725 -18787, 66.42537, 134.0266 -18788, 67.11748, 107.6576 -18789, 66.28992, 104.2723 -18790, 70.27361, 139.0315 -18791, 67.69712, 129.6555 -18792, 66.85592, 143.7988 -18793, 67.61554, 140.8081 -18794, 70.14128, 137.2464 -18795, 71.05634, 116.9411 -18796, 63.38973, 128.9919 -18797, 71.79649, 132.8951 -18798, 64.87538, 108.4584 -18799, 66.64629, 124.3705 -18800, 66.66731, 122.7419 -18801, 67.36005, 132.1815 -18802, 67.78648, 141.9301 -18803, 67.65562, 122.0912 -18804, 67.99457, 120.7194 -18805, 67.20666, 131.022 -18806, 67.66445, 111.1134 -18807, 70.7897, 124.2387 -18808, 65.60275, 113.6259 -18809, 68.78444, 141.7825 -18810, 69.97289, 154.4117 -18811, 72.88631, 139.0747 -18812, 68.47303, 134.9762 -18813, 66.79608, 136.3316 -18814, 67.30746, 136.4466 -18815, 69.2924, 137.9162 -18816, 68.29249, 140.8264 -18817, 69.01065, 125.7044 -18818, 67.85167, 123.1633 -18819, 66.52291, 119.8779 -18820, 70.28503, 135.5849 -18821, 67.77965, 138.1189 -18822, 67.25897, 117.2646 -18823, 67.54277, 121.0405 -18824, 70.06108, 149.2393 -18825, 69.45781, 134.1714 -18826, 67.635, 116.5934 -18827, 68.97276, 118.5913 -18828, 66.28357, 129.9358 -18829, 69.75152, 104.6822 -18830, 69.41999, 127.9808 -18831, 71.06858, 152.1248 -18832, 68.33582, 139.4499 -18833, 67.11634, 132.4605 -18834, 67.48548, 107.1629 -18835, 65.88513, 120.3014 -18836, 65.8286, 102.3607 -18837, 69.15262, 129.2947 -18838, 67.73971, 132.0791 -18839, 68.31863, 133.1632 -18840, 65.14074, 117.8809 -18841, 66.25327, 120.4461 -18842, 67.28113, 113.3187 -18843, 71.26882, 129.5776 -18844, 67.2513, 122.3783 -18845, 66.43889, 121.4343 -18846, 66.84667, 107.9407 -18847, 69.75759, 140.9194 -18848, 69.0673, 133.6173 -18849, 69.65999, 130.2559 -18850, 68.93677, 125.3045 -18851, 67.15994, 108.8491 -18852, 69.39921, 130.7668 -18853, 68.34672, 135.8604 -18854, 70.51145, 135.0087 -18855, 69.48508, 123.7083 -18856, 66.907, 100.1432 -18857, 68.13199, 121.5932 -18858, 71.29192, 138.1298 -18859, 70.21849, 118.867 -18860, 68.53744, 148.6424 -18861, 68.98262, 118.1685 -18862, 67.2414, 133.1376 -18863, 68.87922, 123.4291 -18864, 70.11356, 135.6634 -18865, 69.76284, 132.2633 -18866, 69.32483, 117.5478 -18867, 68.85358, 112.7226 -18868, 67.51316, 123.8273 -18869, 67.67759, 132.8392 -18870, 68.30186, 140.4737 -18871, 67.81994, 126.1359 -18872, 65.17462, 110.8658 -18873, 67.21931, 131.6292 -18874, 65.70946, 127.0618 -18875, 66.62218, 135.2702 -18876, 70.03963, 148.768 -18877, 69.57779, 139.1555 -18878, 69.06121, 138.5468 -18879, 67.49563, 106.2282 -18880, 64.4891, 95.6685 -18881, 67.33308, 128.5636 -18882, 65.73318, 141.9346 -18883, 66.24559, 139.3832 -18884, 69.54639, 136.7369 -18885, 70.91309, 139.336 -18886, 67.45435, 123.3438 -18887, 66.8128, 131.442 -18888, 66.07655, 128.2468 -18889, 65.48464, 122.1126 -18890, 67.9735, 115.8705 -18891, 68.17934, 128.1162 -18892, 68.75379, 128.5221 -18893, 70.42998, 138.6082 -18894, 67.84405, 122.6771 -18895, 69.84154, 128.9522 -18896, 68.19966, 125.8263 -18897, 68.52427, 126.4684 -18898, 64.93004, 123.5438 -18899, 66.92609, 133.6922 -18900, 69.75065, 126.1361 -18901, 69.8655, 124.4893 -18902, 66.24436, 131.6072 -18903, 66.32189, 135.3703 -18904, 72.84287, 142.1741 -18905, 67.39726, 131.4489 -18906, 65.01832, 115.0837 -18907, 70.59535, 143.0093 -18908, 70.17018, 146.3284 -18909, 67.4578, 136.3524 -18910, 67.26702, 123.5548 -18911, 69.817, 132.1167 -18912, 66.24797, 130.474 -18913, 69.63203, 150.5264 -18914, 67.56315, 138.5557 -18915, 69.21375, 131.5255 -18916, 70.23974, 133.6155 -18917, 68.74692, 140.926 -18918, 70.20609, 126.7617 -18919, 68.20052, 131.4243 -18920, 69.01907, 143.3999 -18921, 67.66947, 128.9828 -18922, 64.07139, 138.8326 -18923, 66.59571, 125.3051 -18924, 64.2154, 109.5273 -18925, 67.32259, 111.9082 -18926, 68.2653, 124.3467 -18927, 69.10479, 142.1923 -18928, 67.26557, 109.9298 -18929, 67.56282, 117.22 -18930, 67.70635, 119.8849 -18931, 68.91809, 119.6725 -18932, 66.75571, 111.1221 -18933, 63.60255, 113.6185 -18934, 67.9549, 132.0406 -18935, 70.12267, 136.86 -18936, 68.52279, 122.0874 -18937, 68.27301, 126.9347 -18938, 68.0335, 132.211 -18939, 63.71782, 112.9014 -18940, 63.27713, 123.3834 -18941, 67.44392, 144.5663 -18942, 70.93268, 124.134 -18943, 64.95846, 124.1922 -18944, 67.82998, 134.4499 -18945, 65.67986, 117.3818 -18946, 67.85729, 106.2393 -18947, 68.64131, 126.2599 -18948, 67.15147, 144.6755 -18949, 68.15486, 128.6466 -18950, 66.76022, 120.5667 -18951, 66.15116, 124.4818 -18952, 70.03411, 135.579 -18953, 63.62972, 123.3694 -18954, 67.99637, 127.8984 -18955, 63.86584, 101.1195 -18956, 69.94454, 133.8068 -18957, 68.33791, 134.2027 -18958, 67.69831, 127.598 -18959, 67.13141, 115.7628 -18960, 68.76137, 114.535 -18961, 65.59809, 123.1285 -18962, 66.31687, 100.5823 -18963, 69.44079, 141.2083 -18964, 69.37313, 132.8006 -18965, 68.42964, 128.6768 -18966, 64.69932, 125.6053 -18967, 69.72645, 98.13857 -18968, 68.41304, 133.712 -18969, 65.35887, 116.9776 -18970, 67.12896, 130.9687 -18971, 66.92088, 127.3274 -18972, 69.29888, 138.2458 -18973, 69.09147, 131.6457 -18974, 67.94608, 128.8156 -18975, 69.76571, 147.9617 -18976, 68.06441, 124.6722 -18977, 67.49538, 148.7456 -18978, 67.11697, 113.3744 -18979, 65.08173, 111.555 -18980, 67.85374, 131.636 -18981, 66.25532, 112.1725 -18982, 70.04843, 139.3738 -18983, 71.20862, 134.4401 -18984, 69.74874, 137.7951 -18985, 71.44554, 136.6001 -18986, 69.94668, 141.4994 -18987, 66.87131, 119.1642 -18988, 69.21473, 128.4229 -18989, 66.74018, 127.9894 -18990, 69.6161, 138.6399 -18991, 70.88611, 107.6722 -18992, 65.62141, 132.3347 -18993, 65.47498, 108.9138 -18994, 66.58238, 121.9442 -18995, 67.40184, 120.102 -18996, 66.54299, 100.2631 -18997, 68.20307, 132.0264 -18998, 68.3355, 129.1787 -18999, 66.84503, 110.5189 -19000, 67.14814, 105.918 -19001, 68.95693, 130.3178 -19002, 67.45968, 135.2663 -19003, 69.73828, 139.1718 -19004, 69.82326, 128.9242 -19005, 69.66234, 118.628 -19006, 74.01942, 124.2312 -19007, 64.87799, 127.1184 -19008, 68.45052, 125.3085 -19009, 69.20931, 138.436 -19010, 68.7274, 128.841 -19011, 67.51895, 110.6973 -19012, 69.2305, 146.7603 -19013, 69.58018, 122.7056 -19014, 67.13026, 123.9607 -19015, 68.74446, 138.4759 -19016, 65.03535, 103.0616 -19017, 67.11675, 135.7574 -19018, 67.28088, 105.8265 -19019, 65.52005, 114.0189 -19020, 68.46225, 126.0038 -19021, 68.29754, 125.6328 -19022, 67.42591, 118.7455 -19023, 67.66937, 142.4494 -19024, 71.81863, 146.9166 -19025, 68.71802, 128.9584 -19026, 66.58401, 122.4293 -19027, 69.3764, 120.9916 -19028, 68.44002, 135.6954 -19029, 64.71921, 122.5415 -19030, 68.52755, 125.3404 -19031, 69.35345, 134.088 -19032, 69.20229, 117.4489 -19033, 67.00578, 120.8698 -19034, 66.89812, 112.9835 -19035, 68.35288, 135.8208 -19036, 67.33573, 118.4924 -19037, 69.82623, 138.6881 -19038, 67.099, 128.0533 -19039, 68.54065, 129.6286 -19040, 71.22829, 128.8353 -19041, 68.5347, 130.156 -19042, 69.8437, 134.747 -19043, 69.37798, 153.3498 -19044, 70.73471, 138.6245 -19045, 68.82335, 133.9317 -19046, 70.17434, 126.2272 -19047, 67.29725, 143.426 -19048, 70.27076, 133.5081 -19049, 67.913, 133.8764 -19050, 69.54137, 134.96 -19051, 68.06886, 124.1629 -19052, 70.52222, 123.9367 -19053, 70.17403, 135.6413 -19054, 68.48377, 132.7352 -19055, 66.5262, 100.3805 -19056, 70.2248, 141.5952 -19057, 64.80255, 110.9322 -19058, 65.99408, 114.0842 -19059, 70.21852, 135.3689 -19060, 64.63526, 127.2722 -19061, 69.50261, 143.5405 -19062, 67.94257, 137.276 -19063, 68.60763, 128.7483 -19064, 69.74468, 130.9538 -19065, 70.29051, 135.602 -19066, 70.17636, 150.8629 -19067, 68.32799, 127.8796 -19068, 67.90664, 123.3323 -19069, 66.83077, 123.6567 -19070, 70.27036, 133.2441 -19071, 67.19055, 127.5741 -19072, 67.9287, 111.3912 -19073, 69.57531, 130.2659 -19074, 64.91246, 141.2716 -19075, 67.24179, 107.9326 -19076, 66.73326, 128.6043 -19077, 66.10658, 124.0844 -19078, 66.89731, 124.2085 -19079, 69.97557, 116.4106 -19080, 70.44049, 139.3889 -19081, 70.11371, 150.7673 -19082, 65.99872, 134.8482 -19083, 69.95658, 144.1677 -19084, 69.63275, 130.0907 -19085, 65.33549, 121.2849 -19086, 64.6652, 121.7053 -19087, 67.6065, 133.8331 -19088, 65.23757, 127.3737 -19089, 68.93639, 127.6957 -19090, 66.24616, 130.9438 -19091, 67.52515, 118.5495 -19092, 68.98651, 114.9093 -19093, 68.84443, 115.5114 -19094, 66.88991, 109.6227 -19095, 67.11375, 128.4311 -19096, 71.00279, 133.4631 -19097, 69.99538, 132.4863 -19098, 67.6521, 132.338 -19099, 66.61694, 121.7505 -19100, 66.12389, 115.82 -19101, 68.05366, 142.0749 -19102, 67.73026, 142.6115 -19103, 66.93791, 120.2927 -19104, 70.17167, 130.967 -19105, 66.34749, 138.2904 -19106, 67.05596, 121.2986 -19107, 71.31904, 138.9588 -19108, 67.6327, 121.2978 -19109, 72.3593, 119.509 -19110, 67.54356, 142.1348 -19111, 70.48939, 129.9018 -19112, 68.43258, 128.8285 -19113, 64.68129, 108.7665 -19114, 68.47919, 134.2212 -19115, 66.57968, 124.5066 -19116, 67.2967, 129.1762 -19117, 67.20175, 121.1701 -19118, 67.02215, 131.1607 -19119, 66.46511, 119.6751 -19120, 71.67442, 139.3237 -19121, 68.5519, 143.9093 -19122, 68.65639, 120.3063 -19123, 66.83653, 103.4506 -19124, 70.04256, 132.8487 -19125, 65.59915, 134.7797 -19126, 67.10442, 135.3821 -19127, 67.77316, 111.1036 -19128, 68.32667, 115.483 -19129, 68.48645, 123.7207 -19130, 67.03686, 116.3024 -19131, 66.9232, 147.3265 -19132, 67.87561, 116.4401 -19133, 67.28113, 130.6107 -19134, 66.50314, 130.9561 -19135, 68.32476, 133.2194 -19136, 70.36394, 144.2233 -19137, 65.14779, 131.3557 -19138, 68.01902, 133.8224 -19139, 68.59083, 122.4374 -19140, 69.04421, 130.8801 -19141, 66.88065, 124.1543 -19142, 67.38799, 139.7979 -19143, 68.35328, 123.317 -19144, 68.15364, 119.5603 -19145, 69.75849, 142.1927 -19146, 65.42662, 119.948 -19147, 67.87629, 125.7474 -19148, 69.75726, 129.0609 -19149, 65.78923, 116.9633 -19150, 67.91269, 120.1518 -19151, 71.07096, 143.0026 -19152, 66.99756, 122.3414 -19153, 67.22561, 120.1531 -19154, 70.72869, 157.3854 -19155, 64.74015, 108.5634 -19156, 69.5375, 135.2244 -19157, 69.09657, 120.9011 -19158, 67.70209, 132.6755 -19159, 68.81677, 124.6396 -19160, 68.74628, 125.283 -19161, 66.57536, 121.695 -19162, 67.1991, 127.4141 -19163, 67.24854, 123.2395 -19164, 67.80506, 124.4279 -19165, 71.97488, 138.2571 -19166, 69.89842, 143.7624 -19167, 64.42791, 112.2905 -19168, 67.95844, 137.1145 -19169, 65.51837, 133.997 -19170, 65.50773, 98.01516 -19171, 64.52474, 113.2789 -19172, 69.0834, 130.9646 -19173, 72.04364, 141.8397 -19174, 65.09556, 108.8232 -19175, 66.52195, 126.2461 -19176, 65.7149, 125.2941 -19177, 67.7545, 133.7375 -19178, 65.18518, 110.504 -19179, 67.74465, 132.5059 -19180, 69.32145, 124.9234 -19181, 70.2348, 134.8146 -19182, 67.37761, 118.2797 -19183, 69.67373, 119.3944 -19184, 65.88791, 107.4635 -19185, 67.85004, 133.4487 -19186, 66.95893, 120.3034 -19187, 68.83336, 124.4998 -19188, 68.49758, 132.5462 -19189, 68.7395, 122.3993 -19190, 65.22748, 127.1413 -19191, 71.98146, 144.7643 -19192, 68.68094, 134.0401 -19193, 67.12628, 118.6035 -19194, 67.01346, 105.0695 -19195, 66.4542, 133.0311 -19196, 67.28432, 134.1482 -19197, 70.71591, 120.961 -19198, 67.63227, 114.1463 -19199, 61.827, 100.9391 -19200, 66.81603, 123.1338 -19201, 66.55006, 115.1238 -19202, 69.87374, 132.9684 -19203, 68.88997, 133.4733 -19204, 63.86542, 88.16618 -19205, 67.473, 134.805 -19206, 69.36134, 136.2666 -19207, 67.66722, 124.3972 -19208, 64.09691, 112.0101 -19209, 70.1153, 140.897 -19210, 68.21237, 120.1281 -19211, 68.31802, 140.4507 -19212, 66.31876, 138.4193 -19213, 65.14711, 117.866 -19214, 68.93837, 152.8404 -19215, 68.30602, 128.9768 -19216, 67.90522, 127.8382 -19217, 68.72415, 131.8936 -19218, 66.15404, 122.0434 -19219, 69.20458, 145.5385 -19220, 68.96299, 119.937 -19221, 67.96634, 121.1045 -19222, 68.39281, 123.3811 -19223, 67.87168, 112.354 -19224, 66.60248, 105.694 -19225, 66.40671, 136.6209 -19226, 71.24337, 119.4742 -19227, 69.85952, 130.22 -19228, 66.3421, 120.0586 -19229, 68.03653, 117.8885 -19230, 68.44799, 125.149 -19231, 66.18949, 100.7205 -19232, 65.35281, 125.1497 -19233, 68.07168, 112.3675 -19234, 69.37941, 117.3375 -19235, 65.60905, 127.3115 -19236, 65.33719, 113.8739 -19237, 67.08696, 113.6991 -19238, 68.91007, 124.7451 -19239, 67.21084, 130.7168 -19240, 70.46212, 127.2606 -19241, 68.49577, 122.6996 -19242, 69.3828, 124.0819 -19243, 66.9424, 99.05577 -19244, 65.05132, 108.3157 -19245, 64.57878, 107.7267 -19246, 70.02453, 106.5897 -19247, 68.64292, 135.4839 -19248, 69.3952, 123.3528 -19249, 64.498, 103.1257 -19250, 68.75748, 129.8778 -19251, 70.5535, 126.2709 -19252, 67.55247, 107.1793 -19253, 72.1117, 137.8252 -19254, 68.24515, 126.9731 -19255, 68.39009, 150.2682 -19256, 66.47685, 125.4514 -19257, 71.38525, 134.2473 -19258, 66.35336, 129.886 -19259, 66.6283, 131.9099 -19260, 68.15306, 131.1771 -19261, 69.33029, 133.502 -19262, 68.60209, 126.7976 -19263, 69.86885, 139.479 -19264, 67.12737, 119.6263 -19265, 69.69019, 122.2988 -19266, 67.82449, 130.1764 -19267, 66.96219, 122.223 -19268, 69.13713, 137.5221 -19269, 66.27125, 125.5452 -19270, 71.64224, 131.3708 -19271, 66.31753, 135.1288 -19272, 71.56528, 154.7509 -19273, 68.35767, 129.9305 -19274, 64.12801, 110.2428 -19275, 70.91483, 147.3623 -19276, 70.31161, 134.3731 -19277, 67.4626, 130.7984 -19278, 70.69375, 153.4537 -19279, 69.64298, 121.5795 -19280, 66.12271, 121.6818 -19281, 68.91139, 134.8144 -19282, 65.59233, 139.8298 -19283, 68.39697, 131.1997 -19284, 71.08749, 127.9353 -19285, 66.69531, 136.8321 -19286, 65.6135, 118.7268 -19287, 67.24761, 114.7405 -19288, 63.98366, 122.5457 -19289, 67.44473, 143.2907 -19290, 69.45442, 142.9678 -19291, 66.65284, 140.9184 -19292, 66.90633, 112.5183 -19293, 67.36174, 132.7616 -19294, 68.85531, 113.9658 -19295, 67.14749, 110.8704 -19296, 68.43251, 127.4271 -19297, 66.76784, 114.9009 -19298, 65.88806, 106.0497 -19299, 70.28666, 139.7015 -19300, 65.73875, 132.1646 -19301, 66.85533, 130.9737 -19302, 67.81668, 119.0647 -19303, 66.13711, 118.1549 -19304, 67.44496, 134.7946 -19305, 70.31339, 135.4947 -19306, 69.67229, 138.3051 -19307, 68.20788, 130.6784 -19308, 69.07866, 135.7628 -19309, 69.2147, 145.863 -19310, 69.03707, 134.3548 -19311, 67.4867, 130.712 -19312, 68.65038, 130.0623 -19313, 68.47651, 117.658 -19314, 66.81897, 125.9835 -19315, 68.62807, 128.3296 -19316, 66.49421, 100.1453 -19317, 69.32902, 117.3836 -19318, 66.80477, 109.5414 -19319, 67.45323, 117.2084 -19320, 66.82436, 118.9075 -19321, 68.44044, 132.5773 -19322, 68.17205, 135.7029 -19323, 65.54081, 120.4393 -19324, 69.87822, 134.6517 -19325, 70.74234, 154.9873 -19326, 69.72666, 142.6482 -19327, 69.32118, 130.9678 -19328, 67.35447, 106.6254 -19329, 71.54135, 121.2208 -19330, 65.76665, 122.1748 -19331, 70.40562, 142.0761 -19332, 66.07982, 104.0078 -19333, 66.23757, 122.995 -19334, 71.08337, 141.4795 -19335, 70.71918, 137.857 -19336, 66.42899, 126.2921 -19337, 69.82743, 119.7982 -19338, 67.2883, 132.4893 -19339, 67.54366, 134.223 -19340, 68.67346, 124.9942 -19341, 69.49291, 136.7762 -19342, 65.18689, 131.8571 -19343, 68.63243, 140.3363 -19344, 65.87434, 123.9921 -19345, 69.72791, 134.6838 -19346, 68.86516, 146.82 -19347, 70.78499, 125.1415 -19348, 71.49315, 139.9804 -19349, 68.72414, 133.7544 -19350, 68.80062, 115.5805 -19351, 70.09019, 125.3692 -19352, 70.95429, 142.1598 -19353, 68.65434, 127.7207 -19354, 65.07993, 103.2811 -19355, 67.8804, 122.2327 -19356, 68.69267, 128.8388 -19357, 66.39305, 109.666 -19358, 68.97105, 121.7352 -19359, 67.51326, 122.2808 -19360, 67.77261, 124.7638 -19361, 70.49746, 131.8233 -19362, 67.34338, 131.4508 -19363, 67.12994, 128.448 -19364, 67.28063, 101.792 -19365, 67.83278, 121.5138 -19366, 66.94744, 111.0788 -19367, 68.83627, 125.1171 -19368, 67.17864, 126.6733 -19369, 67.94058, 129.4379 -19370, 70.92914, 135.2796 -19371, 67.86923, 111.0826 -19372, 68.22707, 137.6088 -19373, 66.86146, 119.7778 -19374, 67.65723, 119.8673 -19375, 68.07379, 98.47485 -19376, 73.59392, 145.5716 -19377, 65.40895, 128.1772 -19378, 67.07607, 142.2548 -19379, 66.89452, 117.4998 -19380, 66.42382, 139.1155 -19381, 71.97374, 130.8526 -19382, 67.96789, 119.0567 -19383, 67.25519, 116.9952 -19384, 65.5737, 103.2335 -19385, 69.84429, 127.3391 -19386, 69.55115, 125.4512 -19387, 66.43305, 126.9671 -19388, 68.85178, 117.5224 -19389, 66.7244, 124.9279 -19390, 68.64607, 126.7906 -19391, 63.70431, 112.5109 -19392, 68.19205, 114.4343 -19393, 67.64495, 120.6396 -19394, 67.69633, 129.9412 -19395, 65.56974, 97.43419 -19396, 70.21936, 137.3578 -19397, 67.42904, 125.3863 -19398, 69.43355, 148.2019 -19399, 67.29278, 129.8179 -19400, 69.10066, 151.9111 -19401, 66.92661, 127.0226 -19402, 66.82918, 117.5375 -19403, 70.36044, 119.1202 -19404, 64.68454, 107.658 -19405, 68.78039, 117.1408 -19406, 66.3356, 132.6665 -19407, 71.05723, 148.1894 -19408, 65.98309, 107.8979 -19409, 66.96438, 142.4074 -19410, 62.66094, 102.5225 -19411, 66.7604, 135.5098 -19412, 69.31698, 133.9394 -19413, 66.1443, 137.1406 -19414, 65.13872, 141.9462 -19415, 68.44832, 152.6479 -19416, 69.10624, 132.7292 -19417, 68.52832, 132.1379 -19418, 68.08132, 123.9994 -19419, 68.86629, 136.1652 -19420, 66.3787, 127.2431 -19421, 67.76213, 150.8899 -19422, 65.99674, 147.9077 -19423, 65.81136, 126.1608 -19424, 67.40505, 131.4322 -19425, 66.83229, 123.1594 -19426, 68.63507, 124.9311 -19427, 62.97683, 96.29756 -19428, 71.24168, 132.8696 -19429, 67.47631, 130.3214 -19430, 68.62495, 130.4401 -19431, 68.42664, 122.2238 -19432, 65.46691, 120.4029 -19433, 68.25073, 125.9581 -19434, 67.4445, 119.4108 -19435, 67.1342, 126.346 -19436, 68.13306, 134.1461 -19437, 65.54906, 141.2074 -19438, 71.2458, 147.3819 -19439, 69.55894, 150.7427 -19440, 67.5101, 121.0396 -19441, 67.63941, 122.4085 -19442, 64.82273, 112.1695 -19443, 69.22052, 132.0336 -19444, 69.92432, 144.2027 -19445, 66.98924, 150.2762 -19446, 68.56214, 132.0495 -19447, 66.77559, 127.3659 -19448, 68.73691, 129.7617 -19449, 66.91012, 122.4668 -19450, 67.17807, 126.9057 -19451, 69.93152, 142.0998 -19452, 69.08901, 139.7904 -19453, 70.19955, 130.4641 -19454, 68.66485, 120.245 -19455, 67.02561, 131.4908 -19456, 64.99279, 125.5052 -19457, 69.62365, 146.1419 -19458, 68.24774, 136.1765 -19459, 66.21311, 113.8111 -19460, 65.83904, 132.5109 -19461, 63.6379, 123.548 -19462, 70.60624, 131.5629 -19463, 68.13407, 146.0477 -19464, 69.39546, 136.2664 -19465, 68.94134, 118.7888 -19466, 67.38692, 130.1127 -19467, 64.89061, 111.4397 -19468, 69.9709, 145.0628 -19469, 68.5498, 143.3518 -19470, 69.27563, 137.7491 -19471, 70.71056, 161.4436 -19472, 66.4149, 112.9923 -19473, 62.50167, 91.57279 -19474, 68.42081, 128.0469 -19475, 71.7836, 127.215 -19476, 66.29355, 121.9691 -19477, 66.41854, 126.7928 -19478, 67.77764, 145.8554 -19479, 67.57821, 100.8997 -19480, 67.89491, 114.1335 -19481, 68.64534, 116.5296 -19482, 69.35841, 134.6133 -19483, 68.6794, 140.9111 -19484, 69.63578, 107.6423 -19485, 69.1889, 141.0582 -19486, 68.96742, 145.8354 -19487, 68.61172, 139.6006 -19488, 67.52548, 120.6988 -19489, 66.15107, 105.9052 -19490, 68.68094, 135.0912 -19491, 66.80899, 103.3739 -19492, 68.9321, 127.5417 -19493, 67.76799, 139.2827 -19494, 66.53111, 125.715 -19495, 68.00506, 134.7767 -19496, 67.04487, 116.2412 -19497, 70.32864, 115.7384 -19498, 70.16821, 137.7695 -19499, 68.70678, 132.4533 -19500, 65.97472, 118.204 -19501, 69.80446, 106.9538 -19502, 66.69743, 126.3104 -19503, 67.64179, 116.9737 -19504, 66.80381, 131.6848 -19505, 72.77441, 143.1369 -19506, 69.28426, 140.4357 -19507, 66.80098, 114.5898 -19508, 69.41988, 144.3342 -19509, 66.9729, 131.5274 -19510, 68.03946, 143.2374 -19511, 69.00818, 123.1109 -19512, 69.2158, 148.4322 -19513, 69.63119, 130.0823 -19514, 70.09088, 145.9827 -19515, 66.70823, 124.4015 -19516, 66.09049, 121.7826 -19517, 67.75741, 126.407 -19518, 65.67362, 133.5732 -19519, 67.23266, 132.217 -19520, 69.99684, 144.2222 -19521, 67.57739, 132.6973 -19522, 65.54885, 120.8402 -19523, 69.4322, 121.8002 -19524, 66.99743, 133.9659 -19525, 67.06971, 130.6626 -19526, 64.51039, 109.5663 -19527, 71.90727, 129.9342 -19528, 66.98211, 119.479 -19529, 68.8868, 136.5011 -19530, 67.69444, 130.4561 -19531, 70.7424, 140.6748 -19532, 69.54554, 145.2172 -19533, 69.14821, 135.2195 -19534, 66.50703, 108.6434 -19535, 70.29309, 127.0521 -19536, 67.9355, 133.4828 -19537, 68.21364, 133.9939 -19538, 68.5144, 128.0894 -19539, 65.42839, 111.4876 -19540, 67.86424, 128.8723 -19541, 63.71868, 96.00666 -19542, 70.61081, 123.8097 -19543, 68.90318, 123.7874 -19544, 70.13475, 128.6143 -19545, 71.46053, 152.5282 -19546, 70.03539, 120.0435 -19547, 68.1379, 137.3988 -19548, 63.85703, 125.0479 -19549, 67.30965, 124.9212 -19550, 68.90615, 139.2283 -19551, 71.64804, 125.3181 -19552, 68.88111, 134.4917 -19553, 69.51423, 134.5854 -19554, 68.18086, 121.5733 -19555, 65.69997, 110.1231 -19556, 68.40463, 126.7027 -19557, 71.07505, 140.2282 -19558, 69.27603, 126.8514 -19559, 68.23265, 121.7072 -19560, 68.58259, 117.5669 -19561, 67.36844, 127.4011 -19562, 68.28441, 122.825 -19563, 69.07799, 130.0466 -19564, 67.21276, 126.4072 -19565, 64.98716, 104.79 -19566, 66.9179, 127.2505 -19567, 67.12818, 130.2357 -19568, 66.10688, 107.0003 -19569, 68.57638, 125.1795 -19570, 63.93057, 112.976 -19571, 69.76564, 139.6668 -19572, 68.41106, 151.9062 -19573, 66.36876, 122.2946 -19574, 70.47793, 129.8903 -19575, 65.4282, 121.4682 -19576, 66.03012, 135.4752 -19577, 68.0989, 130.5315 -19578, 68.65857, 146.6697 -19579, 72.01458, 129.7612 -19580, 68.50725, 123.4456 -19581, 69.22753, 125.3293 -19582, 70.19938, 140.7101 -19583, 67.04063, 124.0582 -19584, 66.98144, 121.0401 -19585, 68.71907, 120.0657 -19586, 69.72849, 144.2993 -19587, 69.09655, 123.9771 -19588, 69.7738, 114.8563 -19589, 67.75308, 130.351 -19590, 67.08285, 122.5291 -19591, 71.31542, 136.2466 -19592, 70.79423, 139.6064 -19593, 68.65088, 120.791 -19594, 70.36812, 127.8744 -19595, 68.9855, 117.1791 -19596, 67.35987, 120.6422 -19597, 70.4786, 146.8413 -19598, 69.13282, 134.3117 -19599, 69.53122, 125.177 -19600, 67.98617, 118.3697 -19601, 67.61576, 135.516 -19602, 69.78926, 147.2761 -19603, 66.81312, 130.7799 -19604, 68.68595, 134.9254 -19605, 68.05575, 116.4879 -19606, 67.0537, 115.5655 -19607, 63.55754, 127.6591 -19608, 68.02524, 131.1121 -19609, 71.55392, 137.254 -19610, 67.92525, 109.364 -19611, 68.30782, 137.5401 -19612, 69.51542, 152.0741 -19613, 67.29902, 120.4122 -19614, 68.95044, 125.9445 -19615, 66.93895, 113.2025 -19616, 68.33849, 111.7251 -19617, 66.99193, 117.526 -19618, 64.8404, 122.1497 -19619, 67.83682, 109.6392 -19620, 69.02802, 119.1542 -19621, 69.41642, 112.3215 -19622, 72.88867, 144.9415 -19623, 66.61994, 120.0592 -19624, 68.41957, 132.3673 -19625, 67.05694, 129.4949 -19626, 64.48443, 128.3386 -19627, 70.56403, 128.5002 -19628, 67.67847, 127.6393 -19629, 68.38258, 132.7334 -19630, 68.18807, 128.7375 -19631, 67.85684, 142.625 -19632, 71.13318, 131.6605 -19633, 65.43111, 121.7387 -19634, 69.13164, 113.8551 -19635, 68.69, 137.9111 -19636, 70.5797, 131.3443 -19637, 68.82262, 116.2803 -19638, 68.39201, 111.0592 -19639, 68.73134, 136.7499 -19640, 63.96774, 105.3882 -19641, 67.70227, 137.468 -19642, 65.38377, 110.8341 -19643, 66.86451, 132.972 -19644, 67.14211, 119.5467 -19645, 64.23474, 137.3847 -19646, 66.66678, 106.7181 -19647, 68.51504, 119.8735 -19648, 65.93028, 115.4797 -19649, 67.37382, 118.0422 -19650, 70.25357, 125.9146 -19651, 70.0309, 136.5168 -19652, 66.34973, 123.1756 -19653, 69.95254, 126.0075 -19654, 67.47996, 129.589 -19655, 68.7086, 121.1474 -19656, 67.00906, 134.2455 -19657, 67.72585, 106.4953 -19658, 71.29286, 141.0486 -19659, 68.51699, 122.1062 -19660, 66.62695, 126.9819 -19661, 67.94829, 126.8774 -19662, 66.89987, 102.8782 -19663, 67.42931, 133.088 -19664, 68.2914, 129.8764 -19665, 65.99699, 100.402 -19666, 70.19978, 129.7827 -19667, 67.57201, 131.9072 -19668, 63.39936, 106.8881 -19669, 69.54182, 136.1776 -19670, 66.19251, 128.8525 -19671, 65.75415, 111.5965 -19672, 67.57701, 130.5393 -19673, 65.91428, 121.6722 -19674, 67.43806, 132.718 -19675, 65.96746, 127.1559 -19676, 67.37888, 114.5618 -19677, 67.09216, 107.9098 -19678, 68.09938, 128.7844 -19679, 68.59888, 116.9653 -19680, 64.6891, 100.6123 -19681, 67.80635, 119.7824 -19682, 68.11201, 145.058 -19683, 69.98685, 114.9373 -19684, 66.68902, 114.2804 -19685, 69.52482, 135.5855 -19686, 65.66648, 129.1953 -19687, 69.21321, 122.4687 -19688, 70.13351, 140.4419 -19689, 62.90053, 128.8516 -19690, 69.52934, 106.595 -19691, 69.16515, 156.2241 -19692, 64.9069, 109.8341 -19693, 65.51072, 115.8503 -19694, 67.2087, 132.4732 -19695, 68.02634, 130.6405 -19696, 68.8114, 134.7657 -19697, 71.76238, 141.3491 -19698, 69.32284, 126.9131 -19699, 68.35675, 129.7181 -19700, 67.63756, 142.1868 -19701, 66.06231, 129.2107 -19702, 70.56364, 133.1328 -19703, 67.95176, 129.1952 -19704, 68.27422, 122.074 -19705, 68.18009, 132.0099 -19706, 71.27518, 138.9276 -19707, 65.61842, 106.7735 -19708, 69.22954, 123.4618 -19709, 66.69893, 121.0699 -19710, 66.66889, 111.8507 -19711, 70.84943, 138.1842 -19712, 70.96035, 142.1775 -19713, 68.33222, 115.3974 -19714, 70.48522, 145.0675 -19715, 66.60999, 111.5677 -19716, 69.34036, 139.2212 -19717, 69.4538, 118.4412 -19718, 68.68119, 115.3372 -19719, 66.77448, 116.9586 -19720, 67.07195, 117.4971 -19721, 68.99913, 125.8425 -19722, 66.34261, 137.5813 -19723, 70.08887, 133.1303 -19724, 69.33453, 122.7998 -19725, 65.27707, 113.6954 -19726, 70.02681, 143.2139 -19727, 68.94689, 132.8988 -19728, 66.65913, 122.1781 -19729, 66.79488, 109.0563 -19730, 67.90679, 111.664 -19731, 67.10869, 122.2714 -19732, 70.27947, 136.6405 -19733, 64.55087, 124.048 -19734, 71.15681, 141.6004 -19735, 68.5655, 123.6268 -19736, 65.48782, 127.7492 -19737, 67.74423, 125.1475 -19738, 66.83599, 136.7083 -19739, 67.95903, 115.2646 -19740, 66.72479, 110.7445 -19741, 70.98626, 143.4517 -19742, 66.92733, 126.7084 -19743, 67.5508, 129.1005 -19744, 65.12646, 113.8691 -19745, 69.52241, 112.2243 -19746, 67.01183, 119.4125 -19747, 68.04173, 118.3399 -19748, 68.01268, 132.8762 -19749, 62.53035, 118.2221 -19750, 70.50733, 125.0036 -19751, 62.05222, 120.4365 -19752, 65.71906, 133.3052 -19753, 67.78391, 127.5209 -19754, 67.33371, 125.0801 -19755, 67.91253, 132.1946 -19756, 67.30735, 132.4663 -19757, 69.08878, 123.8895 -19758, 65.76843, 114.4506 -19759, 71.64487, 135.5309 -19760, 66.25808, 113.4446 -19761, 64.36476, 116.8191 -19762, 68.6548, 142.4832 -19763, 68.95971, 144.5926 -19764, 70.20612, 138.5105 -19765, 70.57061, 147.3327 -19766, 69.44979, 123.2579 -19767, 70.52781, 133.765 -19768, 66.10873, 117.6254 -19769, 69.08755, 133.9543 -19770, 66.78469, 134.3005 -19771, 71.75464, 156.2319 -19772, 69.13771, 134.5773 -19773, 66.37631, 135.2777 -19774, 69.74647, 122.6657 -19775, 68.98829, 130.2543 -19776, 68.13136, 149.3854 -19777, 66.75278, 137.7469 -19778, 69.8914, 129.1302 -19779, 67.96866, 138.8191 -19780, 67.21946, 131.7829 -19781, 68.80103, 130.3331 -19782, 68.8093, 124.482 -19783, 68.65306, 127.3968 -19784, 67.87452, 130.8625 -19785, 68.70597, 122.373 -19786, 67.1432, 123.2538 -19787, 69.18709, 126.7873 -19788, 70.99521, 133.4597 -19789, 67.95264, 132.5607 -19790, 68.91363, 119.3353 -19791, 69.8465, 140.0139 -19792, 66.93742, 135.168 -19793, 70.11408, 124.4536 -19794, 67.60622, 114.6471 -19795, 66.39876, 122.4132 -19796, 69.57104, 133.4373 -19797, 70.09709, 123.9662 -19798, 67.25205, 129.9541 -19799, 71.43798, 155.874 -19800, 69.21724, 123.3436 -19801, 67.56125, 127.1117 -19802, 67.90888, 128.6947 -19803, 69.3568, 121.2005 -19804, 67.50241, 135.2608 -19805, 68.60586, 132.9409 -19806, 68.2366, 129.2684 -19807, 68.56842, 122.7771 -19808, 69.21836, 125.1624 -19809, 67.53883, 126.2731 -19810, 70.67327, 147.01 -19811, 64.2879, 112.1385 -19812, 68.46678, 124.5944 -19813, 66.73882, 131.1966 -19814, 70.55971, 129.4913 -19815, 67.84481, 137.5206 -19816, 67.01079, 114.7508 -19817, 65.99934, 133.4685 -19818, 68.58547, 146.8673 -19819, 68.81542, 125.8746 -19820, 67.93911, 120.2009 -19821, 68.93217, 118.3246 -19822, 69.23922, 143.7294 -19823, 67.79848, 115.8199 -19824, 68.65821, 125.5767 -19825, 71.49199, 161.906 -19826, 65.53287, 111.1526 -19827, 71.32373, 137.6824 -19828, 69.91417, 140.2723 -19829, 66.6972, 121.9527 -19830, 70.85386, 154.6366 -19831, 70.49105, 124.3354 -19832, 66.27006, 138.3716 -19833, 68.42409, 116.2243 -19834, 68.50301, 111.7963 -19835, 68.49217, 124.5766 -19836, 68.09457, 134.955 -19837, 66.31346, 136.7885 -19838, 68.98854, 129.8207 -19839, 67.05772, 126.8982 -19840, 73.192, 135.5029 -19841, 67.57593, 114.2885 -19842, 66.45283, 116.0452 -19843, 66.91061, 140.4039 -19844, 69.70103, 156.9321 -19845, 68.56368, 122.4036 -19846, 68.88525, 121.0687 -19847, 71.81982, 113.7783 -19848, 68.90203, 140.996 -19849, 67.3832, 121.1426 -19850, 66.76526, 113.7805 -19851, 67.09286, 109.4495 -19852, 66.22802, 120.2049 -19853, 68.25939, 123.1291 -19854, 69.60131, 135.8837 -19855, 64.74935, 89.95606 -19856, 69.34369, 126.1819 -19857, 69.9412, 139.8169 -19858, 68.28392, 115.4109 -19859, 69.34393, 140.1904 -19860, 66.55206, 125.5455 -19861, 66.75602, 118.3912 -19862, 66.35767, 111.1497 -19863, 66.73085, 119.8054 -19864, 65.89961, 122.6803 -19865, 67.4191, 143.7547 -19866, 68.24369, 131.5036 -19867, 66.7219, 103.6644 -19868, 70.74214, 130.2358 -19869, 67.20501, 126.207 -19870, 70.21431, 132.2408 -19871, 64.26213, 119.1471 -19872, 67.14367, 97.69037 -19873, 68.72736, 124.143 -19874, 68.55679, 102.8629 -19875, 66.29825, 126.6865 -19876, 68.72175, 133.4487 -19877, 69.87889, 139.1403 -19878, 65.49782, 133.31 -19879, 68.17108, 110.079 -19880, 66.70977, 119.4087 -19881, 65.56874, 125.6166 -19882, 69.49271, 132.6257 -19883, 69.51683, 141.4084 -19884, 66.7906, 143.8571 -19885, 70.21997, 121.1117 -19886, 70.24793, 129.4589 -19887, 67.80678, 141.4006 -19888, 70.97413, 128.1364 -19889, 69.75903, 155.8943 -19890, 69.15573, 139.2332 -19891, 68.27188, 140.4572 -19892, 67.52736, 120.8998 -19893, 68.11677, 131.2058 -19894, 65.96669, 134.5409 -19895, 68.82825, 125.8735 -19896, 67.64802, 128.2415 -19897, 66.56822, 129.7301 -19898, 67.92216, 108.3181 -19899, 70.16196, 114.9037 -19900, 66.40088, 126.6422 -19901, 67.98154, 135.6363 -19902, 64.99081, 116.9649 -19903, 71.5318, 142.0447 -19904, 63.2937, 119.9139 -19905, 67.63379, 150.7738 -19906, 68.18959, 140.7606 -19907, 68.28412, 124.5525 -19908, 66.9256, 136.9907 -19909, 68.68962, 116.8921 -19910, 69.26219, 124.0692 -19911, 69.7399, 137.5653 -19912, 69.78169, 124.2681 -19913, 68.89306, 118.0353 -19914, 65.92005, 129.992 -19915, 69.67499, 114.8889 -19916, 70.18064, 120.8334 -19917, 68.31191, 128.3317 -19918, 69.27083, 118.5856 -19919, 69.94767, 125.403 -19920, 63.84479, 111.7573 -19921, 69.72054, 125.5533 -19922, 69.6911, 117.1674 -19923, 68.25765, 132.8261 -19924, 66.49187, 125.1728 -19925, 66.2833, 121.768 -19926, 69.49919, 123.5578 -19927, 66.78395, 153.494 -19928, 69.53808, 152.2727 -19929, 68.26418, 137.6226 -19930, 70.75474, 138.2314 -19931, 66.34255, 135.4049 -19932, 70.56467, 121.9766 -19933, 67.88689, 142.8679 -19934, 67.40779, 110.0451 -19935, 70.88991, 141.9247 -19936, 68.45421, 122.053 -19937, 72.14473, 138.8158 -19938, 67.65045, 125.5035 -19939, 68.39678, 132.4804 -19940, 72.84591, 136.0289 -19941, 67.78233, 125.8292 -19942, 66.10641, 109.5937 -19943, 70.18598, 127.0676 -19944, 65.30154, 132.5025 -19945, 67.26947, 124.3345 -19946, 70.78309, 151.569 -19947, 65.97508, 132.6737 -19948, 70.00396, 110.0049 -19949, 67.10731, 97.30055 -19950, 67.53817, 121.8995 -19951, 68.50307, 128.1864 -19952, 65.67232, 122.9823 -19953, 66.09352, 127.0341 -19954, 68.5779, 138.1229 -19955, 68.91832, 125.8024 -19956, 66.54757, 118.9779 -19957, 66.30367, 106.1037 -19958, 67.09517, 139.1474 -19959, 67.48033, 133.0521 -19960, 68.6264, 126.1881 -19961, 67.43831, 121.3548 -19962, 66.67599, 122.0323 -19963, 64.52116, 121.3941 -19964, 69.79005, 143.503 -19965, 67.22173, 122.6996 -19966, 66.4933, 115.2943 -19967, 65.26414, 120.4538 -19968, 66.56788, 127.3631 -19969, 65.89813, 121.6184 -19970, 69.70797, 127.6245 -19971, 67.9721, 113.4425 -19972, 65.86077, 98.2528 -19973, 65.02716, 125.143 -19974, 68.48686, 143.42 -19975, 67.99138, 125.5912 -19976, 70.2878, 140.5505 -19977, 67.29468, 123.9692 -19978, 68.26174, 113.2655 -19979, 72.25625, 136.0435 -19980, 65.0702, 119.358 -19981, 71.08894, 135.0485 -19982, 68.25279, 133.0544 -19983, 66.785, 128.2321 -19984, 67.62555, 116.0675 -19985, 63.94658, 121.0392 -19986, 68.94779, 124.4974 -19987, 67.64244, 135.1131 -19988, 68.50966, 138.6605 -19989, 68.9745, 118.8841 -19990, 65.93037, 139.6622 -19991, 68.82556, 139.9606 -19992, 67.93484, 121.858 -19993, 66.37528, 118.5364 -19994, 67.22561, 137.6765 -19995, 68.95225, 127.904 -19996, 65.27908, 117.0884 -19997, 67.65755, 123.9277 -19998, 66.69201, 116.5055 -19999, 65.78102, 104.7543 -20000, 68.07045, 129.6798 -20001, 69, 135.3616 -20002, 69.10487, 126.5316 -20003, 72.13193, 161.0239 -20004, 70.90373, 145.6269 -20005, 67.86807, 122.0075 -20006, 67.43892, 131.4767 -20007, 69.43118, 133.454 -20008, 67.10359, 119.217 -20009, 70.18149, 147.2307 -20010, 67.38918, 139.7066 -20011, 70.45714, 139.7301 -20012, 68.63421, 115.9739 -20013, 65.62218, 136.3392 -20014, 67.06349, 123.1228 -20015, 67.30641, 98.95785 -20016, 65.46606, 106.7027 -20017, 66.53001, 121.2127 -20018, 67.3778, 114.9383 -20019, 69.32271, 115.2415 -20020, 66.7957, 128.4932 -20021, 65.32407, 114.5338 -20022, 66.55935, 121.121 -20023, 66.00505, 126.9795 -20024, 69.59739, 152.8693 -20025, 66.09583, 120.371 -20026, 69.36726, 118.9293 -20027, 72.00809, 144.9995 -20028, 66.88928, 110.721 -20029, 66.40722, 123.5727 -20030, 65.5385, 119.9828 -20031, 69.55926, 138.0278 -20032, 69.81405, 122.6454 -20033, 69.91993, 144.7208 -20034, 70.0879, 122.9645 -20035, 66.23051, 99.104 -20036, 67.61818, 141.2592 -20037, 68.58143, 125.3615 -20038, 68.15695, 126.2308 -20039, 67.512, 126.9866 -20040, 70.76552, 142.9296 -20041, 69.26234, 143.2527 -20042, 68.32817, 132.7759 -20043, 69.51257, 113.2856 -20044, 70.02706, 129.0559 -20045, 66.82483, 115.5469 -20046, 69.03162, 142.6512 -20047, 67.60125, 125.5298 -20048, 69.25415, 127.9935 -20049, 68.10161, 115.5621 -20050, 67.65047, 123.7327 -20051, 70.96123, 136.3127 -20052, 68.41146, 131.7994 -20053, 67.37012, 109.7773 -20054, 66.75139, 123.746 -20055, 67.13334, 121.373 -20056, 67.77926, 110.8057 -20057, 66.97201, 112.4094 -20058, 69.62951, 130.6875 -20059, 67.00845, 122.5204 -20060, 65.84782, 110.4676 -20061, 68.74982, 137.4344 -20062, 63.46219, 131.6278 -20063, 68.28298, 121.9196 -20064, 69.08611, 128.7246 -20065, 67.51138, 126.3069 -20066, 67.91991, 122.2827 -20067, 70.05535, 142.0311 -20068, 67.11741, 111.0611 -20069, 68.90664, 119.2548 -20070, 67.97481, 124.2253 -20071, 69.82979, 149.1322 -20072, 68.87782, 132.1464 -20073, 68.62969, 131.2994 -20074, 68.27637, 148.0963 -20075, 67.85369, 120.7737 -20076, 67.06235, 133.1606 -20077, 70.25943, 134.5582 -20078, 69.18391, 131.2755 -20079, 69.92206, 129.2742 -20080, 70.78492, 146.6769 -20081, 70.76045, 134.0286 -20082, 70.82053, 141.0171 -20083, 67.72934, 124.2418 -20084, 67.43639, 129.3814 -20085, 64.30312, 99.33579 -20086, 64.88648, 113.0468 -20087, 63.01244, 101.7311 -20088, 67.53395, 144.4339 -20089, 64.22026, 127.7241 -20090, 68.28249, 116.6627 -20091, 70.01457, 121.0093 -20092, 65.91743, 138.7636 -20093, 67.71394, 125.1313 -20094, 66.88127, 124.8587 -20095, 69.52967, 131.1727 -20096, 67.75601, 135.348 -20097, 69.49112, 154.7671 -20098, 70.22138, 141.0964 -20099, 67.96935, 127.4981 -20100, 68.11017, 128.5156 -20101, 67.92721, 127.1976 -20102, 66.16473, 127.8607 -20103, 69.99519, 143.375 -20104, 71.32358, 121.5075 -20105, 66.49822, 113.8888 -20106, 70.42992, 146.1728 -20107, 68.25325, 136.8917 -20108, 69.59837, 135.2368 -20109, 67.38237, 106.1247 -20110, 69.63917, 135.771 -20111, 67.21378, 112.4521 -20112, 65.34452, 111.6073 -20113, 68.45655, 148.5671 -20114, 68.20121, 137.8471 -20115, 68.83192, 132.2195 -20116, 67.9535, 149.5604 -20117, 67.56446, 148.7404 -20118, 71.56432, 139.6887 -20119, 68.20903, 117.3667 -20120, 67.06256, 135.0763 -20121, 68.82025, 126.8315 -20122, 71.58552, 134.0719 -20123, 70.89583, 103.5093 -20124, 69.64793, 131.3787 -20125, 66.45609, 123.3787 -20126, 69.56363, 141.0351 -20127, 69.23708, 133.7008 -20128, 65.9631, 121.1477 -20129, 68.3926, 118.928 -20130, 70.81159, 143.5666 -20131, 70.25802, 126.5308 -20132, 68.9312, 144.6893 -20133, 66.2989, 110.7134 -20134, 72.15283, 146.939 -20135, 68.20211, 109.0779 -20136, 69.1044, 140.5917 -20137, 67.85693, 134.4135 -20138, 67.39485, 118.5645 -20139, 69.13842, 118.8077 -20140, 66.3523, 150.3613 -20141, 71.42226, 121.618 -20142, 72.04165, 150.4715 -20143, 71.05928, 134.4648 -20144, 68.92866, 140.0844 -20145, 66.87497, 131.2338 -20146, 66.36569, 112.5793 -20147, 68.14086, 119.4189 -20148, 66.96983, 123.9473 -20149, 67.54357, 116.4046 -20150, 70.77658, 136.8102 -20151, 68.23718, 118.8886 -20152, 65.53862, 113.2725 -20153, 70.74761, 129.527 -20154, 67.55223, 124.4289 -20155, 70.84812, 150.4496 -20156, 64.4822, 134.1656 -20157, 67.42974, 122.2538 -20158, 68.7509, 119.9506 -20159, 67.83374, 134.5717 -20160, 63.90073, 116.8635 -20161, 70.12934, 134.9922 -20162, 66.37869, 100.5167 -20163, 68.9421, 118.0776 -20164, 70.85312, 134.9686 -20165, 64.83967, 117.0881 -20166, 67.11542, 128.8033 -20167, 68.74812, 134.275 -20168, 67.68923, 123.2354 -20169, 66.62519, 110.3765 -20170, 69.52379, 122.3171 -20171, 72.60803, 150.6268 -20172, 66.8619, 129.2457 -20173, 67.23587, 135.0301 -20174, 66.98288, 118.3685 -20175, 68.17128, 116.8477 -20176, 67.3241, 128.0642 -20177, 71.1372, 144.0187 -20178, 71.27594, 123.566 -20179, 68.39965, 117.7892 -20180, 68.89269, 144.723 -20181, 66.61543, 119.0238 -20182, 67.87792, 127.064 -20183, 68.88772, 131.1342 -20184, 65.0809, 118.9592 -20185, 65.78164, 128.0685 -20186, 69.07443, 130.0005 -20187, 67.69871, 127.2036 -20188, 68.07915, 151.4387 -20189, 71.94398, 122.1514 -20190, 70.07901, 134.6456 -20191, 65.88124, 128.5412 -20192, 67.77076, 134.9165 -20193, 72.69153, 141.1027 -20194, 69.03806, 126.5811 -20195, 65.71193, 136.4266 -20196, 66.44909, 127.9841 -20197, 68.37502, 145.2352 -20198, 68.09913, 108.097 -20199, 67.05164, 116.4216 -20200, 69.4034, 136.0425 -20201, 65.90879, 102.6161 -20202, 69.2529, 134.5586 -20203, 68.32439, 134.5378 -20204, 72.56715, 134.0677 -20205, 67.16006, 114.3012 -20206, 69.91344, 139.9068 -20207, 69.25259, 127.9861 -20208, 62.57176, 116.0712 -20209, 68.71931, 130.8788 -20210, 67.1141, 125.1614 -20211, 67.42686, 130.3149 -20212, 64.27619, 109.2928 -20213, 65.97118, 127.5532 -20214, 68.29677, 125.902 -20215, 67.4216, 137.4702 -20216, 68.18813, 119.2532 -20217, 66.22803, 117.0998 -20218, 67.71768, 135.8263 -20219, 69.80841, 122.2657 -20220, 67.72574, 110.1562 -20221, 69.0302, 122.5569 -20222, 66.72956, 96.99228 -20223, 66.46165, 97.49168 -20224, 64.83455, 114.8982 -20225, 65.70127, 112.5822 -20226, 68.87993, 122.4194 -20227, 69.96137, 131.7487 -20228, 65.23797, 114.4665 -20229, 67.01631, 114.5892 -20230, 70.19731, 135.6892 -20231, 66.3049, 114.8127 -20232, 64.12913, 105.3937 -20233, 68.18283, 133.3447 -20234, 67.67028, 135.6944 -20235, 68.87122, 136.7085 -20236, 65.48468, 114.5325 -20237, 67.5644, 116.5703 -20238, 70.59715, 135.872 -20239, 65.17748, 115.0443 -20240, 71.057, 126.792 -20241, 67.06806, 129.769 -20242, 68.01857, 122.0285 -20243, 67.53436, 103.3526 -20244, 68.2649, 140.749 -20245, 68.76502, 116.1648 -20246, 69.56514, 144.1114 -20247, 68.47043, 120.0682 -20248, 66.97456, 139.6484 -20249, 67.78233, 142.2416 -20250, 71.97165, 146.9815 -20251, 67.87652, 134.4355 -20252, 67.37003, 129.7164 -20253, 65.51123, 124.857 -20254, 66.43394, 121.4185 -20255, 68.50863, 118.6061 -20256, 65.99469, 123.818 -20257, 67.65941, 125.8492 -20258, 68.16997, 120.6193 -20259, 68.01948, 117.5951 -20260, 67.1946, 136.9306 -20261, 70.9964, 136.1914 -20262, 71.25473, 125.2789 -20263, 68.45711, 126.4985 -20264, 66.9254, 111.3531 -20265, 66.96343, 129.305 -20266, 68.34578, 141.5014 -20267, 68.59318, 137.2555 -20268, 65.71377, 129.8145 -20269, 70.41312, 124.1318 -20270, 70.03799, 133.8807 -20271, 67.56852, 109.6435 -20272, 71.64191, 134.8014 -20273, 65.92905, 116.835 -20274, 67.36226, 129.5522 -20275, 68.135, 132.4818 -20276, 65.26581, 114.4764 -20277, 68.22857, 97.6209 -20278, 70.04585, 129.0328 -20279, 68.69432, 127.4449 -20280, 70.301, 122.6477 -20281, 67.26421, 130.2722 -20282, 69.85285, 118.5515 -20283, 71.63372, 154.6085 -20284, 67.21655, 131.0217 -20285, 70.02939, 120.2406 -20286, 65.5687, 124.9128 -20287, 65.25174, 112.4398 -20288, 65.929, 114.4281 -20289, 67.14311, 115.7168 -20290, 66.49901, 125.9384 -20291, 70.93967, 125.3897 -20292, 66.52816, 136.1073 -20293, 69.84944, 138.9535 -20294, 65.96939, 139.4453 -20295, 68.40828, 117.9883 -20296, 67.60775, 124.6082 -20297, 70.31889, 126.6473 -20298, 67.2128, 132.4211 -20299, 66.21903, 140.6382 -20300, 70.83652, 142.9636 -20301, 64.87568, 112.136 -20302, 68.41633, 123.2201 -20303, 67.53817, 118.8005 -20304, 68.45528, 143.2071 -20305, 69.47681, 126.8002 -20306, 68.64769, 137.4465 -20307, 68.03199, 127.1805 -20308, 67.08338, 116.2853 -20309, 72.59665, 165.69 -20310, 68.18865, 127.3957 -20311, 66.73669, 130.1419 -20312, 68.34888, 134.0523 -20313, 65.38285, 109.3722 -20314, 70.40366, 123.1378 -20315, 68.0996, 134.1465 -20316, 68.73681, 139.88 -20317, 66.70503, 108.05 -20318, 66.91609, 127.735 -20319, 67.71304, 142.4622 -20320, 67.09454, 118.5795 -20321, 70.10587, 140.6171 -20322, 67.63564, 116.2521 -20323, 69.59775, 114.9682 -20324, 63.31969, 116.6964 -20325, 67.50844, 125.711 -20326, 64.22298, 124.6074 -20327, 68.1793, 126.4246 -20328, 68.55696, 127.6106 -20329, 70.15891, 137.2941 -20330, 68.97198, 129.8513 -20331, 69.88406, 138.7922 -20332, 67.74655, 126.6633 -20333, 68.93411, 142.0475 -20334, 67.07117, 127.948 -20335, 66.84105, 121.3274 -20336, 67.96232, 110.604 -20337, 66.81235, 134.9879 -20338, 67.54297, 137.6693 -20339, 67.11473, 140.6498 -20340, 67.44452, 130.1931 -20341, 67.47722, 121.0267 -20342, 69.4803, 132.4652 -20343, 64.54045, 112.5734 -20344, 67.05092, 156.3107 -20345, 67.46141, 117.9935 -20346, 71.26722, 131.7057 -20347, 68.42653, 124.6422 -20348, 66.41842, 111.3519 -20349, 65.59731, 128.8394 -20350, 70.03197, 137.246 -20351, 67.08672, 135.7636 -20352, 70.89503, 130.5971 -20353, 68.59771, 144.4514 -20354, 71.63118, 153.4787 -20355, 64.39522, 93.13802 -20356, 71.59533, 138.6555 -20357, 70.78851, 147.8683 -20358, 66.42758, 133.9707 -20359, 66.85979, 122.2792 -20360, 67.44995, 110.9694 -20361, 71.7881, 144.1019 -20362, 65.40377, 123.0822 -20363, 68.96921, 135.9892 -20364, 66.02056, 111.7557 -20365, 67.01558, 122.3018 -20366, 65.98015, 132.4379 -20367, 69.99987, 131.8418 -20368, 72.77006, 145.7023 -20369, 69.19937, 128.6703 -20370, 68.33541, 130.0217 -20371, 65.90805, 110.325 -20372, 70.4214, 118.5469 -20373, 64.65961, 126.5912 -20374, 68.52782, 145.3248 -20375, 65.43216, 132.3232 -20376, 68.28139, 120.4382 -20377, 67.97639, 122.7008 -20378, 67.1216, 123.1906 -20379, 68.9888, 130.4923 -20380, 72.31685, 130.7836 -20381, 71.48421, 116.0402 -20382, 68.65529, 131.0603 -20383, 67.11382, 128.0532 -20384, 68.62405, 137.5614 -20385, 67.85068, 138.8061 -20386, 69.48292, 129.8207 -20387, 70.50328, 143.8129 -20388, 64.33619, 113.6534 -20389, 68.29958, 134.9162 -20390, 67.4218, 122.3882 -20391, 67.9999, 118.3824 -20392, 65.63699, 92.23364 -20393, 67.0808, 107.6561 -20394, 68.91211, 118.4631 -20395, 63.59144, 128.4961 -20396, 68.81852, 150.2385 -20397, 65.96684, 139.8666 -20398, 68.01035, 122.6358 -20399, 67.85106, 131.9627 -20400, 71.04479, 120.0601 -20401, 67.7153, 127.9327 -20402, 67.84737, 124.7808 -20403, 67.83905, 112.9329 -20404, 69.74146, 147.4557 -20405, 67.97724, 117.8599 -20406, 71.045, 128.2833 -20407, 66.84059, 127.2334 -20408, 68.48567, 132.5849 -20409, 68.14535, 126.5979 -20410, 65.41341, 114.3991 -20411, 70.53582, 139.0164 -20412, 69.15586, 115.9193 -20413, 66.44247, 117.9539 -20414, 66.25178, 120.6345 -20415, 69.06165, 131.7664 -20416, 67.22249, 125.729 -20417, 66.43324, 129.5693 -20418, 69.95125, 130.8579 -20419, 68.44759, 124.3484 -20420, 70.12447, 138.252 -20421, 69.8081, 119.0553 -20422, 66.66426, 111.126 -20423, 69.07965, 124.0522 -20424, 65.75374, 127.0394 -20425, 67.98129, 133.4278 -20426, 67.91274, 136.145 -20427, 70.14506, 127.6122 -20428, 71.66221, 143.7339 -20429, 67.31462, 126.7645 -20430, 66.85489, 125.1375 -20431, 66.2073, 127.1956 -20432, 67.88187, 127.862 -20433, 69.45561, 122.6111 -20434, 69.68169, 129.665 -20435, 66.81274, 120.6235 -20436, 67.39812, 120.5257 -20437, 68.31286, 127.2671 -20438, 68.85197, 127.0149 -20439, 70.87098, 136.8526 -20440, 69.29233, 138.6572 -20441, 68.53017, 120.753 -20442, 66.20327, 126.655 -20443, 69.44148, 139.7399 -20444, 65.62755, 111.5919 -20445, 70.36911, 144.6446 -20446, 68.25511, 126.5607 -20447, 70.74579, 137.4108 -20448, 69.32344, 129.5371 -20449, 72.37667, 135.5361 -20450, 66.5913, 126.8375 -20451, 68.1977, 108.343 -20452, 67.73534, 132.0269 -20453, 65.65796, 135.0314 -20454, 68.33944, 126.1502 -20455, 67.98774, 126.5783 -20456, 68.54596, 132.9952 -20457, 68.38063, 122.207 -20458, 70.22056, 140.0847 -20459, 70.02586, 143.8558 -20460, 67.93956, 129.5068 -20461, 66.14777, 133.4099 -20462, 70.69657, 133.1874 -20463, 68.46672, 116.0821 -20464, 66.11868, 107.6714 -20465, 68.98878, 119.9309 -20466, 65.43912, 110.8787 -20467, 69.24822, 122.2722 -20468, 66.94932, 119.4308 -20469, 69.8028, 155.9683 -20470, 70.60933, 134.2835 -20471, 64.78426, 96.84397 -20472, 66.84264, 111.5454 -20473, 68.86833, 132.5776 -20474, 66.94365, 122.2372 -20475, 68.80139, 114.8579 -20476, 68.53662, 138.1599 -20477, 67.54398, 115.7562 -20478, 65.80968, 107.5309 -20479, 69.44019, 146.7688 -20480, 72.46054, 139.538 -20481, 67.09188, 119.9537 -20482, 71.46543, 129.3841 -20483, 66.06765, 112.5487 -20484, 70.96886, 145.5672 -20485, 68.75285, 140.7801 -20486, 65.12147, 132.9884 -20487, 69.29005, 137.3932 -20488, 69.67431, 128.0475 -20489, 67.58498, 125.6642 -20490, 63.26666, 109.048 -20491, 66.60384, 138.8578 -20492, 66.83134, 146.1347 -20493, 65.56701, 106.8728 -20494, 69.4336, 141.0332 -20495, 69.83412, 137.6869 -20496, 66.49534, 128.6661 -20497, 69.30191, 136.9649 -20498, 70.37349, 131.559 -20499, 68.28454, 107.5659 -20500, 67.51385, 122.6429 -20501, 67.58383, 117.5512 -20502, 68.68046, 132.6414 -20503, 68.31025, 107.7211 -20504, 66.68274, 117.1056 -20505, 69.13988, 109.5238 -20506, 66.6069, 107.7197 -20507, 67.71554, 117.3417 -20508, 72.5178, 142.1602 -20509, 70.39659, 133.5727 -20510, 65.92367, 110.1202 -20511, 68.63932, 141.4085 -20512, 66.27944, 102.8787 -20513, 68.09404, 107.0729 -20514, 62.77861, 110.8067 -20515, 66.02558, 123.5278 -20516, 69.11022, 122.7845 -20517, 67.14077, 126.2096 -20518, 69.85347, 107.1566 -20519, 63.72249, 101.0392 -20520, 64.66334, 123.9993 -20521, 69.61292, 122.092 -20522, 69.72279, 128.8986 -20523, 67.76397, 134.59 -20524, 66.74961, 140.8048 -20525, 66.67181, 114.3215 -20526, 67.69057, 123.4607 -20527, 68.39115, 124.7738 -20528, 67.31796, 136.8823 -20529, 68.69023, 125.262 -20530, 70.04462, 136.1957 -20531, 70.19356, 148.1844 -20532, 69.12451, 133.6843 -20533, 67.56314, 124.4263 -20534, 67.66596, 122.3849 -20535, 65.98485, 136.0888 -20536, 68.9407, 133.1295 -20537, 72.42506, 136.0244 -20538, 66.60508, 104.5026 -20539, 67.37321, 124.8638 -20540, 64.89494, 119.6409 -20541, 64.73669, 111.0633 -20542, 69.93102, 124.5422 -20543, 70.69335, 152.3325 -20544, 64.91169, 112.489 -20545, 69.69729, 122.2093 -20546, 63.56648, 112.8596 -20547, 67.29212, 142.3005 -20548, 68.3562, 117.0085 -20549, 68.12976, 123.0924 -20550, 68.62582, 115.3394 -20551, 66.8343, 105.8407 -20552, 69.98616, 122.6015 -20553, 67.44953, 130.5904 -20554, 69.67914, 123.558 -20555, 67.13387, 106.9958 -20556, 71.13815, 140.6296 -20557, 69.22959, 142.3174 -20558, 67.48473, 122.8173 -20559, 66.87485, 118.1003 -20560, 70.4596, 130.9488 -20561, 72.97347, 148.319 -20562, 67.16616, 108.2369 -20563, 67.36668, 123.3563 -20564, 68.30287, 117.9635 -20565, 68.08229, 131.5261 -20566, 68.94862, 141.0023 -20567, 68.47186, 145.789 -20568, 66.63803, 120.2544 -20569, 66.27658, 119.9535 -20570, 65.02396, 117.4626 -20571, 71.99598, 129.1844 -20572, 68.04691, 121.2735 -20573, 66.34711, 114.8943 -20574, 63.8229, 115.2754 -20575, 65.95638, 118.4989 -20576, 68.23334, 121.6989 -20577, 69.46635, 123.2046 -20578, 68.44607, 142.2776 -20579, 69.20365, 129.7053 -20580, 65.63555, 100.3371 -20581, 69.41412, 127.8275 -20582, 67.57457, 126.7177 -20583, 69.32559, 147.9203 -20584, 67.15965, 129.7563 -20585, 70.27834, 139.5538 -20586, 69.39938, 121.1538 -20587, 69.78475, 126.5296 -20588, 68.70946, 134.4551 -20589, 67.3998, 121.8096 -20590, 66.39262, 117.1371 -20591, 65.54597, 126.8852 -20592, 70.60879, 147.0102 -20593, 69.12623, 136.913 -20594, 66.72257, 122.5503 -20595, 67.40649, 117.2019 -20596, 66.18815, 121.8368 -20597, 68.62091, 121.9134 -20598, 70.1055, 153.0944 -20599, 65.48309, 132.6901 -20600, 68.80217, 128.7584 -20601, 67.71394, 121.7097 -20602, 66.57756, 128.9506 -20603, 67.61238, 130.8714 -20604, 67.23082, 128.4602 -20605, 67.08114, 117.4463 -20606, 66.53761, 122.2484 -20607, 67.41405, 126.4525 -20608, 67.06676, 131.406 -20609, 60.8062, 113.9145 -20610, 68.97175, 140.1085 -20611, 72.75763, 135.1411 -20612, 66.02447, 110.7159 -20613, 68.71706, 126.0198 -20614, 69.58585, 142.5501 -20615, 68.96375, 144.368 -20616, 68.26381, 140.3248 -20617, 68.53173, 133.5063 -20618, 63.69299, 127.3114 -20619, 67.32224, 144.3122 -20620, 69.87332, 136.2286 -20621, 65.77657, 121.8449 -20622, 67.84042, 129.3201 -20623, 68.02586, 127.7367 -20624, 67.22709, 124.1286 -20625, 70.33705, 113.399 -20626, 64.42061, 119.5736 -20627, 68.62922, 134.0348 -20628, 67.24371, 139.2993 -20629, 67.47488, 128.9315 -20630, 67.65179, 143.8519 -20631, 68.73059, 133.2077 -20632, 69.53168, 141.696 -20633, 67.76596, 142.9992 -20634, 68.6692, 145.841 -20635, 65.39292, 101.1876 -20636, 67.21484, 126.5562 -20637, 67.39797, 126.3908 -20638, 68.43286, 136.4691 -20639, 66.50645, 117.1767 -20640, 65.10771, 114.3875 -20641, 70.25153, 134.4531 -20642, 64.65223, 129.7684 -20643, 68.39572, 137.1362 -20644, 65.58641, 112.8512 -20645, 67.07497, 134.1362 -20646, 70.10614, 127.5408 -20647, 66.44143, 129.3753 -20648, 69.08524, 141.5455 -20649, 66.99606, 134.7843 -20650, 64.84392, 122.3505 -20651, 68.7585, 115.2365 -20652, 67.03556, 143.0013 -20653, 69.10705, 125.3759 -20654, 68.21709, 136.4534 -20655, 67.54954, 99.21333 -20656, 70.05957, 138.7376 -20657, 69.88409, 131.7587 -20658, 69.08434, 130.7379 -20659, 68.81191, 138.1377 -20660, 70.22844, 133.4575 -20661, 63.67519, 114.2171 -20662, 69.40968, 129.3261 -20663, 67.36179, 129.458 -20664, 69.9419, 131.7153 -20665, 68.44902, 122.7104 -20666, 67.76199, 127.8066 -20667, 70.12858, 131.6387 -20668, 67.97947, 133.6018 -20669, 69.83727, 126.7482 -20670, 66.62896, 124.7778 -20671, 69.77866, 128.9596 -20672, 69.32719, 120.7591 -20673, 68.81059, 110.0003 -20674, 68.33355, 123.5156 -20675, 65.4258, 116.0243 -20676, 68.90712, 136.1172 -20677, 65.90871, 100.8179 -20678, 69.61291, 143.8929 -20679, 65.97906, 131.2483 -20680, 64.15687, 121.6986 -20681, 68.2467, 129.0825 -20682, 67.07394, 113.9007 -20683, 66.08619, 123.5496 -20684, 68.43739, 107.3327 -20685, 69.43772, 117.4397 -20686, 68.81411, 140.5039 -20687, 66.23749, 130.4565 -20688, 67.36339, 135.7808 -20689, 68.93254, 121.3642 -20690, 67.86058, 111.123 -20691, 68.66247, 134.825 -20692, 68.4129, 130.3184 -20693, 63.90356, 101.9503 -20694, 69.56018, 118.6513 -20695, 69.81143, 117.3253 -20696, 68.55186, 142.7701 -20697, 66.14069, 111.9785 -20698, 68.79393, 127.0587 -20699, 62.67467, 108.2196 -20700, 68.24157, 126.3228 -20701, 70.13299, 125.7628 -20702, 68.83759, 128.3162 -20703, 69.20668, 126.8811 -20704, 63.01224, 123.2124 -20705, 68.7409, 140.5609 -20706, 66.94988, 121.3932 -20707, 70.13604, 132.7095 -20708, 68.11161, 121.1428 -20709, 66.58893, 118.2131 -20710, 69.98813, 128.2565 -20711, 66.52501, 120.0478 -20712, 65.2536, 142.5526 -20713, 68.66702, 140.5596 -20714, 71.383, 149.9544 -20715, 66.58224, 123.0901 -20716, 66.50775, 122.9845 -20717, 67.13954, 113.5739 -20718, 68.33274, 137.9826 -20719, 66.69458, 110.1558 -20720, 68.21523, 113.6369 -20721, 66.0808, 131.0879 -20722, 69.46013, 116.5407 -20723, 68.46971, 128.2455 -20724, 68.51333, 101.2957 -20725, 69.10467, 126.8762 -20726, 67.91609, 125.1615 -20727, 67.02882, 143.6948 -20728, 66.08997, 111.3684 -20729, 65.02401, 130.3431 -20730, 68.27428, 121.8474 -20731, 67.35413, 129.3491 -20732, 66.36083, 120.4201 -20733, 68.43123, 121.1875 -20734, 67.40001, 121.7106 -20735, 69.1343, 143.8484 -20736, 67.3171, 139.03 -20737, 73.1971, 157.1585 -20738, 68.39262, 110.6509 -20739, 66.29361, 129.1393 -20740, 69.09153, 123.9906 -20741, 68.08869, 121.8243 -20742, 69.84933, 128.1401 -20743, 67.6024, 133.6571 -20744, 69.71303, 149.4977 -20745, 66.84285, 117.0056 -20746, 66.65337, 112.7847 -20747, 68.88409, 124.0698 -20748, 70.70338, 119.2585 -20749, 66.20185, 112.3781 -20750, 66.31546, 119.0874 -20751, 67.41672, 113.6532 -20752, 69.90956, 140.9595 -20753, 67.68745, 109.4462 -20754, 66.35603, 124.8582 -20755, 64.29036, 129.8863 -20756, 69.06878, 146.3358 -20757, 66.89343, 136.7567 -20758, 66.4584, 98.04174 -20759, 68.8269, 130.6512 -20760, 66.65183, 134.0198 -20761, 63.84789, 128.9473 -20762, 65.79543, 119.418 -20763, 66.25942, 94.20537 -20764, 68.35371, 133.6204 -20765, 70.8435, 120.1922 -20766, 66.63549, 116.47 -20767, 69.36633, 142.61 -20768, 67.36309, 112.8032 -20769, 69.12732, 120.6275 -20770, 65.03504, 115.4154 -20771, 69.06645, 119.3467 -20772, 67.35099, 126.3068 -20773, 66.63538, 125.8876 -20774, 66.49659, 127.904 -20775, 69.098, 124.0368 -20776, 68.42363, 149.2454 -20777, 68.12064, 139.9387 -20778, 69.58767, 125.8239 -20779, 66.34056, 125.5225 -20780, 68.89947, 153.7886 -20781, 67.47147, 142.1622 -20782, 68.33028, 135.5338 -20783, 65.90128, 135.2264 -20784, 68.73695, 127.4165 -20785, 67.98409, 122.7703 -20786, 65.63064, 109.6107 -20787, 68.03278, 148.5683 -20788, 68.65828, 124.3302 -20789, 68.63764, 128.7478 -20790, 67.32521, 105.1839 -20791, 64.78784, 126.1355 -20792, 67.67246, 130.4082 -20793, 68.72131, 139.5527 -20794, 67.35886, 107.6427 -20795, 68.01738, 123.0304 -20796, 67.93165, 128.936 -20797, 66.67783, 123.5636 -20798, 68.67803, 136.5982 -20799, 70.36756, 134.6182 -20800, 67.51615, 132.9171 -20801, 66.75303, 132.5747 -20802, 69.96302, 127.5174 -20803, 66.93841, 115.9348 -20804, 68.11271, 130.5024 -20805, 63.94913, 114.6628 -20806, 68.91814, 147.3669 -20807, 67.2232, 114.4928 -20808, 69.55046, 133.7412 -20809, 68.68863, 129.8662 -20810, 70.7747, 138.641 -20811, 69.07808, 148.7933 -20812, 68.33838, 141.2387 -20813, 65.5871, 126.7083 -20814, 69.2935, 139.4127 -20815, 68.89933, 125.6523 -20816, 65.81485, 99.77933 -20817, 67.20659, 125.993 -20818, 66.51348, 127.1042 -20819, 67.55072, 134.551 -20820, 68.23821, 118.6372 -20821, 66.4512, 110.1362 -20822, 68.54449, 141.4482 -20823, 68.6177, 122.9561 -20824, 64.08191, 102.7885 -20825, 65.56492, 123.1351 -20826, 67.21104, 115.6723 -20827, 66.10932, 126.3925 -20828, 68.9513, 143.6607 -20829, 67.49786, 131.6653 -20830, 67.93624, 139.3751 -20831, 65.95214, 130.4147 -20832, 68.68249, 151.5916 -20833, 69.18583, 124.8504 -20834, 70.94061, 142.0348 -20835, 69.47461, 138.1862 -20836, 67.12497, 113.1001 -20837, 68.57401, 125.5023 -20838, 65.39763, 132.4789 -20839, 68.35258, 137.1238 -20840, 67.56785, 136.4769 -20841, 69.52703, 123.4405 -20842, 67.54305, 105.1903 -20843, 63.49236, 114.9085 -20844, 68.98626, 126.71 -20845, 67.55391, 121.5587 -20846, 64.6396, 115.1491 -20847, 69.82904, 136.2695 -20848, 67.85076, 113.2082 -20849, 67.23771, 125.3433 -20850, 69.38105, 139.5524 -20851, 65.41584, 121.8604 -20852, 66.96076, 119.1984 -20853, 65.26585, 117.7246 -20854, 69.31322, 119.5252 -20855, 67.70408, 122.2612 -20856, 68.08721, 129.7701 -20857, 68.26197, 125.9953 -20858, 67.36362, 121.8119 -20859, 68.73217, 131.316 -20860, 69.14267, 111.1968 -20861, 68.56673, 136.4706 -20862, 68.1929, 120.5822 -20863, 69.5696, 121.1881 -20864, 70.8464, 137.1416 -20865, 67.82872, 127.2809 -20866, 67.03478, 108.5558 -20867, 67.81671, 129.7571 -20868, 70.03848, 138.9428 -20869, 66.9821, 127.2445 -20870, 65.79107, 129.8116 -20871, 70.02914, 142.6562 -20872, 69.58224, 132.0934 -20873, 66.87147, 115.1241 -20874, 66.91792, 127.8387 -20875, 67.645, 121.3585 -20876, 68.65355, 119.0566 -20877, 66.91671, 130.2133 -20878, 70.15303, 141.003 -20879, 73.57982, 148.162 -20880, 67.98141, 124.7923 -20881, 71.49609, 145.3407 -20882, 69.85855, 131.7066 -20883, 68.11629, 109.1855 -20884, 70.19549, 136.493 -20885, 68.90094, 103.5978 -20886, 70.63071, 129.0681 -20887, 67.51818, 126.5297 -20888, 66.18712, 136.2942 -20889, 69.09528, 134.2318 -20890, 65.42299, 105.5537 -20891, 65.48038, 115.372 -20892, 66.9465, 113.8431 -20893, 68.70316, 125.9352 -20894, 66.07277, 123.7771 -20895, 69.44961, 110.8748 -20896, 68.81836, 104.8678 -20897, 69.50743, 105.3865 -20898, 67.82486, 118.2755 -20899, 67.69081, 143.7724 -20900, 68.29836, 129.3948 -20901, 68.67553, 120.7367 -20902, 65.8428, 122.3581 -20903, 68.03516, 124.0374 -20904, 65.75933, 145.1502 -20905, 70.38122, 133.3322 -20906, 67.40825, 132.4084 -20907, 69.96042, 126.2582 -20908, 68.28036, 130.5773 -20909, 68.78403, 111.5448 -20910, 67.91698, 128.8497 -20911, 69.37666, 137.7729 -20912, 66.74216, 117.4347 -20913, 68.1985, 135.4972 -20914, 63.58869, 125.2844 -20915, 73.25534, 129.3863 -20916, 67.70295, 110.3234 -20917, 65.97536, 105.0947 -20918, 69.81239, 134.9831 -20919, 68.86872, 123.426 -20920, 72.74547, 148.5568 -20921, 68.30771, 129.105 -20922, 66.76693, 124.0618 -20923, 67.44946, 123.4784 -20924, 69.7046, 141.6202 -20925, 68.97441, 103.9181 -20926, 67.75058, 135.2187 -20927, 66.8731, 124.1057 -20928, 70.45912, 121.7787 -20929, 70.71713, 138.8325 -20930, 65.65535, 118.4649 -20931, 71.45237, 136.8498 -20932, 69.00661, 131.4449 -20933, 64.07452, 139.9216 -20934, 69.47642, 135.5616 -20935, 69.52284, 129.724 -20936, 64.89822, 131.9576 -20937, 70.70905, 134.3203 -20938, 70.19814, 125.1643 -20939, 67.76234, 130.1309 -20940, 67.21866, 135.3954 -20941, 67.54948, 111.8586 -20942, 68.13277, 139.2003 -20943, 68.84252, 126.0857 -20944, 68.97585, 137.8195 -20945, 67.17762, 99.13368 -20946, 67.76576, 131.2841 -20947, 69.05508, 132.9015 -20948, 68.30757, 135.9473 -20949, 67.32683, 123.4861 -20950, 67.29407, 117.8979 -20951, 66.63257, 126.1084 -20952, 66.94794, 107.183 -20953, 68.13987, 133.2584 -20954, 65.21117, 101.1071 -20955, 68.03769, 119.4935 -20956, 67.26932, 128.9103 -20957, 69.77352, 141.6894 -20958, 69.23863, 125.2157 -20959, 68.7891, 114.34 -20960, 67.26289, 117.1026 -20961, 69.29545, 132.6378 -20962, 67.5793, 112.7331 -20963, 67.21365, 108.0763 -20964, 69.62993, 140.0795 -20965, 67.00026, 125.4628 -20966, 67.93443, 122.1726 -20967, 73.47464, 134.996 -20968, 71.5009, 148.2703 -20969, 67.5436, 124.5961 -20970, 71.49304, 128.6835 -20971, 68.1677, 130.5834 -20972, 68.65009, 127.7241 -20973, 66.04619, 112.1905 -20974, 67.31327, 122.8993 -20975, 67.86012, 116.6222 -20976, 69.42007, 128.9863 -20977, 68.38556, 133.6644 -20978, 69.91327, 118.2455 -20979, 68.8823, 138.4001 -20980, 64.05944, 115.5782 -20981, 69.73048, 126.5238 -20982, 68.632, 135.6997 -20983, 69.40445, 137.5303 -20984, 66.00545, 132.9691 -20985, 67.12871, 128.9781 -20986, 67.54768, 115.0198 -20987, 69.18741, 122.9827 -20988, 65.72702, 115.7926 -20989, 67.85686, 110.7137 -20990, 67.32954, 113.4872 -20991, 67.30146, 143.8451 -20992, 66.33349, 107.1243 -20993, 68.22832, 133.2817 -20994, 64.45511, 117.3622 -20995, 67.87195, 149.4365 -20996, 69.92163, 125.4082 -20997, 62.8062, 107.3401 -20998, 69.3377, 151.2393 -20999, 66.60043, 130.1472 -21000, 70.53369, 140.2407 -21001, 68.84104, 122.8631 -21002, 67.22118, 124.7784 -21003, 69.1338, 131.5248 -21004, 70.23848, 138.5036 -21005, 69.10331, 125.7452 -21006, 70.4064, 138.0741 -21007, 66.66478, 139.0241 -21008, 70.33089, 164.4539 -21009, 70.78331, 141.8412 -21010, 66.83722, 121.0509 -21011, 65.8839, 112.9256 -21012, 67.51176, 137.9948 -21013, 71.21095, 156.0802 -21014, 67.16471, 135.2937 -21015, 67.49059, 132.7359 -21016, 69.13583, 118.2087 -21017, 66.44838, 121.7145 -21018, 67.03679, 143.9542 -21019, 66.66855, 116.5589 -21020, 69.36123, 127.5953 -21021, 68.92478, 137.2977 -21022, 69.70613, 144.1729 -21023, 66.70216, 120.8874 -21024, 69.3032, 132.8515 -21025, 68.68207, 121.2207 -21026, 67.12449, 126.3432 -21027, 66.92738, 116.3508 -21028, 71.36236, 142.3522 -21029, 66.8559, 106.8363 -21030, 69.46283, 118.5577 -21031, 66.4827, 114.5936 -21032, 72.45414, 135.0235 -21033, 68.10614, 120.628 -21034, 65.75378, 124.3824 -21035, 67.16782, 130.0399 -21036, 68.57483, 129.4804 -21037, 67.275, 122.2215 -21038, 66.23984, 97.1995 -21039, 72.39041, 155.1414 -21040, 68.82192, 129.0373 -21041, 67.67589, 126.7606 -21042, 66.09883, 118.7709 -21043, 67.79875, 130.1887 -21044, 68.76062, 115.7905 -21045, 68.86156, 136.3079 -21046, 71.20733, 155.2221 -21047, 65.24249, 114.9215 -21048, 67.33131, 112.8186 -21049, 67.52803, 113.459 -21050, 67.1708, 120.6546 -21051, 66.8838, 138.4066 -21052, 67.26462, 117.0708 -21053, 70.94467, 130.2774 -21054, 71.15199, 133.2351 -21055, 69.35701, 156.0959 -21056, 66.91104, 125.0535 -21057, 68.07832, 122.8732 -21058, 65.74579, 110.9296 -21059, 70.64116, 140.3183 -21060, 66.02941, 112.9351 -21061, 68.24326, 128.8593 -21062, 66.30423, 126.4124 -21063, 68.49473, 134.9166 -21064, 67.3683, 121.4269 -21065, 70.00791, 135.6339 -21066, 70.18312, 125.7853 -21067, 66.40708, 117.1961 -21068, 67.79402, 122.4405 -21069, 68.33103, 142.9592 -21070, 67.91136, 134.3773 -21071, 68.75045, 116.0658 -21072, 68.82444, 113.8497 -21073, 70.64267, 152.2908 -21074, 65.18174, 111.8634 -21075, 68.51919, 129.3323 -21076, 67.53344, 124.0318 -21077, 68.04198, 125.4507 -21078, 65.82182, 113.6 -21079, 70.27834, 131.2909 -21080, 65.8653, 128.4877 -21081, 66.70285, 125.9423 -21082, 65.88836, 122.3566 -21083, 72.53781, 142.2356 -21084, 67.31225, 117.6954 -21085, 68.85556, 119.367 -21086, 65.30914, 125.201 -21087, 67.56741, 117.1659 -21088, 72.28651, 124.0883 -21089, 69.366, 126.9316 -21090, 71.66938, 158.0299 -21091, 66.91979, 114.0239 -21092, 67.89303, 145.9459 -21093, 66.50206, 138.815 -21094, 67.5214, 115.5644 -21095, 69.21652, 128.049 -21096, 71.08246, 135.7997 -21097, 65.7973, 113.1585 -21098, 68.3417, 106.9982 -21099, 64.74233, 113.5996 -21100, 68.41921, 112.8349 -21101, 68.91514, 124.1732 -21102, 65.84174, 85.98927 -21103, 68.87032, 131.6613 -21104, 64.44608, 103.521 -21105, 67.63533, 116.7036 -21106, 70.20804, 141.9526 -21107, 70.98603, 139.8524 -21108, 68.13106, 128.396 -21109, 66.16887, 127.3745 -21110, 67.05542, 124.551 -21111, 70.75677, 131.1854 -21112, 70.7158, 133.8729 -21113, 67.69017, 117.9684 -21114, 71.53849, 140.8829 -21115, 68.54535, 126.4914 -21116, 65.67176, 120.1838 -21117, 65.99226, 124.6178 -21118, 68.65845, 138.4224 -21119, 66.32469, 105.8594 -21120, 68.44591, 119.3537 -21121, 69.95113, 141.9147 -21122, 65.77165, 111.8653 -21123, 67.068, 120.3728 -21124, 64.69653, 131.7434 -21125, 69.04278, 126.7 -21126, 67.48211, 130.1113 -21127, 66.90722, 115.2313 -21128, 68.75846, 119.4879 -21129, 67.30096, 114.3547 -21130, 69.55268, 124.3859 -21131, 71.05661, 149.0296 -21132, 69.2149, 138.0464 -21133, 67.82442, 122.1716 -21134, 68.71809, 129.9713 -21135, 67.78082, 124.843 -21136, 64.25649, 96.69205 -21137, 68.77435, 145.0052 -21138, 66.37859, 131.3486 -21139, 69.17309, 126.2065 -21140, 70.34987, 133.2638 -21141, 66.73457, 124.768 -21142, 67.61739, 127.7756 -21143, 67.42499, 136.4474 -21144, 68.36893, 125.469 -21145, 70.41579, 140.6165 -21146, 68.06868, 120.743 -21147, 67.28263, 116.5436 -21148, 67.09562, 129.5261 -21149, 67.12164, 116.9111 -21150, 66.69727, 139.9522 -21151, 67.49634, 117.8126 -21152, 70.01384, 135.0441 -21153, 65.78477, 129.2745 -21154, 69.47803, 159.105 -21155, 66.13543, 122.234 -21156, 68.43099, 146.9206 -21157, 67.75061, 125.6399 -21158, 66.95323, 105.2662 -21159, 69.32421, 129.7352 -21160, 68.63523, 117.0937 -21161, 67.52914, 122.7438 -21162, 68.96422, 126.6954 -21163, 66.61586, 115.7427 -21164, 68.37756, 129.5414 -21165, 71.01311, 127.9603 -21166, 68.8398, 123.6722 -21167, 68.2039, 142.9882 -21168, 68.87387, 122.7388 -21169, 68.56397, 120.7988 -21170, 69.64694, 127.4074 -21171, 68.82478, 141.8906 -21172, 64.48848, 129.7648 -21173, 69.09307, 133.503 -21174, 68.432, 115.0608 -21175, 67.72728, 130.8804 -21176, 68.58961, 133.8262 -21177, 67.23444, 128.1166 -21178, 69.16746, 132.765 -21179, 67.57615, 126.0391 -21180, 65.096, 119.3788 -21181, 65.51027, 107.6904 -21182, 71.15893, 123.3434 -21183, 70.48329, 138.2703 -21184, 68.18618, 140.2804 -21185, 66.94975, 135.623 -21186, 67.48547, 114.2417 -21187, 65.02626, 105.0766 -21188, 68.66772, 128.1246 -21189, 68.76668, 120.2954 -21190, 70.72339, 144.1367 -21191, 68.16494, 142.4759 -21192, 65.74529, 129.1718 -21193, 67.60346, 135.049 -21194, 69.27402, 132.8954 -21195, 68.96879, 122.0169 -21196, 68.43776, 150.6044 -21197, 67.71247, 128.9561 -21198, 71.63304, 138.1379 -21199, 64.46515, 102.4585 -21200, 66.91695, 117.4932 -21201, 65.28324, 124.6847 -21202, 69.80506, 139.8376 -21203, 67.50948, 130.1897 -21204, 68.54457, 133.0212 -21205, 67.50779, 113.7693 -21206, 69.02801, 125.2331 -21207, 67.19638, 128.2747 -21208, 69.38252, 136.381 -21209, 67.07315, 137.2259 -21210, 65.53914, 120.1128 -21211, 69.12113, 136.8986 -21212, 68.12859, 123.5782 -21213, 66.18245, 118.4861 -21214, 68.75005, 125.2406 -21215, 69.66247, 133.9579 -21216, 67.87585, 119.188 -21217, 69.51193, 138.2564 -21218, 68.10429, 117.4216 -21219, 68.41818, 140.0468 -21220, 65.02588, 95.09752 -21221, 68.73364, 119.9769 -21222, 68.46417, 127.8286 -21223, 68.95687, 122.36 -21224, 67.64606, 129.6722 -21225, 67.98046, 111.7482 -21226, 67.52579, 127.943 -21227, 68.10182, 116.2066 -21228, 65.37706, 127.1152 -21229, 66.7445, 120.9335 -21230, 66.27875, 111.7677 -21231, 69.7328, 131.9363 -21232, 67.30255, 119.1448 -21233, 69.02553, 129.4502 -21234, 70.08744, 138.438 -21235, 67.5875, 123.9873 -21236, 68.44123, 135.9688 -21237, 67.97198, 123.3787 -21238, 66.10388, 122.6718 -21239, 66.0128, 116.2522 -21240, 67.45078, 139.0873 -21241, 69.63918, 137.3555 -21242, 70.26322, 128.9824 -21243, 71.18245, 134.1429 -21244, 67.48152, 113.786 -21245, 67.30461, 121.5465 -21246, 68.27851, 128.6151 -21247, 67.93965, 129.5938 -21248, 66.34597, 117.4876 -21249, 66.17643, 134.2907 -21250, 64.65454, 116.1862 -21251, 67.54127, 125.4026 -21252, 68.59123, 122.8707 -21253, 63.19682, 109.5683 -21254, 67.87138, 121.2874 -21255, 69.10296, 143.9699 -21256, 69.35396, 136.2498 -21257, 66.69452, 117.4852 -21258, 68.01196, 111.6817 -21259, 65.03661, 104.7919 -21260, 67.43888, 124.3636 -21261, 66.47035, 128.7613 -21262, 70.20849, 144.0743 -21263, 67.13509, 125.9127 -21264, 64.94556, 129.3952 -21265, 68.59608, 118.1328 -21266, 66.23435, 136.462 -21267, 69.86976, 124.5872 -21268, 67.15711, 121.2002 -21269, 66.2651, 124.1129 -21270, 68.35631, 129.7324 -21271, 71.29633, 135.8907 -21272, 70.11197, 139.2857 -21273, 66.10542, 133.4835 -21274, 69.08371, 133.6883 -21275, 67.40367, 128.5047 -21276, 66.85289, 131.739 -21277, 69.20063, 132.4558 -21278, 70.60672, 124.7653 -21279, 68.53661, 121.9863 -21280, 68.93974, 131.5648 -21281, 67.96975, 127.7058 -21282, 65.23482, 104.5786 -21283, 71.6941, 137.807 -21284, 69.24201, 113.2636 -21285, 67.94013, 140.4541 -21286, 69.61292, 132.7728 -21287, 67.27993, 122.6409 -21288, 66.33297, 135.2301 -21289, 66.12205, 109.5588 -21290, 72.21224, 144.4488 -21291, 68.64486, 134.8144 -21292, 66.69156, 126.1919 -21293, 65.73194, 116.6978 -21294, 68.38632, 138.149 -21295, 71.57464, 153.8989 -21296, 71.70436, 130.4351 -21297, 71.22448, 130.8944 -21298, 69.04649, 116.1818 -21299, 69.24498, 131.2336 -21300, 69.31455, 149.1439 -21301, 67.37766, 116.1292 -21302, 65.85673, 120.8833 -21303, 68.3071, 111.1158 -21304, 62.66611, 102.4978 -21305, 66.11815, 124.0832 -21306, 66.10233, 119.1205 -21307, 70.76474, 134.5527 -21308, 67.3541, 126.4415 -21309, 67.29001, 115.4747 -21310, 68.9878, 136.8897 -21311, 67.50241, 129.6194 -21312, 67.80553, 131.8187 -21313, 70.86344, 143.7688 -21314, 66.88387, 134.1093 -21315, 69.60302, 114.8928 -21316, 65.8415, 109.0991 -21317, 68.05408, 140.0282 -21318, 67.79184, 130.6684 -21319, 66.63211, 130.5872 -21320, 68.05862, 130.8255 -21321, 66.37615, 122.9051 -21322, 66.6771, 106.3209 -21323, 63.97165, 125.9937 -21324, 69.12251, 146.0978 -21325, 68.28209, 134.7229 -21326, 68.12163, 149.2238 -21327, 66.18678, 118.8765 -21328, 67.49155, 121.369 -21329, 70.23978, 127.3437 -21330, 69.18802, 119.5174 -21331, 66.98707, 115.3673 -21332, 71.11033, 145.6761 -21333, 68.61714, 128.542 -21334, 66.8577, 127.9222 -21335, 67.07586, 138.2211 -21336, 63.93118, 111.9108 -21337, 65.85939, 113.125 -21338, 69.44418, 139.1515 -21339, 67.8368, 129.6571 -21340, 64.76778, 123.182 -21341, 66.2066, 113.314 -21342, 67.79536, 131.6799 -21343, 72.01784, 124.9024 -21344, 65.20628, 115.5842 -21345, 67.38543, 127.1064 -21346, 66.56993, 115.3937 -21347, 66.03326, 108.599 -21348, 68.54084, 122.4814 -21349, 66.75178, 123.5222 -21350, 71.83647, 140.7706 -21351, 63.58595, 131.2403 -21352, 67.86356, 125.8127 -21353, 69.18172, 135.9835 -21354, 70.22442, 129.4703 -21355, 70.26193, 126.4545 -21356, 68.25391, 131.4638 -21357, 67.64774, 133.374 -21358, 67.60438, 113.665 -21359, 64.18161, 92.72194 -21360, 69.07121, 133.7058 -21361, 67.16346, 119.9669 -21362, 65.77951, 122.1882 -21363, 66.50073, 124.7978 -21364, 63.97477, 113.8485 -21365, 67.69537, 103.4807 -21366, 70.51405, 154.9609 -21367, 69.76942, 133.3499 -21368, 70.56116, 142.826 -21369, 68.60348, 115.6884 -21370, 64.8078, 126.7873 -21371, 70.90317, 130.958 -21372, 66.45704, 120.7458 -21373, 69.81243, 134.6215 -21374, 67.93456, 113.5044 -21375, 68.21735, 122.932 -21376, 70.49535, 141.461 -21377, 67.39105, 106.465 -21378, 71.6752, 139.7622 -21379, 68.59578, 147.415 -21380, 67.0862, 115.6875 -21381, 68.16122, 136.504 -21382, 67.98705, 105.9146 -21383, 64.80826, 114.3374 -21384, 68.38232, 142.4635 -21385, 69.73223, 130.6929 -21386, 65.31482, 110.0279 -21387, 67.93911, 117.1572 -21388, 66.28781, 128.8133 -21389, 65.31992, 157.9292 -21390, 67.56335, 120.957 -21391, 69.33362, 127.7738 -21392, 68.05282, 119.9513 -21393, 68.7317, 130.5724 -21394, 66.24459, 131.6161 -21395, 67.13869, 130.7992 -21396, 64.8849, 115.8741 -21397, 67.27717, 128.8991 -21398, 66.586, 116.0707 -21399, 67.12561, 113.2244 -21400, 65.22732, 115.8697 -21401, 67.58676, 132.6108 -21402, 69.53328, 124.1201 -21403, 68.83049, 141.3701 -21404, 68.31099, 116.924 -21405, 68.74387, 124.9707 -21406, 64.0985, 103.2453 -21407, 70.8389, 150.1694 -21408, 68.9783, 130.9676 -21409, 67.48817, 124.8039 -21410, 69.27081, 124.6497 -21411, 67.12082, 119.5077 -21412, 70.77956, 125.8114 -21413, 67.97148, 111.5771 -21414, 72.82909, 149.1342 -21415, 66.00035, 115.6001 -21416, 66.37328, 127.1567 -21417, 67.24395, 128.6992 -21418, 69.45193, 122.1409 -21419, 70.32167, 133.6321 -21420, 64.85287, 124.4417 -21421, 66.82049, 124.4221 -21422, 67.88258, 124.2948 -21423, 68.26595, 121.0339 -21424, 66.40595, 108.3041 -21425, 69.54769, 148.9234 -21426, 68.91851, 117.4566 -21427, 67.1916, 123.127 -21428, 67.33889, 120.5712 -21429, 67.05347, 120.1048 -21430, 66.71262, 124.3153 -21431, 69.98886, 141.4564 -21432, 71.51013, 139.8831 -21433, 73.19268, 150.9736 -21434, 67.79156, 132.7662 -21435, 68.64126, 132.4578 -21436, 66.17287, 133.4576 -21437, 67.35348, 134.5655 -21438, 67.26831, 123.5621 -21439, 66.43498, 113.6441 -21440, 69.66258, 122.2091 -21441, 67.46824, 107.2974 -21442, 71.53982, 140.1055 -21443, 70.50755, 130.405 -21444, 67.39344, 140.9644 -21445, 68.28771, 142.5192 -21446, 70.85948, 143.5364 -21447, 68.2026, 128.7043 -21448, 71.52565, 142.5129 -21449, 67.68578, 122.5681 -21450, 68.77033, 145.575 -21451, 69.69672, 124.4363 -21452, 69.86332, 132.8198 -21453, 68.11448, 130.3112 -21454, 67.44093, 132.8781 -21455, 64.59419, 103.0731 -21456, 66.89966, 119.9647 -21457, 66.46718, 113.4911 -21458, 68.19723, 124.665 -21459, 69.78449, 137.4408 -21460, 66.84378, 117.16 -21461, 67.60705, 117.721 -21462, 69.81536, 130.9669 -21463, 68.71877, 128.5218 -21464, 69.44319, 119.0987 -21465, 66.78997, 124.5261 -21466, 70.36901, 141.0114 -21467, 68.40678, 128.6087 -21468, 66.17464, 115.9334 -21469, 64.05399, 133.0834 -21470, 66.90763, 128.5777 -21471, 66.08072, 103.0628 -21472, 68.68999, 121.2085 -21473, 66.15716, 121.0179 -21474, 68.64629, 122.4392 -21475, 64.94119, 116.4141 -21476, 68.07015, 137.3806 -21477, 64.00869, 118.3034 -21478, 65.53683, 107.9785 -21479, 67.41471, 121.7855 -21480, 65.74584, 121.5395 -21481, 66.18987, 140.962 -21482, 63.73028, 114.8628 -21483, 67.5378, 107.9156 -21484, 68.83259, 123.8887 -21485, 68.60078, 114.8935 -21486, 70.33758, 135.3466 -21487, 68.06319, 122.375 -21488, 67.31084, 134.7184 -21489, 67.93548, 111.8576 -21490, 70.21616, 124.6681 -21491, 70.22715, 126.5091 -21492, 67.41853, 123.4532 -21493, 69.66876, 126.5893 -21494, 66.51862, 131.9422 -21495, 66.56167, 123.7117 -21496, 65.37204, 125.3946 -21497, 71.0227, 140.9263 -21498, 69.76803, 125.9309 -21499, 69.13129, 124.6745 -21500, 70.11223, 142.237 -21501, 66.65293, 122.3701 -21502, 71.50512, 126.6515 -21503, 67.35973, 133.4416 -21504, 67.0525, 125.5655 -21505, 70.82773, 148.3559 -21506, 68.41937, 125.6235 -21507, 68.65019, 123.9353 -21508, 67.9628, 132.746 -21509, 70.56903, 126.337 -21510, 69.24189, 135.4178 -21511, 67.38822, 140.2362 -21512, 63.09263, 104.4273 -21513, 68.73587, 111.0236 -21514, 67.79277, 142.0958 -21515, 68.54986, 136.4451 -21516, 70.1535, 120.8283 -21517, 70.09971, 126.219 -21518, 67.95659, 134.1742 -21519, 69.44167, 121.8278 -21520, 67.44686, 126.7548 -21521, 69.5806, 131.3823 -21522, 69.63943, 138.8988 -21523, 69.95134, 143.1008 -21524, 66.54229, 129.1494 -21525, 65.47078, 129.3234 -21526, 65.98373, 137.8792 -21527, 67.1234, 123.9595 -21528, 65.06387, 105.1229 -21529, 69.55975, 139.0725 -21530, 68.47409, 124.6217 -21531, 69.93312, 139.2227 -21532, 67.5759, 144.2837 -21533, 66.79037, 126.0623 -21534, 69.56945, 134.6805 -21535, 73.00543, 144.8899 -21536, 68.94047, 124.2216 -21537, 66.71029, 114.4104 -21538, 70.56037, 126.6797 -21539, 66.06623, 121.9 -21540, 72.09895, 144.037 -21541, 67.44827, 119.4643 -21542, 68.97642, 135.795 -21543, 69.04275, 113.957 -21544, 68.66189, 137.4046 -21545, 71.18002, 136.655 -21546, 66.66057, 126.3655 -21547, 63.36463, 110.6809 -21548, 69.34799, 125.2128 -21549, 69.77767, 135.8281 -21550, 69.07072, 130.9719 -21551, 68.32296, 118.1762 -21552, 66.55968, 118.5975 -21553, 68.37761, 112.1167 -21554, 65.98221, 115.1319 -21555, 63.25998, 110.1988 -21556, 71.62632, 153.9411 -21557, 66.09519, 98.68208 -21558, 67.48908, 116.7462 -21559, 70.30231, 124.28 -21560, 64.70216, 119.9535 -21561, 64.77568, 101.9952 -21562, 66.64032, 119.5377 -21563, 70.55327, 126.3116 -21564, 67.87381, 126.972 -21565, 65.91455, 113.3049 -21566, 69.77502, 125.1068 -21567, 66.139, 107.6645 -21568, 65.92413, 125.8118 -21569, 69.6475, 131.9709 -21570, 68.14729, 124.0205 -21571, 67.74068, 113.6562 -21572, 68.11275, 106.676 -21573, 68.20793, 113.7575 -21574, 68.37827, 123.0314 -21575, 67.82451, 130.8329 -21576, 67.48875, 111.5242 -21577, 69.68654, 142.2781 -21578, 69.65756, 142.6607 -21579, 70.94824, 134.3418 -21580, 68.7831, 121.5774 -21581, 69.0255, 135.5666 -21582, 68.53275, 151.8248 -21583, 65.24397, 139.6435 -21584, 68.75415, 122.4198 -21585, 66.91508, 118.2568 -21586, 68.90378, 143.5003 -21587, 64.45659, 137.1951 -21588, 69.37774, 133.934 -21589, 69.76118, 106.7714 -21590, 67.73498, 132.2829 -21591, 65.93122, 136.2363 -21592, 72.06156, 145.1228 -21593, 69.92008, 139.7968 -21594, 68.01618, 121.4656 -21595, 70.62601, 146.913 -21596, 65.42178, 112.1659 -21597, 68.50672, 139.005 -21598, 69.48629, 128.6752 -21599, 65.57785, 136.1471 -21600, 67.95425, 122.3756 -21601, 68.9238, 137.9993 -21602, 64.5782, 113.4876 -21603, 69.22296, 137.6336 -21604, 65.8112, 122.3264 -21605, 68.38674, 122.2001 -21606, 68.064, 123.0604 -21607, 71.89949, 144.9726 -21608, 66.75955, 113.9546 -21609, 66.26364, 111.5726 -21610, 69.12286, 121.6069 -21611, 71.05851, 132.4697 -21612, 67.82703, 134.8738 -21613, 66.1189, 130.9344 -21614, 67.76657, 123.0486 -21615, 66.34736, 129.4624 -21616, 69.88206, 132.1693 -21617, 68.8186, 116.2218 -21618, 69.22245, 130.6511 -21619, 69.56448, 149.2076 -21620, 65.74056, 129.3787 -21621, 66.94081, 129.4569 -21622, 66.44573, 128.19 -21623, 68.4432, 137.5434 -21624, 67.98349, 130.0934 -21625, 68.25542, 128.3862 -21626, 67.17137, 115.7127 -21627, 66.57049, 137.5753 -21628, 65.00255, 127.5117 -21629, 68.08759, 132.0304 -21630, 68.04764, 140.0717 -21631, 69.45338, 147.4061 -21632, 67.9968, 110.0948 -21633, 63.71092, 103.5775 -21634, 67.26281, 132.7455 -21635, 66.4024, 117.3694 -21636, 63.39192, 109.587 -21637, 67.72768, 118.9536 -21638, 66.803, 119.5927 -21639, 67.10602, 104.2534 -21640, 67.28255, 128.7274 -21641, 66.92397, 111.4987 -21642, 69.27156, 142.0013 -21643, 69.82977, 150.7596 -21644, 67.13762, 115.8561 -21645, 68.9154, 122.9638 -21646, 68.58518, 118.3007 -21647, 67.44759, 110.2889 -21648, 68.28475, 135.5616 -21649, 66.59309, 133.2853 -21650, 69.66864, 125.674 -21651, 66.48926, 127.8714 -21652, 66.0901, 124.6678 -21653, 68.39518, 128.0957 -21654, 70.80442, 130.4059 -21655, 70.79288, 124.7995 -21656, 66.19153, 144.743 -21657, 69.06036, 115.5577 -21658, 68.21507, 129.3545 -21659, 65.55386, 118.7886 -21660, 68.80277, 116.4346 -21661, 69.1402, 119.6141 -21662, 68.15536, 129.5781 -21663, 68.42978, 134.0208 -21664, 71.79676, 147.6642 -21665, 68.11027, 145.6245 -21666, 64.77343, 138.189 -21667, 68.49853, 114.9544 -21668, 68.55531, 146.7026 -21669, 67.41253, 130.7003 -21670, 71.11461, 153.6546 -21671, 66.74425, 129.3251 -21672, 68.39703, 131.2146 -21673, 69.25426, 139.9834 -21674, 67.91866, 136.0479 -21675, 66.60066, 131.2614 -21676, 67.43294, 126.1017 -21677, 69.11285, 147.8694 -21678, 69.6757, 134.3107 -21679, 68.41421, 146.046 -21680, 65.50774, 100.9124 -21681, 69.76777, 137.657 -21682, 70.67766, 141.3048 -21683, 66.20366, 129.6357 -21684, 65.94018, 100.974 -21685, 71.3988, 129.6586 -21686, 71.26908, 149.5428 -21687, 65.25052, 135.2581 -21688, 70.22019, 129.3704 -21689, 67.46231, 121.088 -21690, 65.38827, 125.245 -21691, 71.06891, 151.2576 -21692, 70.64691, 149.0675 -21693, 65.94902, 125.9638 -21694, 69.02074, 128.0814 -21695, 70.46626, 151.3353 -21696, 68.28099, 121.4549 -21697, 67.90092, 146.1333 -21698, 66.4104, 125.4014 -21699, 68.78832, 128.2448 -21700, 64.64202, 117.7037 -21701, 64.62019, 126.3926 -21702, 68.67167, 106.6081 -21703, 68.10937, 128.4228 -21704, 66.32562, 128.0712 -21705, 68.69826, 126.9703 -21706, 62.48237, 100.3418 -21707, 68.46424, 133.7977 -21708, 65.35569, 125.5137 -21709, 65.85849, 129.4713 -21710, 66.3082, 126.7998 -21711, 65.70911, 113.7976 -21712, 65.6121, 131.8419 -21713, 67.63331, 135.7273 -21714, 66.74792, 123.7179 -21715, 70.65296, 157.9704 -21716, 68.17586, 116.5777 -21717, 69.85767, 136.0274 -21718, 66.60797, 119.7939 -21719, 69.08158, 145.2811 -21720, 67.16475, 120.9003 -21721, 66.35066, 114.9647 -21722, 66.59299, 129.3826 -21723, 65.04067, 101.3936 -21724, 68.30625, 124.8439 -21725, 67.6115, 129.8552 -21726, 69.20628, 146.9622 -21727, 70.44549, 146.535 -21728, 70.91437, 136.5757 -21729, 65.42417, 133.412 -21730, 67.54349, 139.8108 -21731, 67.24006, 129.7754 -21732, 68.186, 139.256 -21733, 66.55056, 104.7859 -21734, 68.61863, 141.8655 -21735, 68.3969, 138.2968 -21736, 69.25466, 123.9714 -21737, 66.51789, 122.2101 -21738, 69.53102, 130.8152 -21739, 67.84335, 134.6077 -21740, 67.73899, 123.6453 -21741, 69.10056, 133.7242 -21742, 67.22282, 136.6474 -21743, 70.14077, 117.6351 -21744, 66.63163, 127.9701 -21745, 69.45646, 136.697 -21746, 69.02288, 157.9236 -21747, 69.04845, 144.0225 -21748, 65.98766, 115.1328 -21749, 68.32236, 137.4591 -21750, 69.06911, 130.3359 -21751, 67.6674, 128.978 -21752, 67.94975, 129.5573 -21753, 68.79124, 110.5886 -21754, 68.35343, 138.2477 -21755, 68.31792, 137.2072 -21756, 69.47505, 131.5983 -21757, 67.39877, 108.4221 -21758, 67.90904, 129.8693 -21759, 69.51989, 142.6941 -21760, 67.83781, 148.7128 -21761, 65.60406, 115.2958 -21762, 68.8712, 135.0711 -21763, 67.41876, 114.7234 -21764, 66.89864, 112.6633 -21765, 67.05157, 111.2213 -21766, 68.65952, 126.4751 -21767, 68.82781, 124.8432 -21768, 68.27979, 132.045 -21769, 67.24388, 126.8469 -21770, 65.70125, 118.0533 -21771, 68.53534, 142.5502 -21772, 68.97033, 135.912 -21773, 69.42265, 123.1637 -21774, 65.89796, 116.9465 -21775, 67.48926, 121.2539 -21776, 68.24839, 126.698 -21777, 69.9615, 142.6772 -21778, 69.1349, 133.9896 -21779, 65.7668, 114.8528 -21780, 69.31519, 132.0639 -21781, 67.68043, 112.7006 -21782, 65.7642, 105.172 -21783, 68.65969, 107.7614 -21784, 72.48764, 132.3992 -21785, 64.78256, 110.153 -21786, 70.4841, 159.2503 -21787, 69.67148, 143.2815 -21788, 65.12354, 134.8383 -21789, 68.17589, 135.8612 -21790, 68.75037, 129.4885 -21791, 67.50063, 144.4117 -21792, 66.18238, 115.3209 -21793, 66.93648, 142.2417 -21794, 67.71915, 134.6098 -21795, 66.15708, 124.7595 -21796, 68.60607, 121.8448 -21797, 64.407, 116.1544 -21798, 65.95004, 110.1839 -21799, 69.6538, 107.6804 -21800, 67.30606, 131.0374 -21801, 69.65916, 124.3081 -21802, 68.25471, 144.5448 -21803, 67.50858, 135.5885 -21804, 68.8211, 142.21 -21805, 67.96832, 132.0779 -21806, 66.09807, 113.2875 -21807, 68.6238, 134.5527 -21808, 66.2588, 131.9464 -21809, 65.78144, 121.6553 -21810, 63.68103, 113.8491 -21811, 68.96781, 117.3037 -21812, 69.61369, 120.1962 -21813, 67.9393, 131.376 -21814, 72.12761, 141.5293 -21815, 66.17765, 108.006 -21816, 64.44865, 113.84 -21817, 66.9381, 124.7886 -21818, 69.72663, 138.5469 -21819, 66.50238, 144.8476 -21820, 67.66821, 122.3427 -21821, 68.21966, 127.736 -21822, 66.23247, 107.7751 -21823, 68.48757, 111.7849 -21824, 66.72098, 123.6466 -21825, 67.26512, 110.1107 -21826, 67.97088, 127.9019 -21827, 71.33619, 141.8512 -21828, 67.42918, 123.1017 -21829, 69.16961, 120.2536 -21830, 69.73638, 127.9477 -21831, 66.88932, 118.3424 -21832, 67.92182, 102.3229 -21833, 68.65846, 123.3907 -21834, 68.9523, 124.4188 -21835, 63.26116, 131.8104 -21836, 68.1796, 139.1423 -21837, 69.04181, 137.5828 -21838, 66.5111, 116.7547 -21839, 69.76603, 127.3629 -21840, 68.24223, 124.3347 -21841, 68.84887, 136.3807 -21842, 67.04484, 127.0678 -21843, 70.93046, 126.9017 -21844, 68.51393, 136.1465 -21845, 71.06022, 111.4244 -21846, 65.47707, 106.8859 -21847, 68.63389, 114.5655 -21848, 68.18722, 118.3686 -21849, 67.06874, 123.2887 -21850, 67.62436, 129.2202 -21851, 68.97729, 130.823 -21852, 67.66502, 117.9736 -21853, 69.96163, 120.0183 -21854, 64.63866, 108.6377 -21855, 66.42798, 116.0001 -21856, 67.91525, 103.1791 -21857, 66.84693, 116.1444 -21858, 66.66734, 129.0009 -21859, 68.74944, 150.8735 -21860, 66.35019, 124.4368 -21861, 68.74957, 131.2495 -21862, 67.15931, 110.9528 -21863, 68.07741, 122.6487 -21864, 73.25176, 148.2284 -21865, 67.62804, 122.5984 -21866, 70.98337, 122.6745 -21867, 68.14991, 122.0117 -21868, 68.73907, 126.2233 -21869, 65.52461, 113.7172 -21870, 65.35162, 110.6449 -21871, 64.35555, 113.8107 -21872, 68.55885, 127.5331 -21873, 69.0529, 133.1832 -21874, 72.60485, 143.9177 -21875, 69.48058, 115.4622 -21876, 66.25333, 113.0559 -21877, 65.40529, 109.6595 -21878, 70.28061, 119.1562 -21879, 70.37019, 116.2454 -21880, 65.48775, 125.4251 -21881, 66.53455, 123.3583 -21882, 67.5823, 121.7252 -21883, 65.69418, 125.5996 -21884, 68.03737, 134.0532 -21885, 68.47451, 123.5137 -21886, 65.23306, 116.1786 -21887, 67.86301, 125.1315 -21888, 65.79717, 123.5802 -21889, 71.44975, 133.3758 -21890, 70.84018, 136.3143 -21891, 71.18982, 141.107 -21892, 66.03097, 126.5347 -21893, 71.37742, 125.9633 -21894, 70.57756, 137.1181 -21895, 68.2458, 128.0182 -21896, 68.22017, 141.7363 -21897, 65.06244, 106.6877 -21898, 66.90634, 108.0455 -21899, 63.03862, 115.8658 -21900, 67.06774, 152.2417 -21901, 65.30894, 106.7987 -21902, 65.06679, 107.6525 -21903, 67.39673, 124.6423 -21904, 69.06112, 122.2679 -21905, 69.12434, 132.9822 -21906, 68.47088, 130.1302 -21907, 70.21144, 143.2455 -21908, 70.97244, 143.2283 -21909, 67.11423, 122.2441 -21910, 70.05116, 132.2902 -21911, 68.72983, 131.9808 -21912, 65.39469, 129.8896 -21913, 71.11058, 132.006 -21914, 63.52038, 122.4025 -21915, 68.03493, 121.5552 -21916, 64.8839, 130.9255 -21917, 68.16535, 123.2502 -21918, 69.34209, 124.7472 -21919, 69.55427, 112.586 -21920, 69.37897, 123.8323 -21921, 67.90715, 124.8204 -21922, 69.78616, 119.2747 -21923, 70.06486, 123.9407 -21924, 67.26241, 133.3415 -21925, 63.73139, 121.2644 -21926, 68.32099, 129.2511 -21927, 66.39081, 142.8419 -21928, 70.03989, 137.0893 -21929, 66.24433, 135.7157 -21930, 68.25743, 117.7142 -21931, 70.79829, 130.2646 -21932, 67.11709, 116.0134 -21933, 65.93811, 124.2235 -21934, 67.55474, 97.14789 -21935, 64.78244, 124.6147 -21936, 68.45511, 118.3446 -21937, 68.60516, 130.4597 -21938, 68.18953, 135.0554 -21939, 64.24981, 113.7089 -21940, 67.42016, 121.1719 -21941, 69.64799, 129.1334 -21942, 68.76641, 137.5208 -21943, 67.47039, 116.7224 -21944, 66.34719, 102.2607 -21945, 65.27345, 94.26051 -21946, 68.49649, 130.6183 -21947, 66.77663, 128.4905 -21948, 68.62434, 136.1352 -21949, 66.97798, 134.398 -21950, 74.42744, 141.7416 -21951, 68.16821, 110.4841 -21952, 69.58597, 134.9162 -21953, 64.67803, 128.0545 -21954, 69.98681, 130.8804 -21955, 68.74272, 136.6016 -21956, 67.56099, 137.7014 -21957, 63.59232, 107.4139 -21958, 69.05534, 151.567 -21959, 66.83137, 135.1775 -21960, 69.25699, 132.5855 -21961, 70.10878, 128.1379 -21962, 65.74458, 118.6861 -21963, 68.92381, 132.023 -21964, 63.45696, 101.8629 -21965, 66.46407, 114.2272 -21966, 65.32677, 112.1856 -21967, 70.28537, 127.3897 -21968, 73.62336, 145.5589 -21969, 72.06438, 133.0115 -21970, 63.99289, 118.1347 -21971, 69.13512, 125.715 -21972, 69.11398, 115.0134 -21973, 68.8397, 119.2542 -21974, 68.42829, 125.7109 -21975, 69.11164, 126.3794 -21976, 67.75382, 133.1108 -21977, 68.28205, 130.0354 -21978, 69.79824, 140.2748 -21979, 67.80131, 125.3779 -21980, 66.92047, 117.4567 -21981, 65.41043, 110.3167 -21982, 67.2104, 118.1644 -21983, 69.23036, 104.0257 -21984, 69.02497, 127.7908 -21985, 65.27684, 145.1158 -21986, 69.48104, 139.7665 -21987, 70.35139, 148.13 -21988, 66.72914, 110.6124 -21989, 69.18346, 124.9384 -21990, 69.39009, 117.0886 -21991, 65.10415, 122.9297 -21992, 70.42201, 132.063 -21993, 64.20998, 124.7386 -21994, 66.39326, 110.6721 -21995, 67.99051, 130.6448 -21996, 66.54414, 127.2514 -21997, 67.85205, 120.743 -21998, 68.3302, 147.7192 -21999, 67.70322, 116.5958 -22000, 67.08778, 126.0409 -22001, 67.45991, 131.0766 -22002, 64.53855, 103.166 -22003, 68.77395, 120.2698 -22004, 65.27979, 120.4821 -22005, 69.89596, 114.4375 -22006, 66.11113, 121.7524 -22007, 69.19728, 138.7705 -22008, 68.62235, 127.2493 -22009, 70.33159, 152.9261 -22010, 69.44904, 126.7259 -22011, 70.18822, 153.6557 -22012, 68.18276, 135.8523 -22013, 64.73962, 108.7094 -22014, 69.52012, 132.428 -22015, 68.40112, 115.1738 -22016, 68.4364, 121.9109 -22017, 69.7165, 113.6107 -22018, 65.8825, 117.5802 -22019, 67.92953, 105.9806 -22020, 67.02377, 130.0163 -22021, 68.48076, 122.6201 -22022, 70.66957, 126.6477 -22023, 67.61492, 134.6768 -22024, 73.58866, 153.0783 -22025, 66.98903, 119.4068 -22026, 70.73654, 151.4389 -22027, 70.82435, 140.2097 -22028, 67.78555, 110.19 -22029, 67.01787, 127.3742 -22030, 67.07288, 137.5581 -22031, 69.53889, 129.2925 -22032, 64.16684, 128.8207 -22033, 66.59597, 117.7506 -22034, 66.02727, 121.3984 -22035, 69.90695, 127.6222 -22036, 66.31378, 128.1986 -22037, 71.0924, 157.3921 -22038, 69.1847, 130.0327 -22039, 69.53601, 139.6967 -22040, 69.43737, 126.2871 -22041, 66.46531, 118.2134 -22042, 69.60722, 130.2072 -22043, 68.40154, 126.3804 -22044, 66.58472, 124.3242 -22045, 67.65364, 132.7654 -22046, 65.62466, 132.5228 -22047, 67.55476, 138.0942 -22048, 67.67129, 129.3039 -22049, 71.35689, 135.5968 -22050, 67.23927, 145.4296 -22051, 66.4871, 119.4681 -22052, 69.16735, 124.7664 -22053, 69.7819, 117.0658 -22054, 66.7397, 123.7996 -22055, 70.68935, 140.8345 -22056, 67.5828, 124.7307 -22057, 66.10625, 128.8248 -22058, 70.29985, 153.2173 -22059, 69.77906, 141.0626 -22060, 67.07765, 126.0482 -22061, 65.67584, 121.7947 -22062, 65.93844, 126.4153 -22063, 71.89509, 127.5677 -22064, 67.92099, 109.7213 -22065, 70.56492, 143.6368 -22066, 64.88248, 107.027 -22067, 71.8284, 131.3314 -22068, 68.76645, 127.0974 -22069, 66.38695, 107.555 -22070, 66.21688, 118.3435 -22071, 70.84942, 138.4765 -22072, 68.79234, 125.5644 -22073, 69.99779, 131.4314 -22074, 64.83696, 142.2888 -22075, 66.68908, 130.1091 -22076, 64.81045, 115.7425 -22077, 71.13578, 141.1345 -22078, 68.08155, 124.9248 -22079, 66.47646, 121.6753 -22080, 70.8782, 153.3804 -22081, 67.83647, 116.1852 -22082, 68.67074, 136.5908 -22083, 69.34659, 131.303 -22084, 67.01988, 112.523 -22085, 63.74803, 103.3567 -22086, 68.12093, 113.5474 -22087, 71.9073, 153.8792 -22088, 68.39398, 130.7981 -22089, 69.89219, 143.0116 -22090, 67.92004, 132.341 -22091, 69.5779, 145.1589 -22092, 67.4598, 122.5588 -22093, 67.62244, 123.0214 -22094, 67.1134, 126.3654 -22095, 68.88195, 116.6333 -22096, 66.77155, 136.6336 -22097, 66.44019, 130.1774 -22098, 68.75179, 130.6616 -22099, 70.97369, 129.0189 -22100, 67.69709, 124.2238 -22101, 67.55783, 117.3321 -22102, 69.39296, 132.2173 -22103, 66.57, 126.0029 -22104, 68.4234, 114.5145 -22105, 66.2871, 131.8304 -22106, 67.95212, 128.0529 -22107, 67.00587, 124.613 -22108, 66.13305, 123.0369 -22109, 67.94284, 130.1582 -22110, 66.8761, 135.8472 -22111, 67.88451, 131.2437 -22112, 64.79759, 116.9411 -22113, 67.83546, 134.9498 -22114, 68.28544, 117.8027 -22115, 66.99732, 136.9152 -22116, 66.70636, 133.6125 -22117, 67.99473, 111.8341 -22118, 68.56614, 133.2531 -22119, 63.70894, 125.1008 -22120, 67.39951, 134.5424 -22121, 67.68099, 140.1474 -22122, 64.98122, 108.9518 -22123, 69.4232, 123.6302 -22124, 70.00146, 149.3087 -22125, 71.36114, 144.8643 -22126, 66.60996, 121.845 -22127, 67.09436, 115.8078 -22128, 70.12298, 145.3622 -22129, 66.03876, 135.1259 -22130, 66.27712, 129.0541 -22131, 67.62592, 131.2538 -22132, 65.95321, 109.7856 -22133, 68.48038, 130.1038 -22134, 65.65352, 118.0966 -22135, 72.12181, 147.585 -22136, 67.40851, 146.4429 -22137, 69.88715, 134.4733 -22138, 69.27105, 154.4557 -22139, 71.93958, 152.5295 -22140, 66.98862, 115.2594 -22141, 69.88329, 127.6165 -22142, 69.06831, 142.8685 -22143, 68.37576, 146.4785 -22144, 72.36275, 141.3837 -22145, 65.32142, 96.822 -22146, 67.06859, 133.4834 -22147, 68.08786, 124.3863 -22148, 71.55388, 136.8521 -22149, 69.55143, 119.9292 -22150, 68.24976, 132.8025 -22151, 69.17304, 120.0536 -22152, 70.54788, 136.8571 -22153, 67.5523, 115.2183 -22154, 66.68536, 135.8133 -22155, 66.47161, 121.4223 -22156, 68.24878, 143.2844 -22157, 70.94761, 133.8643 -22158, 67.82211, 121.5944 -22159, 66.99944, 123.4547 -22160, 69.05494, 128.4013 -22161, 67.15164, 119.0471 -22162, 69.05272, 147.0719 -22163, 67.94938, 113.3519 -22164, 70.70493, 150.7817 -22165, 65.96851, 115.2572 -22166, 65.66304, 104.3101 -22167, 67.91282, 121.6957 -22168, 68.97438, 122.827 -22169, 69.66398, 133.2072 -22170, 66.46308, 147.6569 -22171, 64.40454, 119.04 -22172, 67.10339, 127.6042 -22173, 68.39658, 110.7311 -22174, 65.04915, 123.1842 -22175, 65.33805, 133.3083 -22176, 69.8495, 128.4304 -22177, 70.79219, 116.7218 -22178, 69.86252, 142.5929 -22179, 64.08728, 114.6547 -22180, 67.75657, 127.4783 -22181, 66.57296, 125.5804 -22182, 65.95543, 119.1968 -22183, 67.27865, 124.621 -22184, 63.76783, 119.2237 -22185, 65.67411, 133.6584 -22186, 68.27234, 139.0601 -22187, 66.29509, 122.8579 -22188, 66.30592, 118.0936 -22189, 65.17403, 125.2493 -22190, 65.36657, 118.4034 -22191, 70.09668, 134.7715 -22192, 67.49154, 135.2386 -22193, 71.89162, 135.7549 -22194, 70.80254, 139.8002 -22195, 68.10091, 95.27771 -22196, 65.66029, 132.4741 -22197, 65.09694, 123.0223 -22198, 66.33209, 110.2627 -22199, 68.60514, 139.9802 -22200, 66.0317, 101.1566 -22201, 69.62638, 141.8247 -22202, 67.93519, 138.7177 -22203, 66.51344, 117.3527 -22204, 68.79437, 129.367 -22205, 69.85071, 133.4628 -22206, 68.56043, 126.5705 -22207, 65.15652, 110.9314 -22208, 67.67203, 121.017 -22209, 71.47108, 133.0386 -22210, 67.893, 125.5458 -22211, 65.36284, 122.8713 -22212, 68.20304, 126.67 -22213, 64.78973, 113.3012 -22214, 66.79185, 133.5896 -22215, 68.86132, 124.0532 -22216, 66.84413, 132.7674 -22217, 67.68374, 122.9456 -22218, 69.02992, 116.8819 -22219, 68.4131, 145.2036 -22220, 68.72312, 127.6754 -22221, 69.07539, 119.1678 -22222, 64.79406, 119.185 -22223, 68.20087, 125.924 -22224, 70.01234, 131.9024 -22225, 68.42995, 132.477 -22226, 66.58476, 110.4114 -22227, 68.27708, 109.3802 -22228, 68.22959, 153.4104 -22229, 64.99611, 124.0648 -22230, 69.04964, 137.6179 -22231, 66.26221, 124.3251 -22232, 69.57317, 148.4155 -22233, 71.58799, 128.2996 -22234, 64.67557, 122.1539 -22235, 64.75449, 126.3476 -22236, 68.73197, 133.4295 -22237, 67.67754, 141.1335 -22238, 67.92076, 125.3999 -22239, 66.36387, 115.1711 -22240, 64.70157, 123.7421 -22241, 66.85773, 131.6002 -22242, 67.53255, 129.7075 -22243, 66.06081, 125.8923 -22244, 68.08335, 131.1495 -22245, 70.50547, 131.9548 -22246, 65.92983, 122.5229 -22247, 69.70668, 125.4368 -22248, 70.89685, 150.7064 -22249, 67.66278, 115.7167 -22250, 70.95408, 136.2602 -22251, 71.28145, 140.2041 -22252, 68.15606, 147.0766 -22253, 67.59876, 113.8641 -22254, 67.48336, 136.762 -22255, 68.24318, 118.4243 -22256, 66.80036, 135.7861 -22257, 67.16489, 121.1942 -22258, 69.37906, 129.4147 -22259, 68.19199, 127.1902 -22260, 67.68815, 133.5415 -22261, 70.95609, 134.0273 -22262, 70.27042, 133.8297 -22263, 66.56488, 135.5664 -22264, 70.52776, 140.0465 -22265, 69.02233, 131.4256 -22266, 72.34913, 140.7812 -22267, 67.03635, 124.2948 -22268, 69.90606, 143.0028 -22269, 71.44901, 130.5197 -22270, 68.37323, 121.8766 -22271, 66.7327, 107.9074 -22272, 64.94584, 104.0162 -22273, 66.81655, 107.7306 -22274, 69.28764, 122.0171 -22275, 69.39732, 116.0082 -22276, 65.91704, 116.9297 -22277, 64.86837, 115.2735 -22278, 63.55164, 119.2598 -22279, 70.44002, 149.2576 -22280, 68.09522, 117.641 -22281, 68.10961, 126.8252 -22282, 67.27297, 146.7294 -22283, 64.1425, 91.37972 -22284, 64.02389, 92.55327 -22285, 66.53104, 139.6883 -22286, 66.97558, 125.6853 -22287, 70.25009, 142.8251 -22288, 68.34103, 121.3014 -22289, 67.49306, 124.8288 -22290, 68.9249, 136.115 -22291, 68.2984, 139.7633 -22292, 67.57662, 122.0482 -22293, 68.30339, 113.878 -22294, 64.49314, 136.2782 -22295, 70.97046, 138.3778 -22296, 66.36863, 134.281 -22297, 63.76287, 112.4485 -22298, 67.57329, 119.1817 -22299, 67.92684, 141.4374 -22300, 66.16697, 113.6853 -22301, 66.34329, 135.2088 -22302, 69.95923, 139.5936 -22303, 68.90018, 124.9902 -22304, 68.56348, 136.245 -22305, 68.30793, 141.0644 -22306, 69.43004, 133.9346 -22307, 67.64037, 122.9113 -22308, 71.4182, 132.1873 -22309, 69.04964, 142.7013 -22310, 67.39319, 121.8913 -22311, 69.45379, 129.8532 -22312, 63.44375, 109.1048 -22313, 68.43154, 135.2451 -22314, 65.74265, 118.765 -22315, 69.89797, 139.0575 -22316, 69.04994, 126.7366 -22317, 70.71294, 118.9324 -22318, 66.53418, 113.3842 -22319, 66.23135, 111.8218 -22320, 68.21149, 121.5553 -22321, 65.49434, 117.2374 -22322, 66.9114, 137.1524 -22323, 64.09729, 112.0671 -22324, 68.66012, 129.1182 -22325, 70.23702, 130.4602 -22326, 64.64689, 116.0481 -22327, 66.20455, 119.7629 -22328, 68.73289, 118.1634 -22329, 67.14691, 143.8829 -22330, 65.14466, 128.5075 -22331, 64.89881, 118.0226 -22332, 68.72325, 126.7209 -22333, 68.02931, 127.2642 -22334, 65.49921, 138.8997 -22335, 70.07897, 124.0463 -22336, 65.80961, 122.0785 -22337, 68.17208, 126.3151 -22338, 68.34963, 116.8118 -22339, 70.21958, 133.1982 -22340, 68.84447, 135.5874 -22341, 67.94979, 121.2596 -22342, 65.27381, 105.3339 -22343, 66.23461, 126.2458 -22344, 67.1436, 111.9571 -22345, 65.90468, 126.1104 -22346, 69.99086, 147.0435 -22347, 65.17115, 122.095 -22348, 69.63168, 149.5493 -22349, 66.90136, 127.7358 -22350, 64.91721, 127.0199 -22351, 71.97009, 144.7114 -22352, 65.46509, 114.3207 -22353, 69.56498, 142.8489 -22354, 68.3429, 136.2659 -22355, 63.43363, 130.6775 -22356, 65.46842, 122.375 -22357, 67.08889, 111.5552 -22358, 69.81623, 133.9541 -22359, 67.95191, 124.754 -22360, 69.45766, 123.6822 -22361, 66.40296, 126.6477 -22362, 68.39926, 122.2508 -22363, 68.96552, 122.0338 -22364, 70.89678, 159.438 -22365, 67.65672, 145.5204 -22366, 67.53701, 120.4889 -22367, 66.81162, 118.2279 -22368, 69.88334, 133.8676 -22369, 68.6168, 134.1446 -22370, 67.45962, 122.1682 -22371, 70.80403, 144.2832 -22372, 67.18316, 135.5907 -22373, 68.50765, 134.9876 -22374, 68.76787, 128.1724 -22375, 68.43434, 126.9071 -22376, 66.47823, 111.5383 -22377, 67.34436, 121.6583 -22378, 65.02414, 129.485 -22379, 67.19022, 111.6239 -22380, 68.52752, 114.7147 -22381, 68.88508, 139.316 -22382, 66.13478, 114.642 -22383, 67.98273, 132.5035 -22384, 69.229, 123.9145 -22385, 69.38501, 119.8229 -22386, 68.09481, 122.3788 -22387, 68.35242, 138.5489 -22388, 68.641, 125.5334 -22389, 70.81774, 123.9536 -22390, 67.41551, 146.1271 -22391, 70.62572, 144.159 -22392, 66.74351, 118.2665 -22393, 70.06192, 124.4469 -22394, 67.44022, 140.4945 -22395, 67.20582, 112.23 -22396, 68.96137, 121.5742 -22397, 67.16343, 118.3616 -22398, 69.11617, 127.4023 -22399, 67.19284, 119.2573 -22400, 70.04124, 127.3701 -22401, 65.39474, 118.9921 -22402, 69.78766, 136.6437 -22403, 65.78283, 106.2273 -22404, 70.85273, 136.7051 -22405, 67.26176, 114.9494 -22406, 65.82405, 117.3282 -22407, 67.87583, 118.4041 -22408, 68.89097, 131.2082 -22409, 68.26679, 146.8878 -22410, 69.18241, 106.3253 -22411, 70.00856, 126.6624 -22412, 67.79094, 130.9155 -22413, 71.07725, 142.6734 -22414, 68.53121, 125.742 -22415, 70.69622, 130.7612 -22416, 68.34285, 122.5753 -22417, 67.88412, 131.1011 -22418, 69.09173, 119.5692 -22419, 64.19111, 131.5028 -22420, 65.58191, 114.5981 -22421, 67.00245, 135.268 -22422, 72.50619, 141.3209 -22423, 67.29625, 123.9061 -22424, 64.37806, 122.5322 -22425, 66.53719, 106.8997 -22426, 66.73451, 120.6642 -22427, 67.1243, 126.1548 -22428, 68.93399, 141.4405 -22429, 68.1547, 121.1812 -22430, 64.69305, 105.483 -22431, 70.17224, 135.2665 -22432, 65.44791, 119.2957 -22433, 66.75949, 133.259 -22434, 72.58158, 159.1321 -22435, 66.85111, 120.6395 -22436, 67.85314, 132.4666 -22437, 66.56029, 115.992 -22438, 66.60117, 105.015 -22439, 68.16608, 137.8016 -22440, 68.02612, 131.4764 -22441, 70.43453, 134.9766 -22442, 70.448, 122.5178 -22443, 66.79366, 121.7954 -22444, 67.93008, 104.9369 -22445, 67.53134, 120.2005 -22446, 64.0635, 110.7893 -22447, 67.46311, 122.3789 -22448, 65.64829, 106.5113 -22449, 65.50176, 127.0283 -22450, 65.19088, 137.0147 -22451, 73.55973, 143.8236 -22452, 67.48872, 128.3561 -22453, 71.66711, 136.453 -22454, 66.5003, 134.2579 -22455, 70.47009, 134.5955 -22456, 68.77001, 104.3631 -22457, 66.6715, 133.7417 -22458, 66.8153, 119.2792 -22459, 67.02357, 146.3363 -22460, 67.20076, 133.7343 -22461, 70.29408, 122.478 -22462, 67.91383, 130.3713 -22463, 65.94586, 106.4359 -22464, 67.94159, 127.6529 -22465, 68.59362, 121.6743 -22466, 67.31884, 102.4131 -22467, 69.48282, 132.2356 -22468, 67.43331, 102.8806 -22469, 68.54895, 127.8072 -22470, 67.08363, 123.5613 -22471, 68.71345, 123.6214 -22472, 74.51784, 146.9867 -22473, 71.11623, 126.5249 -22474, 66.6034, 132.068 -22475, 65.16296, 131.9835 -22476, 67.40019, 119.562 -22477, 70.16146, 129.2907 -22478, 65.61241, 125.0266 -22479, 69.34532, 142.6343 -22480, 70.28985, 120.4244 -22481, 63.28424, 102.8488 -22482, 67.56905, 138.245 -22483, 64.16839, 117.9972 -22484, 68.38401, 113.6476 -22485, 63.44102, 105.99 -22486, 70.16228, 152.0325 -22487, 67.14157, 119.621 -22488, 67.3811, 134.1843 -22489, 71.23103, 135.0203 -22490, 71.63547, 135.9923 -22491, 69.82003, 141.106 -22492, 63.77542, 117.014 -22493, 68.54253, 133.6109 -22494, 64.10125, 112.2048 -22495, 67.39109, 142.0633 -22496, 69.56071, 117.9541 -22497, 67.46663, 132.0557 -22498, 66.90103, 114.3497 -22499, 66.12243, 122.077 -22500, 65.6892, 118.8169 -22501, 65.1204, 118.9654 -22502, 67.16597, 126.5318 -22503, 67.33179, 132.7412 -22504, 65.43456, 132.9256 -22505, 71.01314, 144.9404 -22506, 67.13382, 139.0221 -22507, 70.73742, 139.8123 -22508, 61.5772, 96.8142 -22509, 65.29383, 126.8247 -22510, 68.56296, 129.1019 -22511, 67.5144, 122.6961 -22512, 72.21583, 141.0306 -22513, 70.28404, 128.3399 -22514, 71.11178, 143.1083 -22515, 65.76568, 130.449 -22516, 68.03973, 128.1704 -22517, 68.16794, 130.1159 -22518, 66.20705, 121.4541 -22519, 67.45865, 135.8331 -22520, 68.06964, 107.1248 -22521, 68.40912, 142.847 -22522, 68.36422, 129.5642 -22523, 68.2454, 147.5186 -22524, 68.48681, 138.3336 -22525, 67.05044, 128.3177 -22526, 70.19008, 130.5503 -22527, 69.81118, 129.5179 -22528, 70.02186, 147.9327 -22529, 65.66764, 126.892 -22530, 68.29689, 128.3698 -22531, 68.96595, 113.4953 -22532, 64.81674, 125.2063 -22533, 67.12839, 125.9876 -22534, 68.09125, 106.3661 -22535, 68.70922, 133.285 -22536, 68.68883, 102.1817 -22537, 66.17566, 105.552 -22538, 66.59899, 112.7548 -22539, 66.343, 108.918 -22540, 69.56934, 147.6161 -22541, 70.46931, 121.3031 -22542, 69.28264, 134.4014 -22543, 65.39677, 118.5694 -22544, 65.71084, 117.2162 -22545, 68.83017, 137.2144 -22546, 66.59626, 119.4922 -22547, 64.3308, 120.3128 -22548, 68.47765, 137.3295 -22549, 65.57002, 122.3498 -22550, 70.5056, 139.8634 -22551, 64.50765, 117.6468 -22552, 65.13344, 115.206 -22553, 64.89306, 118.7128 -22554, 68.39202, 120.7594 -22555, 67.7322, 135.0784 -22556, 68.13899, 132.4274 -22557, 65.15771, 127.3552 -22558, 67.62358, 116.1185 -22559, 66.69655, 129.1073 -22560, 68.34154, 120.2991 -22561, 70.32266, 137.2463 -22562, 72.36994, 161.072 -22563, 71.00524, 135.5327 -22564, 67.51452, 117.0815 -22565, 68.86769, 134.6847 -22566, 71.92456, 140.8061 -22567, 69.60134, 137.1303 -22568, 71.14383, 145.1859 -22569, 69.61626, 119.6241 -22570, 68.93692, 131.6676 -22571, 69.42922, 132.3479 -22572, 67.17672, 140.0865 -22573, 69.72196, 128.3285 -22574, 70.60744, 132.7756 -22575, 67.34019, 127.3799 -22576, 66.31079, 126.9478 -22577, 67.23639, 129.5258 -22578, 66.2918, 121.0966 -22579, 69.50398, 136.2028 -22580, 66.49436, 113.3199 -22581, 70.58993, 133.791 -22582, 68.92044, 139.3391 -22583, 71.77031, 132.9198 -22584, 68.50443, 119.7086 -22585, 69.39218, 115.8239 -22586, 68.6537, 126.212 -22587, 66.18463, 133.7102 -22588, 68.33578, 125.5068 -22589, 66.10103, 120.5161 -22590, 67.31834, 134.4938 -22591, 68.14329, 140.9484 -22592, 67.54457, 113.9351 -22593, 68.89329, 132.902 -22594, 67.78014, 114.3622 -22595, 72.29726, 130.9845 -22596, 69.89756, 138.4082 -22597, 68.68682, 129.1788 -22598, 68.22197, 129.9893 -22599, 68.06326, 122.2425 -22600, 70.50201, 121.5432 -22601, 66.80934, 127.5672 -22602, 65.84644, 114.6007 -22603, 65.26085, 108.4305 -22604, 67.03193, 124.5872 -22605, 69.69241, 134.7945 -22606, 67.68945, 126.7584 -22607, 64.90842, 115.6715 -22608, 69.7312, 145.1096 -22609, 70.9839, 149.7127 -22610, 65.35669, 113.8631 -22611, 70.94864, 141.6714 -22612, 66.61118, 127.3027 -22613, 67.8403, 126.3388 -22614, 70.30731, 113.6596 -22615, 67.19256, 118.4278 -22616, 72.6701, 153.4343 -22617, 69.11157, 146.5177 -22618, 65.42909, 96.09124 -22619, 66.69501, 115.1204 -22620, 67.2699, 119.5571 -22621, 66.82154, 106.1513 -22622, 66.56659, 120.8269 -22623, 68.05305, 121.1583 -22624, 69.85664, 127.7646 -22625, 69.45607, 112.218 -22626, 65.00963, 133.8473 -22627, 70.59848, 142.1744 -22628, 70.32798, 145.7059 -22629, 71.92476, 137.7201 -22630, 72.18595, 134.2977 -22631, 68.29702, 125.3716 -22632, 72.45555, 135.889 -22633, 67.70906, 116.7369 -22634, 65.63799, 127.0389 -22635, 68.38226, 140.6609 -22636, 65.644, 134.9545 -22637, 69.68159, 129.241 -22638, 69.47913, 151.5039 -22639, 72.95987, 156.0008 -22640, 69.56484, 129.0326 -22641, 70.69665, 130.411 -22642, 66.5653, 130.9523 -22643, 66.0725, 113.1841 -22644, 68.68202, 131.7641 -22645, 64.4832, 117.5189 -22646, 66.84969, 112.0469 -22647, 66.68227, 105.1667 -22648, 68.65461, 122.6123 -22649, 69.72195, 118.0798 -22650, 69.39789, 117.1566 -22651, 70.61082, 125.1074 -22652, 66.22358, 110.4053 -22653, 70.31099, 126.7549 -22654, 68.85282, 134.3575 -22655, 69.84827, 129.8123 -22656, 69.80382, 120.1583 -22657, 66.79719, 113.3404 -22658, 68.78234, 136.1364 -22659, 68.63042, 142.019 -22660, 67.06382, 138.7234 -22661, 66.47369, 111.6471 -22662, 67.0678, 121.6606 -22663, 70.53877, 153.2208 -22664, 69.15369, 123.9976 -22665, 66.29498, 125.3838 -22666, 66.87256, 133.81 -22667, 67.12544, 134.5897 -22668, 69.56909, 131.9905 -22669, 67.03174, 136.702 -22670, 66.4968, 127.9662 -22671, 67.5556, 109.1244 -22672, 67.93723, 149.1814 -22673, 66.27955, 131.2398 -22674, 70.08345, 127.6921 -22675, 67.35558, 112.0268 -22676, 64.76129, 135.324 -22677, 69.37296, 119.6408 -22678, 68.95501, 122.0693 -22679, 67.90465, 120.3374 -22680, 66.71124, 117.9071 -22681, 65.76897, 119.6472 -22682, 69.74997, 139.8994 -22683, 68.41754, 144.6354 -22684, 70.48365, 141.2387 -22685, 68.69947, 126.1275 -22686, 67.91544, 139.3144 -22687, 64.26003, 138.8967 -22688, 69.46549, 139.5814 -22689, 72.00386, 126.9035 -22690, 68.50887, 137.5104 -22691, 68.6786, 148.859 -22692, 69.89895, 128.7758 -22693, 68.57138, 138.3081 -22694, 68.97025, 144.2462 -22695, 68.34718, 115.801 -22696, 72.38993, 135.652 -22697, 70.20578, 142.9711 -22698, 69.75085, 129.6653 -22699, 64.09194, 119.3224 -22700, 71.43266, 131.4454 -22701, 67.37224, 135.8829 -22702, 66.33348, 126.2756 -22703, 65.95623, 109.4862 -22704, 69.41866, 129.0734 -22705, 66.28843, 108.9547 -22706, 71.46665, 149.7074 -22707, 71.51152, 132.7706 -22708, 69.24771, 121.9716 -22709, 69.53177, 144.4003 -22710, 67.22302, 103.2602 -22711, 67.93135, 129.3014 -22712, 66.47411, 124.7407 -22713, 68.31675, 139.713 -22714, 73.35404, 150.7569 -22715, 67.46996, 125.8104 -22716, 68.76208, 145.3668 -22717, 66.09377, 139.3107 -22718, 67.45004, 123.2179 -22719, 67.8148, 123.4598 -22720, 67.34877, 126.6511 -22721, 71.09293, 136.7007 -22722, 66.02176, 142.9777 -22723, 66.60069, 127.9869 -22724, 69.93282, 138.0167 -22725, 68.7928, 138.5455 -22726, 65.98657, 111.6272 -22727, 66.96658, 125.4782 -22728, 68.02571, 120.8518 -22729, 67.76658, 132.3844 -22730, 71.68362, 121.7687 -22731, 68.13284, 137.313 -22732, 66.94959, 124.8775 -22733, 68.59926, 130.122 -22734, 68.17404, 138.4723 -22735, 65.94969, 128.6623 -22736, 67.78038, 145.0523 -22737, 69.16229, 133.4977 -22738, 68.84495, 135.0473 -22739, 62.87593, 87.80417 -22740, 65.38831, 114.5963 -22741, 69.61852, 138.186 -22742, 68.48205, 117.8466 -22743, 64.11049, 120.9648 -22744, 69.87984, 144.6479 -22745, 67.76735, 124.5242 -22746, 67.35451, 131.093 -22747, 70.00347, 141.6283 -22748, 67.782, 128.6523 -22749, 70.91393, 133.8196 -22750, 65.724, 116.8975 -22751, 69.41139, 111.6991 -22752, 67.93682, 132.6835 -22753, 68.58455, 127.992 -22754, 69.50539, 133.2801 -22755, 68.94904, 128.2592 -22756, 66.66785, 137.9687 -22757, 66.40117, 126.7388 -22758, 64.44764, 114.5613 -22759, 70.69015, 129.7884 -22760, 68.25112, 128.0135 -22761, 67.4473, 139.9757 -22762, 65.36833, 136.6826 -22763, 67.34133, 133.5039 -22764, 66.46421, 123.7168 -22765, 69.82447, 127.4811 -22766, 64.73067, 112.8504 -22767, 68.26578, 123.2698 -22768, 68.95561, 109.0392 -22769, 64.58086, 119.146 -22770, 74.19842, 141.6148 -22771, 66.6644, 121.794 -22772, 68.02958, 132.4556 -22773, 69.7998, 152.4869 -22774, 68.71084, 119.4949 -22775, 68.62699, 133.9088 -22776, 66.32223, 134.6167 -22777, 68.55855, 132.8311 -22778, 68.53141, 135.5661 -22779, 62.48689, 111.8165 -22780, 68.00704, 110.0622 -22781, 66.30784, 137.3814 -22782, 67.82081, 120.6221 -22783, 67.83951, 133.1991 -22784, 69.5902, 111.5373 -22785, 67.87211, 141.0278 -22786, 67.74583, 102.3371 -22787, 64.71388, 101.4857 -22788, 71.13759, 146.4352 -22789, 68.46782, 143.5551 -22790, 67.8517, 124.7309 -22791, 67.49456, 121.203 -22792, 68.90683, 126.8225 -22793, 66.26091, 108.851 -22794, 68.79987, 141.3204 -22795, 68.59418, 114.3444 -22796, 65.34823, 114.1506 -22797, 69.42848, 141.8919 -22798, 71.12497, 141.1445 -22799, 67.55908, 122.9483 -22800, 66.396, 119.9881 -22801, 68.62226, 119.503 -22802, 67.72435, 136.7854 -22803, 68.47464, 123.3189 -22804, 68.21036, 117.8225 -22805, 72.93173, 137.7735 -22806, 66.67029, 123.5324 -22807, 69.46618, 133.0678 -22808, 69.70422, 116.2886 -22809, 64.06811, 127.9847 -22810, 68.24092, 122.1935 -22811, 65.17573, 124.5714 -22812, 65.69849, 123.4044 -22813, 66.12188, 121.0018 -22814, 66.75351, 113.6246 -22815, 67.124, 130.327 -22816, 68.13272, 126.5551 -22817, 67.68052, 133.1014 -22818, 67.62642, 101.6002 -22819, 68.10599, 119.3721 -22820, 67.87029, 128.1651 -22821, 65.92455, 122.2294 -22822, 68.17315, 141.5252 -22823, 69.90983, 142.9065 -22824, 70.66076, 137.2266 -22825, 66.01225, 124.1513 -22826, 68.1509, 132.5444 -22827, 64.74223, 116.3991 -22828, 67.10415, 140.3787 -22829, 71.26494, 126.1828 -22830, 64.91946, 130.5654 -22831, 65.50098, 125.5682 -22832, 68.43887, 120.3856 -22833, 64.33844, 111.7705 -22834, 67.68823, 129.9065 -22835, 66.06957, 123.5877 -22836, 68.48965, 124.2906 -22837, 67.35924, 129.934 -22838, 67.16705, 118.2155 -22839, 66.10219, 125.8852 -22840, 69.4862, 124.0363 -22841, 70.51144, 140.7336 -22842, 68.89049, 125.4419 -22843, 67.11289, 115.4696 -22844, 69.51603, 139.5932 -22845, 68.86244, 131.8509 -22846, 67.76488, 133.5444 -22847, 65.95197, 126.4559 -22848, 65.55731, 110.9407 -22849, 72.43314, 128.1583 -22850, 68.05046, 126.5532 -22851, 63.42692, 114.5877 -22852, 70.12328, 133.688 -22853, 65.79126, 110.9996 -22854, 68.70108, 135.9715 -22855, 73.28207, 137.8167 -22856, 68.99273, 147.8318 -22857, 67.82843, 135.2744 -22858, 62.94505, 122.372 -22859, 69.51628, 126.2618 -22860, 67.94096, 116.288 -22861, 68.50625, 132.962 -22862, 67.95033, 114.1483 -22863, 68.24256, 128.3786 -22864, 66.74548, 120.3706 -22865, 68.97078, 134.1704 -22866, 67.89432, 119.747 -22867, 67.79059, 128.8443 -22868, 69.35969, 151.1659 -22869, 67.25605, 119.6419 -22870, 69.23614, 143.8642 -22871, 66.1292, 119.0279 -22872, 67.91232, 136.3911 -22873, 69.75562, 108.6263 -22874, 64.53749, 114.2815 -22875, 67.63726, 119.2335 -22876, 64.64337, 103.3826 -22877, 68.76465, 135.6549 -22878, 68.35968, 125.3602 -22879, 67.15012, 110.7928 -22880, 67.86118, 110.2807 -22881, 65.15809, 111.8642 -22882, 68.62459, 147.1759 -22883, 69.70212, 107.5978 -22884, 65.83099, 119.0626 -22885, 66.5626, 108.4966 -22886, 68.09845, 118.1344 -22887, 71.05128, 146.987 -22888, 67.73185, 113.9887 -22889, 70.68351, 137.5274 -22890, 66.52891, 121.9112 -22891, 69.66816, 132.621 -22892, 69.14886, 118.2569 -22893, 68.16218, 125.9458 -22894, 66.39514, 129.8475 -22895, 69.00165, 122.8649 -22896, 67.50031, 118.3179 -22897, 69.70684, 143.0038 -22898, 66.12548, 130.5276 -22899, 69.3575, 143.6705 -22900, 71.21111, 123.7803 -22901, 70.30626, 127.5549 -22902, 68.79866, 113.9144 -22903, 67.98332, 129.6498 -22904, 67.04034, 136.5138 -22905, 65.51177, 125.8274 -22906, 67.5647, 121.5267 -22907, 65.31898, 112.9453 -22908, 68.67641, 133.8246 -22909, 69.69018, 108.3043 -22910, 67.58645, 128.7129 -22911, 69.02146, 131.7672 -22912, 71.22346, 134.1668 -22913, 66.68869, 121.3149 -22914, 68.89188, 116.5565 -22915, 70.25429, 132.284 -22916, 66.69163, 113.6064 -22917, 71.23552, 149.4307 -22918, 72.23127, 136.0526 -22919, 69.14796, 127.1588 -22920, 68.3997, 137.7419 -22921, 69.1157, 137.5853 -22922, 67.44534, 123.8531 -22923, 67.22197, 120.25 -22924, 68.34089, 123.5174 -22925, 68.42363, 130.5575 -22926, 70.02078, 101.0972 -22927, 70.21496, 126.4946 -22928, 66.38077, 133.6296 -22929, 66.71388, 115.4801 -22930, 64.1655, 117.12 -22931, 71.24956, 137.0562 -22932, 69.89254, 147.3662 -22933, 68.98321, 135.968 -22934, 64.57034, 129.1319 -22935, 67.41889, 116.1147 -22936, 69.98766, 137.7019 -22937, 70.43488, 133.2956 -22938, 65.75904, 116.6186 -22939, 64.11045, 115.4852 -22940, 66.59156, 134.6647 -22941, 67.27675, 137.0794 -22942, 69.17155, 136.9795 -22943, 69.6518, 130.5147 -22944, 66.32536, 128.4373 -22945, 64.03352, 114.4831 -22946, 61.92639, 78.01476 -22947, 67.7671, 117.9652 -22948, 66.40118, 109.6265 -22949, 66.88433, 124.1093 -22950, 68.2887, 122.8747 -22951, 66.1441, 116.6754 -22952, 70.22583, 140.134 -22953, 68.68353, 137.0244 -22954, 71.08882, 137.2922 -22955, 64.53211, 112.4629 -22956, 66.54164, 115.2955 -22957, 67.46281, 130.815 -22958, 68.0421, 121.023 -22959, 65.46687, 124.5001 -22960, 68.52141, 113.6681 -22961, 67.96073, 126.2877 -22962, 66.57412, 121.4992 -22963, 67.40978, 137.7122 -22964, 67.55044, 146.7738 -22965, 64.99509, 110.056 -22966, 68.29555, 135.3666 -22967, 65.96557, 133.8862 -22968, 68.96821, 134.2673 -22969, 69.15112, 119.7562 -22970, 68.56283, 128.7529 -22971, 69.75078, 136.582 -22972, 67.47683, 102.3792 -22973, 70.38587, 126.0902 -22974, 68.33742, 135.0531 -22975, 68.81973, 142.3251 -22976, 68.62357, 110.3801 -22977, 63.33985, 102.0817 -22978, 69.12711, 117.5758 -22979, 67.89769, 121.003 -22980, 66.45348, 137.254 -22981, 65.60765, 117.6409 -22982, 69.61332, 124.3246 -22983, 65.2444, 100.6039 -22984, 70.00592, 138.7949 -22985, 68.27914, 126.7719 -22986, 68.01894, 140.9059 -22987, 66.99443, 125.0889 -22988, 66.27568, 120.1084 -22989, 67.53537, 142.9972 -22990, 66.97235, 112.1711 -22991, 70.63806, 145.3795 -22992, 62.8996, 122.5734 -22993, 69.89458, 138.0427 -22994, 71.93148, 145.0405 -22995, 68.87022, 125.7048 -22996, 68.93, 132.8748 -22997, 64.69495, 125.4599 -22998, 68.70088, 125.097 -22999, 69.00687, 141.8557 -23000, 67.0541, 127.0649 -23001, 66.03227, 105.2789 -23002, 65.47238, 123.0281 -23003, 68.47197, 116.8453 -23004, 72.86624, 155.6909 -23005, 69.44922, 122.5776 -23006, 67.63052, 125.2892 -23007, 68.2045, 100.3754 -23008, 66.53317, 124.1705 -23009, 67.27027, 129.1828 -23010, 65.41871, 117.4206 -23011, 71.23007, 141.3686 -23012, 65.94361, 116.2995 -23013, 68.6177, 135.2373 -23014, 70.50911, 124.1658 -23015, 69.85115, 120.489 -23016, 71.86882, 124.1575 -23017, 69.08754, 132.1762 -23018, 68.19593, 127.1534 -23019, 70.29545, 123.0092 -23020, 66.37047, 119.1916 -23021, 69.81223, 135.2679 -23022, 67.11791, 109.1436 -23023, 66.40278, 119.7731 -23024, 66.84852, 138.8225 -23025, 69.11523, 131.8907 -23026, 70.68754, 133.2559 -23027, 65.23047, 125.7246 -23028, 67.79963, 131.9513 -23029, 67.81254, 129.5695 -23030, 68.18637, 114.497 -23031, 64.72897, 113.9349 -23032, 67.22249, 131.9605 -23033, 67.93339, 115.2966 -23034, 66.48779, 120.5557 -23035, 66.56398, 120.0062 -23036, 66.75188, 105.1257 -23037, 66.02021, 126.5255 -23038, 67.9585, 127.2612 -23039, 67.75219, 110.8899 -23040, 73.95494, 154.3987 -23041, 68.63039, 141.3375 -23042, 62.37478, 129.29 -23043, 68.14198, 140.1522 -23044, 68.18139, 117.3218 -23045, 69.02633, 120.1428 -23046, 66.65396, 107.1014 -23047, 70.08721, 141.2284 -23048, 67.67278, 118.0272 -23049, 67.75081, 117.2739 -23050, 69.23325, 126.2547 -23051, 66.37194, 110.396 -23052, 70.10608, 147.4051 -23053, 69.31002, 138.6833 -23054, 68.90824, 136.5244 -23055, 68.92139, 134.8939 -23056, 67.23139, 132.9597 -23057, 65.72498, 138.466 -23058, 65.644, 115.7868 -23059, 67.33561, 143.0319 -23060, 69.78481, 131.0816 -23061, 70.59255, 139.4271 -23062, 68.63899, 122.564 -23063, 65.88659, 127.421 -23064, 68.58695, 138.1849 -23065, 72.62181, 131.941 -23066, 67.19948, 126.541 -23067, 63.83059, 95.14852 -23068, 66.5739, 121.3202 -23069, 68.18941, 124.102 -23070, 67.36899, 131.4176 -23071, 67.99917, 126.5831 -23072, 64.31329, 110.9314 -23073, 69.79204, 145.3659 -23074, 68.63117, 136.1348 -23075, 66.5155, 137.0524 -23076, 66.38747, 121.6402 -23077, 69.64946, 125.6207 -23078, 69.99201, 160.4327 -23079, 69.47095, 127.7372 -23080, 68.77016, 134.2468 -23081, 71.11019, 140.7725 -23082, 68.89861, 118.0075 -23083, 69.31258, 146.593 -23084, 69.5515, 139.4765 -23085, 64.91223, 119.4779 -23086, 68.37362, 118.1811 -23087, 69.53448, 128.3192 -23088, 71.24771, 154.2702 -23089, 68.83289, 127.9049 -23090, 70.97853, 139.8943 -23091, 68.7672, 143.2316 -23092, 70.09748, 131.3648 -23093, 66.41888, 138.25 -23094, 65.86975, 130.1757 -23095, 70.4954, 159.7426 -23096, 65.064, 105.9605 -23097, 66.23465, 146.7267 -23098, 63.36047, 101.3858 -23099, 65.49193, 111.6041 -23100, 69.78248, 123.3267 -23101, 67.16624, 108.0636 -23102, 69.51547, 125.7864 -23103, 68.25933, 117.6366 -23104, 69.56163, 123.3559 -23105, 68.51831, 132.3693 -23106, 68.80896, 133.7864 -23107, 68.56353, 140.9816 -23108, 67.83572, 124.3327 -23109, 69.41269, 142.6121 -23110, 69.68146, 129.8956 -23111, 67.64549, 143.3283 -23112, 66.05269, 122.8764 -23113, 66.27796, 107.2234 -23114, 65.97701, 122.1289 -23115, 66.49181, 104.5214 -23116, 69.4567, 127.3538 -23117, 65.33723, 121.5969 -23118, 66.57846, 124.3407 -23119, 68.01712, 137.5218 -23120, 71.9112, 138.2502 -23121, 69.96109, 142.6425 -23122, 66.49663, 115.0091 -23123, 69.70181, 127.0448 -23124, 68.75589, 117.8107 -23125, 68.24339, 124.7115 -23126, 71.0885, 134.7542 -23127, 69.22398, 128.7649 -23128, 65.73834, 132.8322 -23129, 66.723, 122.3498 -23130, 66.46585, 143.7961 -23131, 70.17314, 133.0561 -23132, 62.87311, 118.5005 -23133, 71.03165, 157.4647 -23134, 65.93252, 123.4121 -23135, 68.38672, 133.2561 -23136, 68.48179, 131.7267 -23137, 66.76412, 127.6081 -23138, 70.28787, 145.6777 -23139, 67.95232, 126.7402 -23140, 66.4042, 107.4818 -23141, 67.99874, 125.0152 -23142, 68.94294, 132.508 -23143, 66.99344, 117.7892 -23144, 67.73609, 127.2783 -23145, 65.91236, 138.3038 -23146, 69.29849, 141.5628 -23147, 69.19949, 127.7265 -23148, 67.43514, 143.9286 -23149, 71.4622, 132.334 -23150, 69.06087, 139.6586 -23151, 66.77321, 128.0555 -23152, 68.79889, 126.6591 -23153, 67.86558, 143.0202 -23154, 68.57647, 120.5964 -23155, 65.96871, 133.0051 -23156, 66.58142, 120.7591 -23157, 68.05952, 119.5858 -23158, 70.24508, 128.3668 -23159, 64.83437, 113.7229 -23160, 68.73522, 137.6596 -23161, 68.7765, 136.8831 -23162, 68.33747, 119.7698 -23163, 70.23944, 142.1361 -23164, 68.81975, 140.2789 -23165, 68.00236, 149.5672 -23166, 64.70248, 119.8107 -23167, 69.24303, 140.6072 -23168, 69.73554, 112.9331 -23169, 69.90308, 118.7222 -23170, 70.26048, 142.8739 -23171, 68.15806, 118.4471 -23172, 68.16444, 136.4492 -23173, 66.89046, 125.3586 -23174, 65.22883, 117.7991 -23175, 68.87187, 130.3033 -23176, 68.18349, 142.1478 -23177, 64.41925, 133.8882 -23178, 66.7988, 111.9541 -23179, 69.8922, 131.1349 -23180, 67.47421, 127.7576 -23181, 65.32392, 100.9973 -23182, 67.69222, 124.5089 -23183, 70.27339, 149.3882 -23184, 69.54348, 138.795 -23185, 73.32067, 131.1796 -23186, 66.05531, 120.903 -23187, 65.51404, 123.1225 -23188, 69.69787, 148.9949 -23189, 65.81341, 127.2974 -23190, 69.3073, 133.1362 -23191, 64.86268, 108.1662 -23192, 69.16539, 138.3731 -23193, 70.52093, 136.9358 -23194, 68.1878, 118.8524 -23195, 66.08498, 113.2371 -23196, 65.10427, 113.6349 -23197, 68.62122, 116.6541 -23198, 71.42976, 127.3845 -23199, 65.69791, 117.3124 -23200, 69.80748, 128.074 -23201, 69.92772, 136.1304 -23202, 69.41298, 130.348 -23203, 70.06942, 126.2846 -23204, 66.39166, 118.4999 -23205, 66.07042, 107.3307 -23206, 67.94108, 131.225 -23207, 66.88941, 127.8534 -23208, 68.96017, 124.9296 -23209, 69.5704, 156.8531 -23210, 68.2825, 128.9134 -23211, 66.7166, 130.1374 -23212, 66.72626, 108.1246 -23213, 66.57273, 114.7724 -23214, 68.04107, 126.3943 -23215, 68.6295, 139.1018 -23216, 68.49436, 113.7604 -23217, 66.39979, 114.3961 -23218, 68.28212, 132.8866 -23219, 68.52069, 139.9603 -23220, 69.03432, 120.0319 -23221, 64.99547, 129.0647 -23222, 67.91196, 112.3713 -23223, 66.91361, 116.2512 -23224, 70.70381, 139.5198 -23225, 67.40064, 137.1524 -23226, 69.05353, 127.2322 -23227, 65.85398, 121.7386 -23228, 66.79527, 121.806 -23229, 68.85892, 145.3855 -23230, 66.42832, 103.8422 -23231, 66.91067, 126.6949 -23232, 70.43889, 137.7195 -23233, 67.94999, 139.0592 -23234, 69.95065, 139.1737 -23235, 72.71908, 134.6013 -23236, 65.74199, 136.7099 -23237, 65.51557, 125.163 -23238, 70.21226, 119.1812 -23239, 69.16742, 128.4386 -23240, 68.82771, 105.6454 -23241, 68.60122, 132.7843 -23242, 65.56691, 127.4552 -23243, 69.79458, 120.7382 -23244, 68.50628, 131.7647 -23245, 66.57019, 116.6893 -23246, 70.03926, 134.5167 -23247, 67.9869, 141.6655 -23248, 71.22405, 151.3256 -23249, 68.74939, 126.1276 -23250, 67.24515, 139.1668 -23251, 67.73462, 114.4462 -23252, 67.46116, 127.3858 -23253, 69.2147, 140.1225 -23254, 67.51576, 126.9627 -23255, 66.10796, 114.8271 -23256, 68.5057, 117.2246 -23257, 66.73397, 122.3952 -23258, 69.36366, 125.575 -23259, 71.87173, 146.8516 -23260, 65.49077, 118.2955 -23261, 66.34021, 108.1274 -23262, 66.91425, 112.1228 -23263, 69.28626, 134.7612 -23264, 67.79093, 124.6467 -23265, 69.07817, 143.6054 -23266, 67.44134, 146.0127 -23267, 68.73085, 134.9284 -23268, 69.47641, 129.3397 -23269, 68.70536, 144.436 -23270, 64.93749, 106.7489 -23271, 67.24113, 111.1544 -23272, 66.56344, 131.8655 -23273, 65.53499, 94.12903 -23274, 63.90174, 118.1282 -23275, 69.67198, 133.5641 -23276, 64.43413, 124.1712 -23277, 64.51197, 115.5299 -23278, 67.70097, 133.1008 -23279, 64.90215, 123.7036 -23280, 67.99061, 129.6754 -23281, 67.82413, 120.6313 -23282, 68.52722, 126.7222 -23283, 69.2092, 121.3021 -23284, 66.20442, 115.7721 -23285, 71.109, 132.442 -23286, 68.57075, 114.2557 -23287, 68.00623, 137.8888 -23288, 64.09668, 113.0901 -23289, 68.75021, 138.3973 -23290, 65.47736, 116.194 -23291, 68.75545, 135.4326 -23292, 67.45601, 117.7914 -23293, 65.98877, 120.6623 -23294, 69.37016, 127.3013 -23295, 67.6734, 123.4882 -23296, 69.89525, 119.6832 -23297, 69.61509, 128.0375 -23298, 69.3937, 137.0006 -23299, 67.97247, 102.2394 -23300, 69.22724, 127.8642 -23301, 67.9542, 120.0739 -23302, 67.95068, 115.6076 -23303, 68.40984, 145.4263 -23304, 68.77759, 131.7281 -23305, 65.13204, 122.8043 -23306, 68.81528, 126.5719 -23307, 64.91737, 118.1884 -23308, 69.24, 141.1041 -23309, 64.37656, 106.7087 -23310, 66.94537, 128.9508 -23311, 67.93057, 122.6122 -23312, 67.94897, 110.6746 -23313, 67.85108, 123.105 -23314, 66.58719, 114.1358 -23315, 69.6734, 133.9095 -23316, 69.99226, 131.5353 -23317, 66.01009, 111.5487 -23318, 69.06337, 140.4059 -23319, 68.44652, 122.5025 -23320, 67.77966, 120.9614 -23321, 68.28074, 126.8558 -23322, 67.85813, 116.385 -23323, 66.32684, 104.7552 -23324, 64.69309, 116.3749 -23325, 69.99022, 153.7945 -23326, 71.14046, 139.3483 -23327, 73.11374, 141.5157 -23328, 67.07803, 128.1482 -23329, 67.86878, 111.8266 -23330, 66.00182, 122.9777 -23331, 66.90908, 135.2963 -23332, 66.6852, 127.4327 -23333, 67.09584, 138.9995 -23334, 69.32346, 129.5811 -23335, 71.51046, 152.7026 -23336, 67.95718, 126.8874 -23337, 71.95199, 148.9864 -23338, 64.63369, 101.6115 -23339, 67.76332, 102.2017 -23340, 67.47196, 128.7711 -23341, 68.9559, 128.348 -23342, 68.91935, 130.601 -23343, 69.72604, 129.9311 -23344, 69.36628, 126.0097 -23345, 69.36979, 160.0595 -23346, 70.82097, 125.9832 -23347, 67.88765, 130.1885 -23348, 66.24709, 108.1229 -23349, 65.29888, 126.1983 -23350, 68.06429, 115.6124 -23351, 68.31388, 157.1449 -23352, 66.80653, 129.4758 -23353, 70.76233, 128.8173 -23354, 67.91801, 131.1724 -23355, 67.7657, 137.7214 -23356, 68.41708, 129.1072 -23357, 70.60391, 134.6567 -23358, 70.95676, 152.5077 -23359, 67.80891, 119.3174 -23360, 68.05761, 144.4357 -23361, 71.64101, 137.6723 -23362, 69.56807, 131.7272 -23363, 68.37897, 124.4672 -23364, 69.52961, 139.0711 -23365, 67.91638, 129.7194 -23366, 65.90163, 130.2564 -23367, 66.40618, 120.6583 -23368, 66.75016, 127.253 -23369, 70.67254, 128.2802 -23370, 66.19564, 121.9578 -23371, 63.86903, 108.1252 -23372, 67.31392, 124.2722 -23373, 68.76809, 138.7117 -23374, 65.20943, 116.157 -23375, 66.98591, 115.0587 -23376, 67.42523, 136.1542 -23377, 66.50837, 120.1535 -23378, 67.6117, 121.1889 -23379, 66.61201, 121.5732 -23380, 70.86568, 118.6469 -23381, 71.32734, 128.9839 -23382, 65.4778, 112.1488 -23383, 67.97456, 143.301 -23384, 64.43034, 111.1606 -23385, 64.28602, 107.6355 -23386, 66.96798, 126.725 -23387, 70.1485, 131.5029 -23388, 69.33442, 151.3078 -23389, 64.16934, 112.0675 -23390, 68.13767, 119.5635 -23391, 67.08413, 112.2697 -23392, 67.41342, 121.7801 -23393, 66.12667, 114.907 -23394, 69.20029, 131.6151 -23395, 68.12415, 123.0866 -23396, 68.46751, 112.8145 -23397, 68.76315, 142.2609 -23398, 68.57141, 125.4749 -23399, 66.26613, 130.1712 -23400, 71.68987, 134.2174 -23401, 69.02855, 137.7087 -23402, 68.18153, 128.3747 -23403, 68.09645, 134.3938 -23404, 67.62189, 123.3117 -23405, 67.09138, 118.3389 -23406, 63.55618, 102.794 -23407, 62.85508, 114.4639 -23408, 68.7842, 131.0257 -23409, 63.50044, 120.7176 -23410, 67.44217, 134.7953 -23411, 67.98901, 129.3666 -23412, 70.35684, 147.6725 -23413, 69.72082, 128.5478 -23414, 64.46472, 100.3255 -23415, 67.97104, 130.713 -23416, 66.30166, 125.9627 -23417, 70.70031, 134.4612 -23418, 71.09133, 140.8249 -23419, 67.99134, 145.7668 -23420, 69.21008, 134.423 -23421, 66.88274, 126.4537 -23422, 68.36795, 125.8251 -23423, 68.49492, 134.5742 -23424, 68.58014, 153.277 -23425, 67.89223, 128.9499 -23426, 67.11189, 96.36193 -23427, 63.31715, 104.4658 -23428, 67.75509, 136.1973 -23429, 67.73474, 121.4205 -23430, 70.0064, 133.8839 -23431, 71.4794, 141.4209 -23432, 66.55546, 111.2872 -23433, 68.93126, 130.5566 -23434, 68.92078, 127.2883 -23435, 69.87076, 106.3125 -23436, 68.83485, 119.3079 -23437, 65.01842, 151.4337 -23438, 67.6557, 118.4406 -23439, 67.04163, 133.2765 -23440, 69.71126, 126.3546 -23441, 66.50183, 131.5315 -23442, 68.33511, 144.3527 -23443, 66.9407, 110.8551 -23444, 67.40925, 136.9725 -23445, 69.31165, 131.074 -23446, 64.06236, 115.105 -23447, 65.56181, 116.5971 -23448, 64.77319, 121.3992 -23449, 68.96452, 131.9731 -23450, 66.63747, 118.1281 -23451, 69.56752, 135.5865 -23452, 65.1007, 109.2654 -23453, 64.9936, 110.6938 -23454, 70.66323, 128.1262 -23455, 69.00077, 112.673 -23456, 70.10951, 114.8419 -23457, 67.34384, 114.9568 -23458, 68.60818, 134.9085 -23459, 67.23956, 107.1732 -23460, 72.29201, 139.9045 -23461, 67.08503, 120.075 -23462, 67.42026, 134.753 -23463, 69.11345, 124.4949 -23464, 72.35402, 138.0597 -23465, 65.26185, 121.3037 -23466, 68.44809, 119.1946 -23467, 63.33709, 129.6209 -23468, 69.63855, 127.8437 -23469, 70.94026, 120.1561 -23470, 68.87976, 129.9892 -23471, 66.86712, 117.3156 -23472, 71.04505, 130.1568 -23473, 68.38827, 119.0647 -23474, 67.52106, 122.7459 -23475, 69.87186, 132.0456 -23476, 71.55171, 117.5422 -23477, 66.46162, 127.9555 -23478, 72.02569, 124.1535 -23479, 67.57232, 118.5305 -23480, 69.00459, 120.4771 -23481, 65.95744, 133.5889 -23482, 69.42784, 138.1965 -23483, 66.84795, 110.233 -23484, 68.35329, 123.8493 -23485, 65.86502, 123.3062 -23486, 69.835, 140.2449 -23487, 67.66145, 126.0904 -23488, 68.19426, 144.2229 -23489, 69.32705, 129.9933 -23490, 67.61906, 116.2005 -23491, 73.40972, 133.009 -23492, 66.96963, 127.496 -23493, 66.12847, 105.4284 -23494, 67.31517, 123.035 -23495, 70.20341, 139.4022 -23496, 68.61279, 136.1018 -23497, 68.2315, 128.3552 -23498, 69.01795, 120.3067 -23499, 69.11662, 132.9447 -23500, 67.01546, 130.2632 -23501, 69.66929, 126.4905 -23502, 68.84648, 115.084 -23503, 68.62712, 120.257 -23504, 68.34286, 124.6374 -23505, 68.00429, 110.7882 -23506, 68.53424, 138.4216 -23507, 68.86421, 125.0711 -23508, 68.66789, 116.5181 -23509, 64.77087, 106.5228 -23510, 66.59801, 130.4351 -23511, 68.51877, 135.0892 -23512, 67.72455, 122.4271 -23513, 68.65578, 152.6253 -23514, 66.55626, 135.1086 -23515, 65.6087, 120.4908 -23516, 65.99372, 127.2212 -23517, 69.59156, 131.6555 -23518, 66.83509, 115.5445 -23519, 68.49693, 122.8879 -23520, 68.18592, 141.1364 -23521, 65.89922, 113.8338 -23522, 66.9475, 105.6898 -23523, 69.06182, 134.9376 -23524, 68.33972, 125.0717 -23525, 66.07267, 132.8536 -23526, 69.31936, 138.2366 -23527, 65.84808, 131.2502 -23528, 67.36294, 118.4514 -23529, 67.3593, 117.1267 -23530, 64.4803, 114.5619 -23531, 69.90125, 145.3534 -23532, 66.98612, 146.5458 -23533, 69.10503, 121.7325 -23534, 67.52838, 111.8378 -23535, 69.42915, 123.1078 -23536, 67.06781, 118.8862 -23537, 67.46411, 126.3954 -23538, 68.88653, 120.841 -23539, 67.0299, 111.8676 -23540, 64.80287, 122.305 -23541, 70.12057, 128.2378 -23542, 66.70331, 137.0292 -23543, 65.61686, 124.6061 -23544, 66.94092, 116.4586 -23545, 65.96306, 94.7257 -23546, 65.67991, 123.1875 -23547, 69.71521, 131.7122 -23548, 72.27532, 154.9474 -23549, 68.9462, 125.8252 -23550, 65.77925, 120.1731 -23551, 67.74371, 133.4557 -23552, 67.50658, 138.89 -23553, 64.7387, 129.9819 -23554, 70.40075, 138.2906 -23555, 66.31113, 118.736 -23556, 69.07813, 132.6275 -23557, 65.591, 118.3107 -23558, 67.68762, 120.8594 -23559, 66.44951, 120.1558 -23560, 68.08673, 126.8226 -23561, 66.24786, 127.0943 -23562, 70.99353, 123.479 -23563, 68.2099, 127.1802 -23564, 67.95421, 125.725 -23565, 68.83812, 129.5121 -23566, 65.96009, 128.081 -23567, 66.27192, 118.0759 -23568, 65.97624, 115.5401 -23569, 66.75536, 121.1873 -23570, 70.71061, 142.0151 -23571, 69.7805, 121.0935 -23572, 68.54296, 139.0712 -23573, 68.1192, 108.6708 -23574, 65.3068, 129.9528 -23575, 69.78927, 139.6959 -23576, 68.62776, 126.7958 -23577, 70.62247, 130.7473 -23578, 68.90663, 139.9702 -23579, 69.10172, 147.4603 -23580, 65.38912, 106.2248 -23581, 67.42929, 118.2165 -23582, 68.36866, 129.2801 -23583, 68.36248, 120.0642 -23584, 66.87574, 122.173 -23585, 69.29149, 127.6393 -23586, 65.28542, 129.8255 -23587, 66.6047, 119.5932 -23588, 66.85857, 137.179 -23589, 71.25571, 140.6042 -23590, 70.01811, 125.5674 -23591, 68.14057, 121.5594 -23592, 70.42527, 136.4209 -23593, 70.19124, 116.1543 -23594, 70.03089, 121.4123 -23595, 66.38573, 126.3671 -23596, 66.9214, 125.7389 -23597, 67.42805, 135.3317 -23598, 67.65681, 110.0211 -23599, 67.35105, 110.7792 -23600, 66.64091, 119.5543 -23601, 69.83869, 146.7883 -23602, 66.59553, 124.4923 -23603, 69.77893, 122.8878 -23604, 66.08192, 128.2059 -23605, 70.75962, 145.1159 -23606, 68.33049, 109.8427 -23607, 67.25612, 139.0113 -23608, 70.61119, 143.3182 -23609, 67.56781, 112.6521 -23610, 70.97495, 148.0819 -23611, 70.12654, 129.6234 -23612, 68.78941, 128.9925 -23613, 67.18784, 110.9939 -23614, 67.1599, 121.0722 -23615, 67.87817, 132.0587 -23616, 69.82444, 124.1746 -23617, 68.68474, 116.2746 -23618, 69.35291, 130.007 -23619, 68.57852, 135.4695 -23620, 67.33814, 133.6925 -23621, 68.19909, 124.0152 -23622, 63.92008, 113.4979 -23623, 68.02589, 121.0372 -23624, 66.5546, 127.0069 -23625, 67.95995, 112.8356 -23626, 67.45313, 138.8983 -23627, 69.72472, 146.8345 -23628, 65.79407, 117.257 -23629, 68.77865, 148.2023 -23630, 65.47726, 110.3392 -23631, 68.95735, 124.7896 -23632, 68.41169, 137.9051 -23633, 67.62647, 134.5912 -23634, 66.45056, 136.37 -23635, 68.41418, 136.993 -23636, 73.46216, 140.968 -23637, 65.43572, 118.0352 -23638, 67.99082, 135.9919 -23639, 67.52665, 122.5461 -23640, 67.73934, 115.2443 -23641, 65.96595, 119.5018 -23642, 68.87961, 121.7995 -23643, 68.08036, 127.2558 -23644, 67.36171, 120.6458 -23645, 64.38354, 119.3323 -23646, 69.75639, 126.066 -23647, 66.8137, 106.6755 -23648, 67.46087, 121.3847 -23649, 68.99738, 118.3578 -23650, 66.52827, 123.3633 -23651, 69.43908, 136.248 -23652, 67.88492, 122.1517 -23653, 70.61052, 147.686 -23654, 69.48816, 130.5616 -23655, 67.12804, 122.7826 -23656, 67.75649, 117.9294 -23657, 70.94686, 131.9377 -23658, 68.2358, 125.9982 -23659, 68.81174, 135.5761 -23660, 69.37167, 130.0714 -23661, 66.56234, 123.6984 -23662, 67.51121, 115.6791 -23663, 67.92882, 129.482 -23664, 64.63454, 109.9452 -23665, 67.79166, 118.3516 -23666, 67.04792, 125.6464 -23667, 68.56413, 112.2504 -23668, 67.53116, 124.9106 -23669, 67.71164, 130.67 -23670, 71.49767, 128.9497 -23671, 66.42399, 121.8209 -23672, 65.25687, 115.1695 -23673, 67.02666, 121.5475 -23674, 68.4504, 122.1388 -23675, 73.55566, 149.8402 -23676, 69.17741, 131.2888 -23677, 67.4203, 110.133 -23678, 67.42349, 130.7954 -23679, 70.42099, 127.0184 -23680, 67.02709, 116.7578 -23681, 66.33083, 129.3366 -23682, 69.55259, 133.0437 -23683, 69.55744, 135.4041 -23684, 67.25328, 138.7002 -23685, 66.1666, 105.7041 -23686, 68.87957, 98.57059 -23687, 69.62485, 131.5031 -23688, 68.47403, 129.3925 -23689, 65.07886, 140.2449 -23690, 67.07668, 137.308 -23691, 65.87754, 121.0767 -23692, 68.13293, 123.9844 -23693, 70.14968, 121.9132 -23694, 65.34486, 111.9794 -23695, 66.07233, 123.6313 -23696, 68.10652, 129.6434 -23697, 71.04529, 139.779 -23698, 64.75341, 119.3351 -23699, 67.33457, 110.3688 -23700, 64.26607, 127.348 -23701, 66.25028, 122.8633 -23702, 69.80613, 126.2564 -23703, 70.31933, 132.2946 -23704, 65.90373, 122.0525 -23705, 68.12881, 111.4134 -23706, 69.43281, 120.0944 -23707, 69.05555, 140.1024 -23708, 70.16747, 139.4727 -23709, 70.72975, 152.7356 -23710, 69.50996, 137.1134 -23711, 67.74268, 136.3711 -23712, 67.58253, 128.0786 -23713, 65.01312, 125.7965 -23714, 67.06595, 129.959 -23715, 68.32618, 129.2915 -23716, 67.4883, 132.394 -23717, 67.81802, 121.1499 -23718, 67.86423, 122.2616 -23719, 67.04793, 144.7241 -23720, 69.56793, 124.4291 -23721, 64.52939, 128.9372 -23722, 68.42798, 122.4175 -23723, 68.71113, 112.1148 -23724, 66.14989, 138.2484 -23725, 72.84817, 151.3727 -23726, 71.75528, 136.2952 -23727, 66.20062, 122.2395 -23728, 71.30122, 122.1991 -23729, 72.70475, 106.6605 -23730, 66.4848, 131.0492 -23731, 65.73936, 103.8932 -23732, 65.73932, 116.6705 -23733, 68.36851, 126.187 -23734, 66.78073, 123.7823 -23735, 65.25826, 95.63814 -23736, 69.25203, 125.6851 -23737, 68.19473, 113.3283 -23738, 67.42308, 127.9037 -23739, 68.59131, 121.6313 -23740, 69.93451, 112.2096 -23741, 68.35495, 137.9728 -23742, 67.77473, 133.3277 -23743, 70.20824, 136.6606 -23744, 64.81088, 111.9485 -23745, 70.52361, 135.5258 -23746, 68.65188, 115.0439 -23747, 67.0511, 131.1182 -23748, 69.31371, 132.4638 -23749, 67.36956, 128.4464 -23750, 70.15169, 114.8211 -23751, 65.51921, 113.3363 -23752, 70.00466, 104.466 -23753, 68.0189, 129.3333 -23754, 66.72787, 103.2365 -23755, 69.81422, 132.2248 -23756, 67.4484, 105.256 -23757, 64.50036, 126.8106 -23758, 67.42181, 127.379 -23759, 69.54484, 135.6098 -23760, 66.78251, 94.51209 -23761, 68.02583, 135.0232 -23762, 69.59756, 126.0523 -23763, 69.70111, 147.8201 -23764, 68.69898, 131.2838 -23765, 69.50665, 139.9177 -23766, 67.16676, 125.2779 -23767, 66.01105, 130.5078 -23768, 68.95166, 129.3768 -23769, 68.38876, 119.2589 -23770, 67.47329, 132.4444 -23771, 66.73831, 128.1593 -23772, 64.92467, 96.91718 -23773, 71.2568, 130.6852 -23774, 68.64395, 136.5972 -23775, 67.67603, 124.4685 -23776, 65.50539, 143.9237 -23777, 64.31386, 119.0699 -23778, 69.72695, 119.3308 -23779, 65.11523, 125.7234 -23780, 63.70715, 111.0903 -23781, 69.94478, 128.5573 -23782, 67.20119, 113.6719 -23783, 71.38651, 141.1154 -23784, 66.74038, 133.1715 -23785, 65.21928, 125.0902 -23786, 66.83913, 129.4363 -23787, 69.02398, 130.9462 -23788, 67.32826, 112.6738 -23789, 66.59493, 127.1637 -23790, 71.73466, 145.4267 -23791, 66.33824, 123.3295 -23792, 67.0491, 123.2213 -23793, 70.64134, 152.056 -23794, 69.59606, 118.9768 -23795, 66.78068, 119.4823 -23796, 69.39063, 149.617 -23797, 69.90303, 133.9469 -23798, 72.73727, 144.2981 -23799, 68.39263, 132.5303 -23800, 68.31048, 129.9349 -23801, 66.94796, 113.807 -23802, 68.97424, 131.1916 -23803, 63.82304, 120.9811 -23804, 67.42872, 134.8411 -23805, 67.44922, 122.6827 -23806, 68.4922, 143.6419 -23807, 65.45648, 99.10252 -23808, 67.46239, 125.3729 -23809, 68.06118, 119.3436 -23810, 69.35205, 127.3954 -23811, 67.1694, 120.7452 -23812, 69.16451, 138.1299 -23813, 67.84407, 117.4335 -23814, 69.74531, 136.4161 -23815, 69.50049, 118.8787 -23816, 65.59756, 109.2654 -23817, 65.7887, 121.8958 -23818, 67.73988, 121.1281 -23819, 67.45264, 107.8988 -23820, 66.76519, 118.5142 -23821, 69.16573, 122.5451 -23822, 67.64803, 130.9586 -23823, 68.99719, 126.3192 -23824, 66.95571, 114.573 -23825, 68.21681, 139.3253 -23826, 70.59044, 135.6509 -23827, 67.01016, 136.7692 -23828, 67.16363, 112.0325 -23829, 67.31394, 114.5343 -23830, 68.61835, 135.0315 -23831, 67.52474, 129.9562 -23832, 68.7303, 132.5218 -23833, 68.51045, 113.1181 -23834, 70.2755, 124.5574 -23835, 69.58278, 132.3214 -23836, 68.17009, 126.5205 -23837, 68.29276, 130.0106 -23838, 69.6923, 140.5433 -23839, 70.30843, 136.5605 -23840, 65.24029, 116.5097 -23841, 71.56487, 132.1166 -23842, 67.86942, 130.7553 -23843, 67.8101, 144.9624 -23844, 66.69452, 119.4778 -23845, 68.80517, 129.8844 -23846, 67.00182, 134.3311 -23847, 68.36228, 144.5173 -23848, 70.3389, 131.5169 -23849, 68.009, 126.9959 -23850, 65.48455, 136.5241 -23851, 69.68966, 125.4997 -23852, 68.552, 129.4829 -23853, 68.2096, 138.6158 -23854, 66.93118, 121.261 -23855, 67.46192, 119.6095 -23856, 69.29621, 107.5141 -23857, 68.12627, 130.5966 -23858, 66.35397, 124.3943 -23859, 68.31918, 120.5494 -23860, 67.79233, 119.2799 -23861, 66.99949, 124.8734 -23862, 69.77773, 131.3978 -23863, 69.52365, 147.8093 -23864, 66.95733, 129.7038 -23865, 68.37534, 117.5037 -23866, 67.07925, 137.0927 -23867, 64.60565, 98.9372 -23868, 66.65496, 139.758 -23869, 69.01472, 121.4022 -23870, 66.8597, 122.6126 -23871, 69.87952, 144.0689 -23872, 64.61346, 103.4199 -23873, 67.75415, 134.9398 -23874, 73.02684, 139.7916 -23875, 68.15447, 128.9553 -23876, 72.59702, 136.8067 -23877, 68.01914, 112.0903 -23878, 65.82187, 112.6344 -23879, 68.81957, 130.1162 -23880, 71.317, 144.7312 -23881, 70.00255, 137.785 -23882, 66.38261, 122.7683 -23883, 68.21355, 140.6809 -23884, 67.74003, 108.2607 -23885, 70.18718, 122.1478 -23886, 71.83265, 130.342 -23887, 67.36621, 116.9097 -23888, 68.57086, 135.0217 -23889, 71.04741, 151.1236 -23890, 66.59795, 123.6365 -23891, 68.81107, 118.8078 -23892, 65.33076, 116.2683 -23893, 68.52512, 129.2716 -23894, 68.01263, 133.3037 -23895, 68.81095, 129.318 -23896, 71.415, 142.9992 -23897, 73.38057, 154.3189 -23898, 69.0571, 127.9148 -23899, 66.30593, 125.7792 -23900, 67.19635, 120.2431 -23901, 66.82731, 118.848 -23902, 70.80376, 131.1233 -23903, 69.21079, 126.0975 -23904, 68.97666, 140.9174 -23905, 70.93475, 141 -23906, 69.29018, 137.2974 -23907, 67.88454, 132.3025 -23908, 68.839, 139.0026 -23909, 68.75738, 128.0374 -23910, 66.63057, 118.8852 -23911, 68.70439, 122.1627 -23912, 70.42439, 142.969 -23913, 68.09534, 120.9784 -23914, 68.73448, 155.5583 -23915, 66.32387, 126.5144 -23916, 68.38525, 133.0024 -23917, 71.26558, 129.0136 -23918, 70.30804, 139.5592 -23919, 72.37914, 125.4124 -23920, 70.68229, 145.6807 -23921, 69.25524, 116.9842 -23922, 68.61717, 118.0604 -23923, 69.95234, 154.2652 -23924, 67.21192, 122.616 -23925, 68.95803, 140.1877 -23926, 70.21225, 115.701 -23927, 66.06475, 117.0679 -23928, 69.89075, 153.5111 -23929, 65.70868, 118.8838 -23930, 67.40897, 131.353 -23931, 67.80336, 128.5892 -23932, 66.77537, 126.0811 -23933, 69.39472, 124.5088 -23934, 68.03254, 152.3259 -23935, 70.68853, 142.0573 -23936, 64.90623, 125.4661 -23937, 66.7301, 124.653 -23938, 66.05134, 125.7801 -23939, 65.12063, 107.4916 -23940, 70.73337, 136.9526 -23941, 70.21345, 129.7068 -23942, 67.41542, 144.5605 -23943, 69.81576, 121.2493 -23944, 69.08556, 124.4855 -23945, 68.79164, 125.9361 -23946, 64.48761, 124.4471 -23947, 65.63039, 122.1341 -23948, 63.8873, 101.9472 -23949, 64.23075, 110.6193 -23950, 68.96118, 138.7769 -23951, 67.28415, 117.8188 -23952, 67.95165, 129.1463 -23953, 66.13126, 121.0599 -23954, 69.68175, 125.9135 -23955, 68.97307, 132.694 -23956, 68.54922, 140.4031 -23957, 72.05551, 144.0404 -23958, 69.71957, 127.4787 -23959, 66.86686, 144.6107 -23960, 68.5857, 132.7412 -23961, 67.71756, 150.1169 -23962, 69.84981, 115.8517 -23963, 70.80466, 148.1321 -23964, 69.82289, 136.5182 -23965, 68.44916, 118.8654 -23966, 64.51651, 124.292 -23967, 66.39716, 102.9907 -23968, 70.74389, 119.446 -23969, 68.03206, 126.3614 -23970, 70.51117, 146.8083 -23971, 68.10873, 141.6847 -23972, 67.23845, 115.9517 -23973, 68.54145, 146.4722 -23974, 66.88341, 120.6493 -23975, 67.94309, 127.9486 -23976, 70.47829, 140.5446 -23977, 67.41672, 103.9911 -23978, 71.68845, 138.8903 -23979, 68.42777, 132.1107 -23980, 69.80496, 139.5662 -23981, 69.95499, 123.728 -23982, 66.12776, 129.0935 -23983, 66.77574, 104.4298 -23984, 68.88634, 146.4716 -23985, 66.04019, 122.0205 -23986, 66.82725, 105.2155 -23987, 71.84956, 114.3322 -23988, 66.5493, 120.0294 -23989, 66.64194, 122.2388 -23990, 69.40514, 125.8462 -23991, 68.9732, 149.142 -23992, 68.89927, 118.6997 -23993, 66.49234, 114.5492 -23994, 69.66246, 123.1604 -23995, 71.37386, 119.0819 -23996, 68.49401, 128.6116 -23997, 66.74375, 116.3968 -23998, 68.17463, 136.3225 -23999, 66.44601, 109.0425 -24000, 66.93173, 127.6166 -24001, 71.05722, 129.2659 -24002, 70.44551, 132.4324 -24003, 66.78778, 123.2117 -24004, 66.99974, 104.313 -24005, 66.93056, 129.3818 -24006, 68.64546, 156.5212 -24007, 68.33571, 116.6739 -24008, 67.13465, 131.0346 -24009, 66.99755, 137.65 -24010, 66.55502, 109.5773 -24011, 67.6653, 118.1356 -24012, 68.29447, 121.9493 -24013, 67.86169, 136.1423 -24014, 65.99617, 123.9677 -24015, 69.31348, 126.5029 -24016, 66.8696, 128.1357 -24017, 67.89663, 111.9666 -24018, 68.59532, 132.2773 -24019, 65.47889, 119.7798 -24020, 65.17519, 122.6844 -24021, 69.09782, 121.3777 -24022, 68.59388, 135.8185 -24023, 67.38888, 107.0327 -24024, 67.39861, 148.6724 -24025, 67.55792, 118.6378 -24026, 68.62413, 135.944 -24027, 68.57569, 143.4643 -24028, 69.64614, 139.2707 -24029, 70.87591, 153.1772 -24030, 66.54682, 120.1556 -24031, 66.75683, 122.6771 -24032, 69.0924, 132.2348 -24033, 66.26872, 125.055 -24034, 70.44345, 129.744 -24035, 65.63798, 100.8841 -24036, 66.14059, 125.2816 -24037, 69.02744, 116.3008 -24038, 69.11634, 135.7018 -24039, 66.91189, 124.487 -24040, 67.47984, 118.6579 -24041, 66.27411, 142.8314 -24042, 69.06754, 133.5337 -24043, 68.74367, 113.0626 -24044, 67.78497, 123.231 -24045, 66.80328, 121.5905 -24046, 67.49976, 125.0247 -24047, 65.05186, 123.9833 -24048, 69.20162, 105.2719 -24049, 69.61355, 124.7545 -24050, 70.41472, 130.2035 -24051, 62.91894, 121.8655 -24052, 69.06546, 125.3295 -24053, 68.80458, 123.1664 -24054, 67.55559, 144.891 -24055, 69.75067, 136.7792 -24056, 68.04394, 129.1908 -24057, 70.18295, 107.8295 -24058, 68.99489, 141.8741 -24059, 67.51961, 128.5576 -24060, 64.56646, 119.602 -24061, 71.95831, 135.2597 -24062, 69.0224, 144.1056 -24063, 66.51118, 122.3771 -24064, 67.9872, 121.1185 -24065, 67.45834, 111.0184 -24066, 67.4141, 136.7198 -24067, 65.22365, 112.0242 -24068, 69.31591, 142.3476 -24069, 69.34287, 135.2131 -24070, 68.50494, 143.4556 -24071, 70.94343, 137.6151 -24072, 69.26483, 122.2489 -24073, 64.8763, 111.4897 -24074, 67.3401, 121.8431 -24075, 65.85647, 117.6178 -24076, 68.28513, 129.4322 -24077, 71.49848, 135.5103 -24078, 68.14922, 125.2074 -24079, 73.22107, 136.736 -24080, 70.24483, 136.0741 -24081, 66.16476, 119.8647 -24082, 70.72408, 150.4398 -24083, 69.60885, 126.7483 -24084, 68.64307, 131.2725 -24085, 70.82908, 121.2912 -24086, 66.17383, 112.7295 -24087, 68.54875, 138.1077 -24088, 67.97518, 116.8066 -24089, 68.32635, 125.2183 -24090, 72.05565, 127.6232 -24091, 67.94268, 124.3097 -24092, 67.72877, 119.0444 -24093, 69.59699, 126.4719 -24094, 70.84343, 130.0128 -24095, 71.14967, 139.4641 -24096, 66.78035, 112.8561 -24097, 67.51289, 128.4778 -24098, 69.2969, 129.867 -24099, 68.04596, 113.2546 -24100, 66.49564, 127.5542 -24101, 71.87029, 151.8397 -24102, 68.3905, 132.1402 -24103, 65.00438, 113.921 -24104, 66.20503, 120.4717 -24105, 69.34408, 126.0365 -24106, 67.73769, 116.4037 -24107, 68.95293, 120.5159 -24108, 67.79797, 141.8728 -24109, 66.26302, 130.6336 -24110, 69.71346, 122.8188 -24111, 67.72305, 96.06788 -24112, 66.72756, 123.1148 -24113, 66.75114, 132.4506 -24114, 66.96514, 142.6672 -24115, 67.59748, 106.3744 -24116, 65.51196, 135.7343 -24117, 68.93433, 118.4039 -24118, 70.04973, 139.9917 -24119, 68.57453, 142.7562 -24120, 69.95846, 133.5556 -24121, 69.67227, 144.783 -24122, 67.48895, 121.146 -24123, 68.41794, 127.0591 -24124, 70.64777, 141.8289 -24125, 68.74365, 118.5769 -24126, 67.49912, 134.2321 -24127, 68.96778, 118.3576 -24128, 64.27649, 115.885 -24129, 69.76465, 126.8942 -24130, 68.8062, 140.9144 -24131, 69.53558, 118.5909 -24132, 66.76818, 117.2523 -24133, 70.02343, 144.426 -24134, 65.68234, 114.9949 -24135, 63.5547, 103.4864 -24136, 64.35694, 116.7422 -24137, 67.86944, 104.8291 -24138, 64.26485, 116.6974 -24139, 70.98567, 136.3881 -24140, 68.02723, 129.2539 -24141, 65.82659, 125.2597 -24142, 69.30638, 124.229 -24143, 66.25985, 138.3646 -24144, 67.35007, 121.1851 -24145, 70.33575, 156.0098 -24146, 69.03953, 128.1108 -24147, 69.32626, 140.6029 -24148, 67.11686, 121.2675 -24149, 67.96735, 143.4441 -24150, 70.20798, 128.3993 -24151, 69.09575, 132.1344 -24152, 67.32842, 130.276 -24153, 67.57214, 126.6289 -24154, 67.48418, 121.5747 -24155, 67.43897, 142.602 -24156, 70.60461, 136.0619 -24157, 69.67131, 116.3116 -24158, 68.79333, 134.0923 -24159, 68.6349, 140.4769 -24160, 66.747, 128.7257 -24161, 67.88882, 140.7871 -24162, 67.2596, 125.8938 -24163, 66.72282, 117.8449 -24164, 63.72796, 108.0979 -24165, 67.57522, 128.0214 -24166, 69.42324, 139.5001 -24167, 67.42113, 128.4317 -24168, 69.55405, 128.6576 -24169, 68.10755, 136.0476 -24170, 70.91036, 135.1862 -24171, 67.535, 117.3195 -24172, 68.98823, 132.1382 -24173, 65.828, 135.4497 -24174, 64.87945, 124.8061 -24175, 68.02627, 133.2315 -24176, 66.48368, 129.5454 -24177, 68.02029, 114.874 -24178, 69.4901, 125.2642 -24179, 69.58713, 127.6308 -24180, 70.01705, 128.6734 -24181, 68.28885, 134.9464 -24182, 68.65246, 128.2972 -24183, 65.70769, 129.3739 -24184, 70.41426, 133.9713 -24185, 66.89627, 114.3175 -24186, 69.1823, 133.4793 -24187, 68.80486, 137.2361 -24188, 69.21155, 161.8504 -24189, 64.35037, 111.6101 -24190, 70.26517, 134.1679 -24191, 69.56064, 122.5547 -24192, 65.5203, 120.5505 -24193, 69.15769, 123.7836 -24194, 69.66405, 138.799 -24195, 67.44392, 131.769 -24196, 67.8289, 148.232 -24197, 69.59938, 131.8266 -24198, 67.51364, 115.2855 -24199, 73.03159, 139.2101 -24200, 64.51111, 118.8058 -24201, 69.88715, 147.5768 -24202, 71.0594, 128.6246 -24203, 66.13664, 118.9781 -24204, 68.92441, 147.0122 -24205, 69.72196, 139.1363 -24206, 68.76197, 132.05 -24207, 70.53243, 127.2087 -24208, 66.13778, 113.9093 -24209, 67.43917, 125.6656 -24210, 65.85657, 133.1832 -24211, 67.41715, 126.6363 -24212, 68.04343, 114.9553 -24213, 67.46147, 140.3633 -24214, 71.45905, 139.5134 -24215, 70.03432, 136.4678 -24216, 66.67824, 137.1923 -24217, 69.72584, 123.3291 -24218, 68.9367, 119.3911 -24219, 69.55646, 131.0409 -24220, 68.60903, 127.2278 -24221, 66.65147, 129.0941 -24222, 69.74899, 132.0704 -24223, 66.28759, 103.6524 -24224, 65.4048, 121.4187 -24225, 67.43504, 125.4301 -24226, 66.8601, 111.9679 -24227, 67.42077, 104.6335 -24228, 66.83403, 98.53013 -24229, 67.45638, 109.922 -24230, 68.39069, 127.7844 -24231, 68.10474, 122.7165 -24232, 67.35962, 116.7826 -24233, 67.93121, 117.5358 -24234, 69.00845, 137.3313 -24235, 66.98731, 126.8991 -24236, 69.13794, 142.4036 -24237, 69.79289, 119.0381 -24238, 68.63362, 128.3377 -24239, 65.68681, 133.8128 -24240, 68.03586, 139.3538 -24241, 68.56161, 115.2544 -24242, 65.31821, 130.3495 -24243, 67.54969, 115.5331 -24244, 64.9513, 110.3166 -24245, 62.26498, 104.1348 -24246, 67.05169, 142.0848 -24247, 69.42594, 132.518 -24248, 66.76908, 121.5039 -24249, 67.59811, 134.4056 -24250, 67.74663, 126.3347 -24251, 68.95289, 137.2302 -24252, 70.92726, 140.5278 -24253, 67.5076, 131.3532 -24254, 68.09779, 133.6869 -24255, 66.72497, 130.3382 -24256, 68.17851, 130.9928 -24257, 69.70107, 148.6245 -24258, 69.81542, 140.4349 -24259, 69.17806, 114.3901 -24260, 67.5213, 106.7127 -24261, 65.07932, 126.1848 -24262, 65.76272, 118.194 -24263, 67.38848, 120.523 -24264, 66.55762, 128.3819 -24265, 69.23117, 139.317 -24266, 67.97129, 137.9738 -24267, 68.50282, 132.3038 -24268, 66.11285, 129.8084 -24269, 68.29893, 119.2646 -24270, 66.43765, 114.2571 -24271, 69.81484, 148.605 -24272, 70.8647, 148.6468 -24273, 70.65, 124.5929 -24274, 66.3832, 117.1383 -24275, 65.39059, 138.0883 -24276, 63.60936, 119.2431 -24277, 68.41909, 139.949 -24278, 67.5536, 140.8926 -24279, 67.57167, 127.7977 -24280, 69.75543, 134.612 -24281, 65.97912, 115.7997 -24282, 69.82973, 127.4906 -24283, 68.25923, 137.5393 -24284, 68.52437, 123.8685 -24285, 67.44386, 120.3718 -24286, 68.81971, 121.4659 -24287, 67.6395, 106.6431 -24288, 67.13938, 121.3981 -24289, 67.68633, 128.4577 -24290, 67.06687, 123.2179 -24291, 65.7778, 127.2213 -24292, 65.89887, 119.1833 -24293, 67.07721, 131.6767 -24294, 71.12368, 141.4488 -24295, 69.35961, 137.6262 -24296, 69.07129, 131.0639 -24297, 68.52627, 136.7567 -24298, 67.1445, 128.2922 -24299, 67.88215, 113.533 -24300, 64.0373, 100.1102 -24301, 67.57486, 136.41 -24302, 69.77337, 135.0577 -24303, 68.60777, 148.6195 -24304, 64.55533, 121.8647 -24305, 66.06962, 116.8535 -24306, 67.95484, 136.1466 -24307, 67.37979, 124.2873 -24308, 67.90461, 136.9687 -24309, 69.82622, 114.3628 -24310, 66.25075, 123.4614 -24311, 67.49232, 125.4319 -24312, 68.89903, 138.7552 -24313, 68.22911, 148.3492 -24314, 67.01689, 121.5691 -24315, 70.22735, 135.4663 -24316, 66.58757, 133.0016 -24317, 70.5615, 148.0778 -24318, 68.93279, 117.798 -24319, 69.06889, 150.3723 -24320, 68.51969, 125.8678 -24321, 64.25367, 126.0578 -24322, 71.94301, 139.7416 -24323, 70.01068, 129.4594 -24324, 69.18761, 129.8031 -24325, 69.14814, 132.6303 -24326, 67.04657, 127.9961 -24327, 71.45121, 147.6741 -24328, 64.21518, 119.9798 -24329, 69.94629, 135.4905 -24330, 70.26145, 132.4525 -24331, 69.17309, 132.7108 -24332, 67.97198, 130.1606 -24333, 66.57066, 131.3612 -24334, 69.86779, 115.1897 -24335, 66.85479, 97.71783 -24336, 69.74719, 126.6111 -24337, 65.94489, 132.2651 -24338, 65.87931, 103.3388 -24339, 64.62128, 101.6749 -24340, 68.54834, 130.3597 -24341, 67.92111, 123.939 -24342, 67.67285, 112.4801 -24343, 69.00279, 127.8311 -24344, 70.04797, 126.3484 -24345, 71.35258, 142.3712 -24346, 71.06775, 136.8046 -24347, 68.82243, 124.1371 -24348, 67.96857, 118.8369 -24349, 68.05889, 124.9371 -24350, 67.93692, 130.9467 -24351, 69.45398, 127.8837 -24352, 71.28182, 145.4692 -24353, 67.69446, 134.3376 -24354, 71.04547, 140.9563 -24355, 67.17175, 130.1958 -24356, 67.73543, 135.5123 -24357, 68.89435, 149.0303 -24358, 68.96831, 135.7274 -24359, 68.46784, 123.8383 -24360, 69.39747, 136.1145 -24361, 68.49673, 133.4028 -24362, 64.99401, 109.1885 -24363, 67.55392, 109.8925 -24364, 66.39846, 135.3121 -24365, 68.87766, 124.4382 -24366, 68.08728, 115.4819 -24367, 67.6748, 113.0279 -24368, 68.36341, 116.9069 -24369, 66.15639, 112.2191 -24370, 69.94863, 138.7619 -24371, 68.68161, 123.382 -24372, 65.57366, 108.7335 -24373, 67.47088, 124.634 -24374, 65.41412, 126.6553 -24375, 66.94215, 120.7258 -24376, 67.65712, 128.6122 -24377, 64.65079, 128.6303 -24378, 69.62877, 134.5557 -24379, 68.3735, 96.55141 -24380, 70.59634, 122.2144 -24381, 65.95534, 121.6048 -24382, 66.77646, 124.7321 -24383, 68.33367, 112.2217 -24384, 65.34891, 114.194 -24385, 70.0911, 138.6245 -24386, 66.96985, 128.6963 -24387, 69.5545, 109.8168 -24388, 68.5107, 136.2548 -24389, 67.75916, 114.7828 -24390, 67.28528, 156.6534 -24391, 69.10551, 135.7604 -24392, 70.04724, 118.1827 -24393, 67.97214, 130.4773 -24394, 64.98386, 100.1129 -24395, 67.57048, 125.9502 -24396, 65.91465, 107.5697 -24397, 70.47111, 140.7773 -24398, 67.52349, 126.2727 -24399, 68.45395, 134.877 -24400, 67.41775, 106.1401 -24401, 67.70655, 136.4734 -24402, 71.462, 148.1379 -24403, 66.73324, 128.8244 -24404, 64.50386, 105.9096 -24405, 69.11294, 127.3691 -24406, 69.38115, 129.7479 -24407, 68.33484, 127.2209 -24408, 69.29735, 126.0557 -24409, 68.37994, 135.6956 -24410, 68.96454, 134.9102 -24411, 70.49134, 133.6584 -24412, 70.57015, 134.172 -24413, 66.48853, 115.3811 -24414, 69.71507, 131.6692 -24415, 69.58669, 137.2034 -24416, 68.9727, 121.9887 -24417, 68.12075, 121.0738 -24418, 69.27581, 127.1409 -24419, 66.76377, 123.5561 -24420, 67.67916, 124.3837 -24421, 66.03738, 141.5574 -24422, 67.83577, 134.7204 -24423, 68.4144, 124.3957 -24424, 67.89829, 116.7193 -24425, 70.43392, 140.3597 -24426, 69.20164, 133.9186 -24427, 68.95842, 134.4443 -24428, 68.42838, 125.6241 -24429, 70.98873, 151.5456 -24430, 67.32737, 144.3687 -24431, 68.48893, 108.1511 -24432, 68.6021, 113.2208 -24433, 68.81368, 123.9034 -24434, 70.77293, 125.3918 -24435, 64.76018, 123.5229 -24436, 69.93755, 131.4882 -24437, 66.73936, 136.6536 -24438, 69.99554, 140.237 -24439, 69.93809, 139.2643 -24440, 68.76645, 140.7663 -24441, 65.93075, 122.8422 -24442, 65.71357, 110.0107 -24443, 69.81803, 135.7896 -24444, 65.60202, 122.6465 -24445, 69.04719, 110.6967 -24446, 71.79083, 116.5191 -24447, 65.47357, 130.9999 -24448, 68.56939, 121.2454 -24449, 67.3586, 113.1476 -24450, 69.31713, 118.5719 -24451, 68.04311, 140.9153 -24452, 70.58559, 140.6903 -24453, 65.81808, 116.2507 -24454, 69.49135, 130.3794 -24455, 67.24822, 121.8022 -24456, 67.92553, 126.7836 -24457, 70.37417, 153.1035 -24458, 67.27196, 126.1286 -24459, 71.48238, 143.7516 -24460, 68.10255, 137.9851 -24461, 67.81752, 114.8164 -24462, 64.53079, 100.9189 -24463, 66.93004, 122.4382 -24464, 67.74549, 128.7442 -24465, 69.06341, 144.9266 -24466, 68.05135, 131.0403 -24467, 65.22274, 113.4175 -24468, 70.59627, 132.1285 -24469, 66.67924, 123.53 -24470, 67.09362, 112.9607 -24471, 67.34935, 132.3745 -24472, 68.25905, 117.2967 -24473, 71.51413, 141.4801 -24474, 69.19176, 136.2781 -24475, 68.85149, 119.5382 -24476, 62.68591, 118.6002 -24477, 68.93339, 126.4631 -24478, 66.81582, 131.0701 -24479, 68.82523, 119.6506 -24480, 67.79889, 111.5895 -24481, 70.56176, 131.7029 -24482, 63.76528, 109.2093 -24483, 68.69047, 123.393 -24484, 68.5612, 133.2161 -24485, 65.9104, 135.1969 -24486, 69.50434, 154.9778 -24487, 67.01715, 103.3397 -24488, 67.42555, 112.6464 -24489, 69.80123, 123.7655 -24490, 69.35558, 142.1629 -24491, 69.40991, 134.6446 -24492, 68.14932, 124.156 -24493, 67.49197, 136.9491 -24494, 67.83128, 116.3515 -24495, 66.88311, 136.024 -24496, 66.16765, 112.1413 -24497, 68.34192, 148.7264 -24498, 68.47918, 115.6665 -24499, 64.1332, 126.2502 -24500, 69.76909, 137.5824 -24501, 67.87052, 128.4015 -24502, 65.65317, 122.6266 -24503, 69.10982, 127.845 -24504, 70.2136, 146.6532 -24505, 68.12511, 116.4182 -24506, 69.1089, 127.5322 -24507, 68.13285, 118.1504 -24508, 68.15041, 125.8468 -24509, 67.31379, 125.7108 -24510, 67.00484, 120.302 -24511, 67.77523, 136.9514 -24512, 67.94501, 124.8842 -24513, 69.49863, 107.795 -24514, 69.69959, 138.8638 -24515, 69.73603, 125.7504 -24516, 67.035, 110.6978 -24517, 68.55387, 106.0953 -24518, 67.66663, 118.1357 -24519, 68.19234, 130.5155 -24520, 67.83603, 125.6357 -24521, 65.6042, 121.2924 -24522, 70.79237, 135.705 -24523, 65.90734, 130.6877 -24524, 67.40279, 133.5585 -24525, 69.0652, 126.5715 -24526, 67.07127, 125.1982 -24527, 67.34987, 120.7703 -24528, 69.87618, 136.4152 -24529, 68.61786, 120.8313 -24530, 67.86452, 123.3904 -24531, 67.18841, 118.1254 -24532, 67.91023, 128.8423 -24533, 67.88438, 119.5715 -24534, 68.44835, 110.7671 -24535, 68.91398, 133.9166 -24536, 66.93704, 134.2708 -24537, 67.98509, 136.7816 -24538, 68.2376, 118.9982 -24539, 67.13801, 110.5575 -24540, 69.36053, 135.8541 -24541, 70.23741, 119.0039 -24542, 69.67473, 128.7848 -24543, 67.02658, 119.5814 -24544, 67.08012, 109.6164 -24545, 66.45348, 122.2987 -24546, 67.14627, 144.1873 -24547, 68.5299, 124.2064 -24548, 68.18035, 131.4399 -24549, 69.18019, 129.5663 -24550, 68.15579, 109.4756 -24551, 68.08451, 125.4961 -24552, 69.12967, 117.7697 -24553, 65.66134, 108.8434 -24554, 66.8266, 137.9539 -24555, 67.976, 125.9379 -24556, 68.6367, 126.662 -24557, 68.20125, 119.4097 -24558, 66.30752, 108.9388 -24559, 68.67523, 135.9253 -24560, 70.75177, 133.3227 -24561, 69.90591, 116.5433 -24562, 67.49121, 127.443 -24563, 69.43309, 126.7096 -24564, 66.64931, 119.9884 -24565, 67.25339, 122.7744 -24566, 70.0799, 116.5472 -24567, 67.30768, 124.8544 -24568, 68.90363, 139.9568 -24569, 67.79094, 134.4678 -24570, 70.02139, 141.1502 -24571, 65.08493, 113.6042 -24572, 68.00621, 143.7361 -24573, 72.3989, 144.9316 -24574, 67.83748, 132.585 -24575, 65.7028, 105.2162 -24576, 70.01957, 140.611 -24577, 67.87733, 116.6834 -24578, 70.66031, 122.3103 -24579, 69.84654, 131.7426 -24580, 67.08101, 123.8231 -24581, 68.19996, 120.8464 -24582, 66.47189, 117.481 -24583, 67.35479, 120.6077 -24584, 68.02985, 124.8289 -24585, 64.52777, 117.4798 -24586, 64.72981, 104.3111 -24587, 66.31479, 118.3695 -24588, 69.28443, 129.8202 -24589, 68.38512, 139.6485 -24590, 68.48504, 121.7782 -24591, 69.8409, 123.0627 -24592, 69.00164, 114.0904 -24593, 67.46717, 156.2682 -24594, 68.50704, 132.7862 -24595, 67.54149, 128.4227 -24596, 69.81014, 123.0582 -24597, 70.30911, 139.2419 -24598, 69.1204, 140.173 -24599, 71.55865, 136.6 -24600, 67.95604, 117.8046 -24601, 67.67595, 123.2158 -24602, 67.08059, 106.8189 -24603, 67.36378, 126.5004 -24604, 70.55218, 126.8437 -24605, 68.21612, 119.5574 -24606, 68.7151, 125.9951 -24607, 66.02245, 124.6736 -24608, 68.03719, 132.4732 -24609, 70.51604, 118.7315 -24610, 70.10402, 144.5009 -24611, 66.56804, 82.38298 -24612, 65.94065, 108.8379 -24613, 66.38829, 127.2815 -24614, 67.30654, 136.3496 -24615, 66.90193, 127.6108 -24616, 67.13761, 137.002 -24617, 68.93483, 143.9311 -24618, 67.95125, 118.8796 -24619, 72.47908, 148.1097 -24620, 65.52562, 123.3728 -24621, 69.32351, 146.246 -24622, 65.6099, 100.6414 -24623, 68.6201, 126.8121 -24624, 71.50024, 127.348 -24625, 66.67496, 115.2416 -24626, 66.73827, 129.1676 -24627, 67.26376, 128.3665 -24628, 69.70493, 139.7124 -24629, 69.81408, 111.8786 -24630, 69.24356, 155.8277 -24631, 63.65376, 110.0774 -24632, 67.32789, 137.1865 -24633, 68.6961, 132.4999 -24634, 66.62465, 120.2693 -24635, 69.65054, 142.7088 -24636, 69.0893, 137.7905 -24637, 66.75728, 110.8487 -24638, 66.06512, 106.9734 -24639, 66.00171, 115.4981 -24640, 68.70707, 101.3046 -24641, 69.29616, 136.4906 -24642, 68.68899, 138.3325 -24643, 69.36066, 141.9455 -24644, 71.21016, 133.633 -24645, 70.61617, 152.795 -24646, 66.60166, 131.846 -24647, 63.46025, 109.3417 -24648, 66.80019, 120.0755 -24649, 69.89469, 123.1536 -24650, 66.03755, 134.4459 -24651, 69.79279, 131.8303 -24652, 67.67011, 119.6221 -24653, 68.61358, 127.661 -24654, 67.29594, 119.9302 -24655, 68.06416, 126.1776 -24656, 67.08852, 133.3623 -24657, 67.22083, 133.1829 -24658, 68.52246, 121.9621 -24659, 69.21039, 126.6402 -24660, 68.11211, 125.7575 -24661, 69.80387, 128.2476 -24662, 64.30007, 108.2215 -24663, 67.06097, 135.8275 -24664, 65.65425, 108.0972 -24665, 71.03311, 137.8075 -24666, 67.66624, 121.9512 -24667, 65.33739, 121.2757 -24668, 69.54907, 124.4711 -24669, 67.45198, 109.1739 -24670, 67.84408, 110.1037 -24671, 69.48408, 122.6883 -24672, 66.19564, 122.6215 -24673, 68.96582, 125.7875 -24674, 68.91695, 122.4138 -24675, 67.15888, 115.731 -24676, 67.34512, 126.434 -24677, 68.00353, 131.0691 -24678, 68.05897, 115.6045 -24679, 67.12385, 130.4915 -24680, 68.24874, 123.1214 -24681, 70.06522, 132.9338 -24682, 67.50053, 119.1866 -24683, 69.12516, 131.2341 -24684, 69.0494, 137.1193 -24685, 67.66576, 120.0164 -24686, 69.54628, 124.9586 -24687, 68.28689, 135.0333 -24688, 69.39337, 112.8113 -24689, 67.30725, 120.8673 -24690, 68.34316, 139.0949 -24691, 70.90294, 143.8781 -24692, 64.06894, 99.60932 -24693, 67.2224, 121.3802 -24694, 68.69563, 137.2314 -24695, 66.13861, 120.2833 -24696, 69.54627, 137.3543 -24697, 66.14098, 125.3429 -24698, 70.63782, 151.2378 -24699, 70.03612, 125.3728 -24700, 67.57137, 122.2741 -24701, 66.91088, 107.3063 -24702, 66.91607, 120.8614 -24703, 68.68646, 137.1089 -24704, 66.02934, 132.9201 -24705, 67.42776, 113.7439 -24706, 69.3031, 134.3583 -24707, 69.24989, 121.6875 -24708, 68.89261, 133.0703 -24709, 68.86091, 126.9811 -24710, 71.90873, 134.0201 -24711, 68.26643, 129.7587 -24712, 66.59322, 113.153 -24713, 66.0497, 118.9106 -24714, 68.50987, 127.3332 -24715, 66.95287, 137.0653 -24716, 71.03063, 146.9723 -24717, 63.58121, 115.9351 -24718, 63.76497, 105.0288 -24719, 69.72296, 150.2475 -24720, 65.84023, 117.7307 -24721, 70.61722, 131.0053 -24722, 66.82089, 128.8345 -24723, 69.07869, 145.6238 -24724, 68.57406, 137.2053 -24725, 71.25702, 145.0337 -24726, 67.41157, 119.5434 -24727, 68.96896, 128.9336 -24728, 70.51128, 104.2914 -24729, 66.62109, 126.2567 -24730, 68.26107, 135.6492 -24731, 69.25005, 133.5514 -24732, 70.66498, 138.3137 -24733, 67.44799, 131.5456 -24734, 70.61052, 142.5544 -24735, 69.05707, 136.4888 -24736, 69.5556, 127.1593 -24737, 65.79335, 119.5829 -24738, 68.90813, 119.1438 -24739, 65.86615, 129.2224 -24740, 67.75381, 136.0158 -24741, 66.97192, 133.622 -24742, 67.12818, 138.6191 -24743, 68.03631, 112.7006 -24744, 69.2586, 132.689 -24745, 64.37881, 116.5423 -24746, 69.10476, 128.0676 -24747, 70.68086, 141.9627 -24748, 69.89281, 137.2342 -24749, 63.33113, 95.95417 -24750, 69.87096, 149.8839 -24751, 70.82192, 159.6344 -24752, 66.07971, 122.306 -24753, 71.10476, 114.7871 -24754, 68.65665, 117.2339 -24755, 65.5231, 123.7407 -24756, 69.2472, 119.0934 -24757, 70.19913, 124.0875 -24758, 68.23477, 115.1977 -24759, 70.12196, 127.7892 -24760, 66.798, 131.6398 -24761, 68.57737, 136.7561 -24762, 70.78151, 150.7636 -24763, 68.655, 134.1977 -24764, 70.04789, 116.0917 -24765, 67.3824, 131.8669 -24766, 69.704, 132.2823 -24767, 65.43275, 111.7034 -24768, 67.87092, 135.3133 -24769, 69.639, 122.774 -24770, 69.50107, 137.5292 -24771, 70.5769, 150.9049 -24772, 67.32704, 130.0925 -24773, 69.03615, 122.4746 -24774, 70.38448, 150.0339 -24775, 66.86316, 135.1726 -24776, 69.96058, 124.1244 -24777, 66.77948, 115.1505 -24778, 67.50335, 99.40058 -24779, 68.56426, 132.2101 -24780, 70.76528, 130.1221 -24781, 68.32253, 140.2104 -24782, 63.28029, 116.0598 -24783, 68.40535, 127.717 -24784, 70.47769, 132.7392 -24785, 70.92832, 133.3631 -24786, 68.42345, 121.5013 -24787, 68.17552, 113.1516 -24788, 71.41075, 126.4088 -24789, 70.02405, 138.9673 -24790, 70.06857, 132.7965 -24791, 67.87559, 131.4173 -24792, 68.09801, 132.7242 -24793, 67.93416, 125.6174 -24794, 70.56894, 127.3602 -24795, 64.3262, 114.3648 -24796, 67.77195, 114.3845 -24797, 67.75367, 113.554 -24798, 63.71439, 122.1264 -24799, 69.09925, 120.2482 -24800, 69.85179, 130.2025 -24801, 69.44092, 144.8549 -24802, 74.53177, 148.9104 -24803, 66.33132, 119.6675 -24804, 68.81086, 129.9323 -24805, 69.2946, 139.9604 -24806, 71.14495, 131.3502 -24807, 68.97051, 147.5332 -24808, 68.59823, 120.6693 -24809, 69.32375, 132.5228 -24810, 67.18403, 133.9888 -24811, 63.95584, 101.1775 -24812, 67.30139, 140.5981 -24813, 68.32525, 120.9681 -24814, 66.36458, 116.3494 -24815, 67.05441, 115.7106 -24816, 66.72856, 125.3558 -24817, 69.17136, 127.4447 -24818, 66.72634, 129.8871 -24819, 67.53447, 126.6146 -24820, 70.64693, 125.0381 -24821, 68.94919, 134.1113 -24822, 67.44368, 123.2024 -24823, 68.36479, 133.7593 -24824, 66.0173, 126.6746 -24825, 66.34051, 133.865 -24826, 69.11356, 140.5328 -24827, 66.78433, 146.9803 -24828, 64.69758, 116.5596 -24829, 67.88323, 132.9397 -24830, 70.79391, 140.861 -24831, 67.33031, 128.9386 -24832, 67.47175, 143.136 -24833, 71.1465, 131.7157 -24834, 71.09999, 132.7978 -24835, 67.31941, 117.9554 -24836, 65.17339, 94.40946 -24837, 70.79803, 141.7186 -24838, 70.54927, 150.3874 -24839, 68.88799, 114.2215 -24840, 65.19756, 127.3357 -24841, 67.13424, 126.6348 -24842, 70.79421, 134.6936 -24843, 66.08314, 116.8418 -24844, 67.55002, 122.1483 -24845, 67.74689, 132.8739 -24846, 70.05674, 146.0524 -24847, 69.39883, 144.6262 -24848, 69.51891, 120.1586 -24849, 67.9384, 125.9966 -24850, 63.84585, 135.1763 -24851, 68.53891, 134.0518 -24852, 65.58522, 127.3106 -24853, 66.56404, 97.80735 -24854, 67.21341, 137.2553 -24855, 67.11996, 105.438 -24856, 69.32371, 126.5148 -24857, 67.61647, 118.4966 -24858, 69.57478, 128.6012 -24859, 67.84663, 123.7062 -24860, 67.23558, 122.2566 -24861, 69.88379, 130.9158 -24862, 68.99994, 121.1935 -24863, 68.60312, 123.1076 -24864, 68.77791, 125.3572 -24865, 70.55859, 131.2843 -24866, 67.51836, 117.6823 -24867, 67.56651, 113.9729 -24868, 70.44326, 127.4526 -24869, 63.23624, 97.99816 -24870, 66.40576, 128.5103 -24871, 68.15859, 124.2586 -24872, 64.07289, 123.1365 -24873, 68.55598, 122.4432 -24874, 68.43131, 133.9318 -24875, 65.87921, 104.357 -24876, 66.68998, 128.4557 -24877, 65.95774, 127.8589 -24878, 70.30346, 137.8967 -24879, 69.37067, 120.4668 -24880, 67.55136, 133.2016 -24881, 64.66626, 117.3698 -24882, 66.40245, 132.6795 -24883, 70.0332, 134.9364 -24884, 73.06241, 141.5054 -24885, 67.73969, 107.6256 -24886, 69.27968, 139.7764 -24887, 64.56023, 114.473 -24888, 65.17345, 108.0286 -24889, 64.743, 106.8072 -24890, 71.01048, 161.8532 -24891, 69.12531, 149.3248 -24892, 68.90616, 144.6759 -24893, 69.68608, 134.7518 -24894, 70.89186, 139.6818 -24895, 66.75426, 130.7951 -24896, 66.84764, 112.43 -24897, 66.61327, 142.2755 -24898, 66.99191, 142.8088 -24899, 66.95526, 127.3362 -24900, 66.7864, 123.7754 -24901, 65.2558, 116.3788 -24902, 69.03557, 118.6868 -24903, 66.66842, 116.0167 -24904, 68.05827, 125.0539 -24905, 69.48675, 135.636 -24906, 69.11476, 132.8803 -24907, 69.57141, 126.5902 -24908, 68.45513, 119.3317 -24909, 67.61, 111.8791 -24910, 66.36029, 115.9904 -24911, 70.97938, 126.1772 -24912, 66.14233, 133.6664 -24913, 66.30402, 118.3665 -24914, 68.26234, 139.7222 -24915, 67.85823, 147.5064 -24916, 65.5061, 121.6958 -24917, 68.70761, 121.3583 -24918, 71.44954, 134.5787 -24919, 66.66413, 118.4386 -24920, 66.54027, 130.0576 -24921, 67.98947, 116.3439 -24922, 72.54953, 134.5143 -24923, 68.89705, 134.2033 -24924, 66.37489, 123.3152 -24925, 69.7564, 128.2928 -24926, 66.44678, 129.8237 -24927, 71.69485, 154.4811 -24928, 66.08091, 118.3239 -24929, 65.3417, 119.2852 -24930, 69.04974, 130.828 -24931, 65.11765, 99.42378 -24932, 69.44092, 141.7658 -24933, 66.63354, 123.5755 -24934, 69.01315, 136.6985 -24935, 67.57383, 135.223 -24936, 67.40523, 132.959 -24937, 67.01858, 122.8513 -24938, 65.90423, 115.7491 -24939, 70.35191, 118.6196 -24940, 72.35889, 143.9547 -24941, 68.90635, 135.0866 -24942, 68.40219, 109.4203 -24943, 68.51074, 139.2417 -24944, 68.94331, 128.0522 -24945, 67.83501, 125.6535 -24946, 67.62827, 122.4244 -24947, 67.79448, 121.2228 -24948, 69.17056, 154.7821 -24949, 67.9537, 126.585 -24950, 64.22634, 113.0611 -24951, 68.9995, 133.888 -24952, 68.21355, 131.1211 -24953, 67.77936, 122.7164 -24954, 67.83418, 138.3443 -24955, 66.69014, 119.1199 -24956, 67.54476, 104.238 -24957, 68.02864, 117.1596 -24958, 69.83059, 134.0241 -24959, 66.76934, 120.2857 -24960, 70.14626, 132.2209 -24961, 68.92465, 106.3021 -24962, 69.11543, 133.8436 -24963, 66.43732, 133.2403 -24964, 68.46555, 124.7422 -24965, 66.34781, 128.061 -24966, 66.7366, 124.5938 -24967, 66.08128, 130.3096 -24968, 66.55957, 115.0486 -24969, 69.08296, 127.4722 -24970, 63.61791, 115.7477 -24971, 65.37753, 126.6102 -24972, 67.4972, 122.9844 -24973, 68.70055, 123.2849 -24974, 71.32072, 125.5928 -24975, 65.57216, 123.7128 -24976, 66.19147, 123.2446 -24977, 70.06322, 115.418 -24978, 67.24989, 108.7178 -24979, 69.624, 141.5823 -24980, 66.7896, 120.8863 -24981, 69.79922, 154.4399 -24982, 66.30104, 107.3901 -24983, 68.36249, 118.7207 -24984, 63.77967, 111.4911 -24985, 67.58699, 127.7214 -24986, 69.71587, 133.9126 -24987, 68.81291, 120.8176 -24988, 68.86794, 142.8494 -24989, 66.10137, 103.381 -24990, 70.11839, 141.237 -24991, 69.97767, 125.3672 -24992, 71.91656, 128.284 -24993, 70.96218, 146.1936 -24994, 66.19462, 118.7974 -24995, 67.21126, 127.6603 -24996, 69.50215, 118.0312 -24997, 64.54826, 120.1932 -24998, 64.69855, 118.2655 -24999, 67.52918, 132.2682 -25000, 68.87761, 124.8742 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 -1,1,1 -1,2,3 diff --git a/DataStructures/CSVFile/testData2.csv b/DataStructures/CSVFile/testData2.csv deleted file mode 100644 index 1b8f19d..0000000 --- a/DataStructures/CSVFile/testData2.csv +++ /dev/null @@ -1,3 +0,0 @@ -id, height, width -1, 65.78331, 112.9925 -12, 67.62333, 114.143 diff --git a/DataStructures/CSVFile/testData3.csv b/DataStructures/CSVFile/testData3.csv deleted file mode 100644 index 8583b71..0000000 --- a/DataStructures/CSVFile/testData3.csv +++ /dev/null @@ -1 +0,0 @@ -id, height, width diff --git a/DataStructures/CSVFile/testData4.csv b/DataStructures/CSVFile/testData4.csv deleted file mode 100644 index 1c06bd9..0000000 --- a/DataStructures/CSVFile/testData4.csv +++ /dev/null @@ -1,7 +0,0 @@ -1,65.78331,112.9925 -2,71.51521,136.4873 -3,69.39874,153.0269 -4,68.2166,142.3354 -5,67.78781,144.2971 -7,69.80204,141.4947 -8,70.01472,80 diff --git a/DataStructures/Graphs/BFS.java b/DataStructures/Graphs/BFS.java deleted file mode 100644 index d06a660..0000000 --- a/DataStructures/Graphs/BFS.java +++ /dev/null @@ -1,62 +0,0 @@ -import java.util.*; - -/** - * Implementation of a Breadth First Search - * - * @author Unknown - * - */ -public class BFS{ - - /** - * The BFS implemented in code to use. - * - * @param a Structure to perform the search on a graph, adjacency matrix etc. - * @param vertices The vertices to use - * @param source The Source - */ - public static void bfsImplement(byte [][] a,int vertices,int source){ //passing adjacency matrix and no of vertices - byte []b=new byte[vertices]; //flag container containing status of each vertices - Arrays.fill(b,(byte)-1); //status initialization - /* code status - -1 = ready - 0 = waiting - 1 = processed */ - - Stack st = new Stack(vertices); //operational stack - st.push(source); //assigning source - while(!st.isEmpty()){ - b[st.peek()]=(byte)0; //assigning waiting status - System.out.println(st.peek()); - int pop=st.peek(); - b[pop]=(byte)1; //assigning processed status - st.pop(); //removing head of the queue - for(int i=0;idist[arr[j].u]+arr[j].w) - { - dist[arr[j].v]=dist[arr[j].u]+arr[j].w;//Update - p[arr[j].v]=arr[j].u; - } - } - } - //Final cycle for negative checking - for(j=0;jdist[arr[j].u]+arr[j].w) - { - neg=1; - System.out.println("Negative cycle"); - break; - } - if(neg==0)//Go ahead and show results of computaion - { - System.out.println("Distances are: "); - for(i=0;idist[arr[j].u]+arr[j].w) - { - dist[arr[j].v]=dist[arr[j].u]+arr[j].w;//Update - p[arr[j].v]=arr[j].u; - } - } - } - //Final cycle for negative checking - for(j=0;jdist[arr[j].u]+arr[j].w) - { - neg=1; - System.out.println("Negative cycle"); - break; - } - if(neg==0)//Go ahead and show results of computaion - { - System.out.println("Distance is: "+dist[end]); - System.out.println("Path followed:"); - System.out.print(source+" "); - printPath(p,end); - System.out.println(); - } - } - /** - *@param x Source Vertex - * @param y End vertex - * @param z Weight - */ - public void addEdge(int x,int y,int z)//Adds unidirectionl Edge - { - edges[index++]=new Edge(x,y,z); - } - public Edge[] getEdgeArray() - { - return edges; - } -} \ No newline at end of file diff --git a/DataStructures/Graphs/ConnectedComponent.java b/DataStructures/Graphs/ConnectedComponent.java deleted file mode 100644 index 779d7a8..0000000 --- a/DataStructures/Graphs/ConnectedComponent.java +++ /dev/null @@ -1,150 +0,0 @@ -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; - -/** - * A class that counts the number of different connected components in a graph - * - * @author Lukas Keul, Florian Mercks - * - */ -class Graph> { - - class Node { - E name; - - public Node(E name) { - this.name = name; - } - } - - class Edge { - Node startNode, endNode; - - public Edge(Node startNode, Node endNode) { - this.startNode = startNode; - this.endNode = endNode; - } - } - - ArrayList edgeList; - ArrayList nodeList; - - public Graph() { - edgeList = new ArrayList(); - nodeList = new ArrayList(); - } - - /** - * Adds a new Edge to the graph. If the nodes aren't yet in nodeList, they - * will be added to it. - * - * @param startNode - * the starting Node from the edge - * - * @param endNode - * the ending Node from the edge - */ - public void addEdge(E startNode, E endNode) { - Node start = null, end = null; - for (Node node : nodeList) { - if (startNode.compareTo(node.name) == 0) { - start = node; - } - else if (endNode.compareTo(node.name) == 0) { - end = node; - } - } - if (start == null) { - start = new Node(startNode); - nodeList.add(start); - } - if (end == null) { - end = new Node(endNode); - nodeList.add(end); - } - - edgeList.add(new Edge(start, end)); - } - - /** - * Main method used for counting the connected components. Iterates through - * the array of nodes to do a depth first search to get all nodes of the - * graph from the actual node. These nodes are added to the array - * markedNodes and will be ignored if they are chosen in the nodeList. - * - * @return returns the amount of unconnected graphs - * - */ - public int countGraphs() { - int count = 0; - Set markedNodes = new HashSet(); - - for (Node n : nodeList) { - if (!markedNodes.contains(n)) { - markedNodes.add(n); - markedNodes.addAll(depthFirstSearch(n, new ArrayList())); - count++; - } - } - - return count; - } - - /** - * Implementation of depth first search. - * - * @param n - * the actual visiting node - * - * @param visited - * A list of already visited nodes in the depth first search - * - * @return returns a set of visited nodes - * - */ - public ArrayList depthFirstSearch(Node n, ArrayList visited) { - visited.add(n); - for (Edge e : edgeList) { - if (e.startNode.equals(n) && !visited.contains(e.endNode)) { - depthFirstSearch(e.endNode, visited); - } - } - return visited; - } -} - -public class ConnectedComponent { - - public static void main(String[] args) { - Graph graphChars = new Graph(); - - // Graph 1 - graphChars.addEdge('a', 'b'); - graphChars.addEdge('a', 'e'); - graphChars.addEdge('b', 'e'); - graphChars.addEdge('b', 'c'); - graphChars.addEdge('c', 'd'); - graphChars.addEdge('d', 'a'); - - graphChars.addEdge('x', 'y'); - graphChars.addEdge('x', 'z'); - - graphChars.addEdge('w', 'w'); - - Graph graphInts = new Graph(); - - // Graph 2 - graphInts.addEdge(1, 2); - graphInts.addEdge(2, 3); - graphInts.addEdge(2, 4); - graphInts.addEdge(3, 5); - - graphInts.addEdge(7, 8); - graphInts.addEdge(8, 10); - graphInts.addEdge(10, 8); - - System.out.println("Amount of different char-graphs: " + graphChars.countGraphs()); - System.out.println("Amount of different int-graphs: " + graphInts.countGraphs()); - } -} diff --git a/DataStructures/Graphs/DFS.java b/DataStructures/Graphs/DFS.java deleted file mode 100644 index 747fcbe..0000000 --- a/DataStructures/Graphs/DFS.java +++ /dev/null @@ -1,63 +0,0 @@ -import java.util.*; - -/** - * Implementation of a Depth First Search - * - * @author Unknown - * - */ - -public class DFS{ - - /** - * Implementation in code of a DFS - * - * @param a structure to be DFS'ed - * @param vertices The vertices - * @param source The source - */ - public static void dfsImplement(byte [][] a,int vertices,int source){ //passing adjacency matrix and no of vertices - byte []b=new byte[vertices]; //flag container containing status of each vertices - Arrays.fill(b,(byte)-1); //status initialization - /* code status - -1 = ready - 0 = waiting - 1 = processed */ - - - Stack st=new Stack(vertices); //operational stack - st.push(source); //assigning source - while(!st.isEmpty()){ - b[st.peek()]=(byte)0; //assigning waiting status - System.out.println(st.peek()); - int pop=st.pop(); - b[pop]=(byte)1; //assigning processed status - for(int i=0;i> { - - ArrayList verticies; - - public AdjacencyListGraph() { - verticies = new ArrayList<>(); - } - - private class Vertex { - E data; - ArrayList adjacentVerticies; - - public Vertex(E data) { - adjacentVerticies = new ArrayList<>(); - this.data = data; - } - - public boolean addAdjacentVertex(Vertex to) { - for (Vertex v: adjacentVerticies) { - if (v.data.compareTo(to.data) == 0) { - return false; // the edge already exists - } - } - return adjacentVerticies.add(to); // this will return true; - } - - public boolean removeAdjacentVertex(E to) { - // use indexes here so it is possible to - // remove easily without implementing - // equals method that ArrayList.remove(Object o) uses - for (int i = 0; i < adjacentVerticies.size(); i++) { - if (adjacentVerticies.get(i).data.compareTo(to) == 0) { - adjacentVerticies.remove(i); - return true; - } - } - return false; - } - } - - /** - * this method removes an edge from the graph between two specified - * verticies - * - * @param from the data of the vertex the edge is from - * @param to the data of the vertex the edge is going to - * @return returns false if the edge doesn't exist, returns true if the edge exists and is removed - */ - public boolean removeEdge(E from, E to) { - Vertex fromV = null; - for (Vertex v: verticies) { - if (from.compareTo(v.data) == 0) { - fromV = v; - break; - } - } - if (fromV == null) return false; - return fromV.removeAdjacentVertex(to); - } - /** - * this method adds an edge to the graph between two specified - * verticies - * - * @param from the data of the vertex the edge is from - * @param to the data of the vertex the edge is going to - * @return returns true if the edge did not exist, return false if it already did - */ - public boolean addEdge(E from, E to) { - Vertex fromV = null, toV = null; - for (Vertex v: verticies) { - if (from.compareTo(v.data) == 0) { // see if from vertex already exists - fromV = v; - } else if (to.compareTo(v.data) == 0) { // see if to vertex already exists - toV = v; - } - if (fromV != null && toV != null) break; // both nodes exist so stop searching - } - if (fromV == null) { - fromV = new Vertex(from); - verticies.add(fromV); - } - if (toV == null) { - toV = new Vertex(to); - verticies.add(toV); - } - return fromV.addAdjacentVertex(toV); - } - - /** - * this gives a list of verticies in the graph and their adjacencies - * - * @return returns a string describing this graph - */ - public String toString() { - StringBuilder sb = new StringBuilder(); - for (Vertex v: verticies) { - sb.append("Vertex: "); - sb.append(v.data); - sb.append("\n"); - sb.append("Adjacent verticies: "); - for (Vertex v2: v.adjacentVerticies) { - sb.append(v2.data); - sb.append(" "); - } - sb.append("\n"); - } - return sb.toString(); - } -} - -public class Graphs { - - public static void main(String args[]) { - AdjacencyListGraph graph = new AdjacencyListGraph<>(); - assert graph.addEdge(1, 2); - assert graph.addEdge(1, 5); - assert graph.addEdge(2, 5); - assert !graph.addEdge(1, 2); - assert graph.addEdge(2, 3); - assert graph.addEdge(3, 4); - assert graph.addEdge(4, 1); - assert !graph.addEdge(2, 3); - System.out.println(graph); - } - -} diff --git a/DataStructures/Graphs/KruskalsAlgorithm.java b/DataStructures/Graphs/KruskalsAlgorithm.java deleted file mode 100644 index 6fc8412..0000000 --- a/DataStructures/Graphs/KruskalsAlgorithm.java +++ /dev/null @@ -1,174 +0,0 @@ -// Java program for Kruskal's algorithm to find Minimum Spanning Tree -// of a given connected, undirected and weighted graph -import java.util.*; -import java.lang.*; -import java.io.*; - -class Graph -{ - // A class to represent a graph edge - class Edge implements Comparable - { - int src, dest, weight; - - // Comparator function used for sorting edges based on - // their weight - public int compareTo(Edge compareEdge) - { - return this.weight-compareEdge.weight; - } - }; - - // A class to represent a subset for union-find - class subset - { - int parent, rank; - }; - - int V, E; // V-> no. of vertices & E->no.of edges - Edge edge[]; // collection of all edges - - // Creates a graph with V vertices and E edges - Graph(int v, int e) - { - V = v; - E = e; - edge = new Edge[E]; - for (int i=0; i subsets[yroot].rank) - subsets[yroot].parent = xroot; - - // If ranks are same, then make one as root and increment - // its rank by one - else - { - subsets[yroot].parent = xroot; - subsets[xroot].rank++; - } - } - - // The main function to construct MST using Kruskal's algorithm - void KruskalMST() - { - Edge result[] = new Edge[V]; // Tnis will store the resultant MST - int e = 0; // An index variable, used for result[] - int i = 0; // An index variable, used for sorted edges - for (i=0; i= 0 && aVertex < this.numberOfVertices()) { - return true; - } else { - return false; - } - } - - public boolean edgeDoesExist(int from, int to) { - if (this.vertexDoesExist(from) && this.vertexDoesExist(to)) { - return (this.adjacencyOfEdgeDoesExist(from, to)); - } - - return false; - } - - /** - * This method adds an edge to the graph between two specified - * vertices - * - * @param from the data of the vertex the edge is from - * @param to the data of the vertex the edge is going to - * @return returns true if the edge did not exist, return false if it already did - */ - public boolean addEdge(int from, int to) { - if (this.vertexDoesExist(from) && this.vertexDoesExist(to)) { - if (!this.adjacencyOfEdgeDoesExist(from, to)) { - this.adjacency()[from][to] = AdjacencyMatrixGraph.EDGE_EXIST; - this.adjacency()[to][from] = AdjacencyMatrixGraph.EDGE_EXIST; - this.setNumberOfEdges(this.numberOfEdges() + 1); - return true; - } - } - - return false; - } - - /** - * this method removes an edge from the graph between two specified - * vertices - * - * @param from the data of the vertex the edge is from - * @param to the data of the vertex the edge is going to - * @return returns false if the edge doesn't exist, returns true if the edge exists and is removed - */ - public boolean removeEdge(int from, int to) { - if(!this.vertexDoesExist(from) || !this.vertexDoesExist(to)) { - if (this.adjacencyOfEdgeDoesExist(from, to)) { - this.adjacency()[from][to] = AdjacencyMatrixGraph.EDGE_NONE; - this.adjacency()[to][from] = AdjacencyMatrixGraph.EDGE_NONE; - this.setNumberOfEdges(this.numberOfEdges() - 1); - return true; - } - } - return false; - } - - /** - * this gives a list of vertices in the graph and their adjacencies - * - * @return returns a string describing this graph - */ - public String toString() { - String s = new String(); - s = " "; - for (int i = 0; i < this.numberOfVertices(); i++) { - s = s + String.valueOf(i) + " "; - } - s = s + " \n"; - - for (int i = 0; i < this.numberOfVertices(); i++) { - s = s + String.valueOf(i) + " : "; - for (int j = 0; j < this.numberOfVertices(); j++) { - s = s + String.valueOf(this._adjacency[i][j]) + " "; - } - s = s + "\n"; - } - return s; - } - -} diff --git a/DataStructures/Graphs/PrimMST.java b/DataStructures/Graphs/PrimMST.java deleted file mode 100644 index 2569505..0000000 --- a/DataStructures/Graphs/PrimMST.java +++ /dev/null @@ -1,114 +0,0 @@ -// A Java program for Prim's Minimum Spanning Tree (MST) algorithm. -//adjacency matrix representation of the graph - -import java.lang.*; - -class PrimMST -{ - // Number of vertices in the graph - private static final int V=5; - - // A utility function to find the vertex with minimum key - // value, from the set of vertices not yet included in MST - int minKey(int key[], Boolean mstSet[]) - { - // Initialize min value - int min = Integer.MAX_VALUE, min_index=-1; - - for (int v = 0; v < V; v++) - if (mstSet[v] == false && key[v] < min) - { - min = key[v]; - min_index = v; - } - - return min_index; - } - - // A utility function to print the constructed MST stored in - // parent[] - void printMST(int parent[], int n, int graph[][]) - { - System.out.println("Edge Weight"); - for (int i = 1; i < V; i++) - System.out.println(parent[i]+" - "+ i+" "+ - graph[i][parent[i]]); - } - - // Function to construct and print MST for a graph represented - // using adjacency matrix representation - void primMST(int graph[][]) - { - // Array to store constructed MST - int parent[] = new int[V]; - - // Key values used to pick minimum weight edge in cut - int key[] = new int [V]; - - // To represent set of vertices not yet included in MST - Boolean mstSet[] = new Boolean[V]; - - // Initialize all keys as INFINITE - for (int i = 0; i < V; i++) - { - key[i] = Integer.MAX_VALUE; - mstSet[i] = false; - } - - // Always include first 1st vertex in MST. - key[0] = 0; // Make key 0 so that this vertex is - // picked as first vertex - parent[0] = -1; // First node is always root of MST - - // The MST will have V vertices - for (int count = 0; count < V-1; count++) - { - // Pick thd minimum key vertex from the set of vertices - // not yet included in MST - int u = minKey(key, mstSet); - - // Add the picked vertex to the MST Set - mstSet[u] = true; - - // Update key value and parent index of the adjacent - // vertices of the picked vertex. Consider only those - // vertices which are not yet included in MST - for (int v = 0; v < V; v++) - - // graph[u][v] is non zero only for adjacent vertices of m - // mstSet[v] is false for vertices not yet included in MST - // Update the key only if graph[u][v] is smaller than key[v] - if (graph[u][v]!=0 && mstSet[v] == false && - graph[u][v] < key[v]) - { - parent[v] = u; - key[v] = graph[u][v]; - } - } - - // print the constructed MST - printMST(parent, V, graph); - } - - public static void main (String[] args) - { - /* Let us create the following graph - 2 3 - (0)--(1)--(2) - | / \ | - 6| 8/ \5 |7 - | / \ | - (3)-------(4) - 9 */ - PrimMST t = new PrimMST(); - int graph[][] = new int[][] {{0, 2, 0, 6, 0}, - {2, 0, 3, 8, 5}, - {0, 3, 0, 0, 7}, - {6, 8, 0, 0, 9}, - {0, 5, 7, 9, 0}, - }; - - // Print the solution - t.primMST(graph); - } -} diff --git a/DataStructures/HashMap/HashMap.java b/DataStructures/HashMap/HashMap.java deleted file mode 100644 index 1cce626..0000000 --- a/DataStructures/HashMap/HashMap.java +++ /dev/null @@ -1,283 +0,0 @@ -<<<<<<< HEAD:Data Structures/HashMap/HashMap.java - - -import java.util.ArrayList; -import java.util.LinkedList; - -public class HashMap { - public class hmnodes{ //HashMap nodes - K key; - V value; - } - - private int size=0; //size of hashmap - private LinkedList buckets[]; //array of addresses of list - - public HashMap(){ - buckets=new LinkedList[4]; //initially create bucket of any size - for(int i=0;i<4;i++) - buckets[i]=new LinkedList<>(); - } - - public void put(K key,V value) throws Exception{ - int bi=bucketIndex(key); //find the index,the new key will be inserted in linklist at that index - int fountAt=find(bi,key); //check if key already exists or not - if(fountAt==-1){ - hmnodes temp=new hmnodes(); //if doesn't exist create new node and insert - temp.key=key; - temp.value=value; - buckets[bi].addLast(temp); - this.size++; - }else{ - buckets[bi].get(fountAt).value=value;//if already exist modify the value - } - - double lambda = (this.size*1.0)/this.buckets.length; - if(lambda>2.0){ - rehash(); //rehashing function which will increase the size of bucket as soon as lambda exceeds 2.0 - } - - return; - } - - - public V get(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return null; - }else{ - return buckets[bi].get(fountAt).value; - } - } - - public V remove(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return null; - }else{ - this.size--; - return buckets[bi].remove(fountAt).value; - } - } - - public boolean containskey(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return false; - }else{ - return true; - } - } - - public int size(){ - return this.size; - } - - - public boolean isempty(){ - return this.size==0; - } - - public ArrayList keyset() throws Exception{ - ArrayList arr=new ArrayList<>(); - for(int i=0;i valueset() throws Exception{ - ArrayList arr=new ArrayList<>(); - for(int i=0;i"+temp.value+"]"); - } - System.out.println(); - } - } - - public int find(int bi,K key) throws Exception{ - for(int i=0;i ob[]= buckets; - buckets=new LinkedList[ob.length*2]; - for(int i=0;i(); - - size = 0; - for(int i=0;i { - public class hmnodes{ //HashMap nodes - K key; - V value; - } - - private int size=0; //size of hashmap - private LinkedList buckets[]; //array of addresses of list - - public HashMap(){ - buckets=new LinkedList[4]; //initially create bucket of any size - for(int i=0;i<4;i++) - buckets[i]=new LinkedList<>(); - } - - public void put(K key,V value) throws Exception{ - int bi=bucketIndex(key); //find the index,the new key will be inserted in linklist at that index - int fountAt=find(bi,key); //check if key already exists or not - if(fountAt==-1){ - hmnodes temp=new hmnodes(); //if doesn't exist create new node and insert - temp.key=key; - temp.value=value; - buckets[bi].addLast(temp); - this.size++; - }else{ - buckets[bi].get(fountAt).value=value;//if already exist modify the value - } - - double lambda = (this.size*1.0)/this.buckets.length; - if(lambda>2.0){ - rehash(); //rehashing function which will increase the size of bucket as soon as lambda exceeds 2.0 - } - - return; - } - - - public V get(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return null; - }else{ - return buckets[bi].get(fountAt).value; - } - } - - public V remove(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return null; - }else{ - this.size--; - return buckets[bi].remove(fountAt).value; - } - } - - public boolean containskey(K key) throws Exception{ - int bi=bucketIndex(key); - int fountAt=find(bi,key); - if(fountAt==-1){ - return false; - }else{ - return true; - } - } - - public int size(){ - return this.size; - } - - - public boolean isempty(){ - return this.size==0; - } - - public ArrayList keyset() throws Exception{ - ArrayList arr=new ArrayList<>(); - for(int i=0;i valueset() throws Exception{ - ArrayList arr=new ArrayList<>(); - for(int i=0;i"+temp.value+"]"); - } - System.out.println(); - } - } - - public int find(int bi,K key) throws Exception{ - for(int i=0;i ob[]= buckets; - buckets=new LinkedList[ob.length*2]; - for(int i=0;i(); - - size = 0; - for(int i=0;i>>>>>> 7e3a8c55c865471a33f6932a022a1059c5243fc3:data_structures/HashMap/HashMap.java diff --git a/DataStructures/HashMap/Hashing/HashMap.java b/DataStructures/HashMap/Hashing/HashMap.java deleted file mode 100644 index b51579b..0000000 --- a/DataStructures/HashMap/Hashing/HashMap.java +++ /dev/null @@ -1,39 +0,0 @@ -class HashMap { - private int hsize; - private LinkedList[] buckets; - - public HashMap(int hsize) { - buckets = new LinkedList[hsize]; - for (int i = 0; i < hsize ; i++ ) { - buckets[i] = new LinkedList(); - // Java requires explicit initialisaton of each object - } - this.hsize = hsize; - } - - public int hashing(int key) { - int hash = key % hsize; - if(hash < 0) - hash += hsize; - return hash; - } - - public void insertHash(int key) { - int hash = hashing(key); - buckets[hash].insert(key); - } - - - public void deleteHash(int key) { - int hash = hashing(key); - - buckets[hash].delete(key); - } - public void displayHashtable() { - for (int i = 0;i < hsize ; i++) { - System.out.printf("Bucket %d :",i); - buckets[i].display(); - } - } - -} \ No newline at end of file diff --git a/DataStructures/HashMap/Hashing/LinkedList.java b/DataStructures/HashMap/Hashing/LinkedList.java deleted file mode 100644 index 6c6cd9b..0000000 --- a/DataStructures/HashMap/Hashing/LinkedList.java +++ /dev/null @@ -1,62 +0,0 @@ -class LinkedList { - - private Node Head; - private int size; - - public LinkedList() { - Head = null; - size = 0; - } - - public void insert(int data) { - - Node temp = Head; - Node newnode = new Node(data); - - size++; - - if(Head == null) { - Head = newnode; - } - else { - newnode.next = Head; - Head = newnode; - } - } - - public void delete(int data) { - if(size == 0) { - System.out.println("UnderFlow!"); - return; - } - - else { - Node curr = Head; - if (curr.data == data) { - Head = curr.next; - size--; - return; - } - else { - - while(curr.next.next != null) { - if(curr.next.data == data){ - curr.next = curr.next.next; - return; - } - } - - System.out.println("Key not Found"); - } - } - } - - public void display() { - Node temp = Head; - while(temp != null) { - System.out.printf("%d ",temp.data); - temp = temp.next; - } - System.out.println(); - } -} \ No newline at end of file diff --git a/DataStructures/HashMap/Hashing/Main.java b/DataStructures/HashMap/Hashing/Main.java deleted file mode 100644 index 0acc781..0000000 --- a/DataStructures/HashMap/Hashing/Main.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.Scanner; - -public class Main { - public static void main(String[] args) { - - int choice, key; - - HashMap h = new HashMap(7); - - while (true) { - System.out.println("Enter your Choice :"); - System.out.println("1. Add Key"); - System.out.println("2. Delete Key"); - System.out.println("3. Print Table"); - System.out.println("4. Exit"); - - Scanner In = new Scanner(System.in); - - choice = In.nextInt(); - - switch (choice) { - case 1: { - System.out.println("Enter the Key: "); - key = In.nextInt(); - h.insertHash(key); - break; - } - case 2: { - System.out.println("Enter the Key delete: "); - key = In.nextInt(); - h.deleteHash(key); - break; - } - case 3: { - System.out.println("Print table"); - h.displayHashtable(); - break; - } - case 4: { - return; - } - } - } - } -} \ No newline at end of file diff --git a/DataStructures/HashMap/Hashing/Node.java b/DataStructures/HashMap/Hashing/Node.java deleted file mode 100644 index 4a18ddd..0000000 --- a/DataStructures/HashMap/Hashing/Node.java +++ /dev/null @@ -1,9 +0,0 @@ -class Node { - int data; - Node next; - - public Node(int data) { - this.data = data; - this.next = null; - } -} \ No newline at end of file diff --git a/DataStructures/Heaps/EmptyHeapException.java b/DataStructures/Heaps/EmptyHeapException.java deleted file mode 100644 index b7d853c..0000000 --- a/DataStructures/Heaps/EmptyHeapException.java +++ /dev/null @@ -1,18 +0,0 @@ -/** - * - */ -package heaps; - -/** - * @author Nicolas Renard - * Exception to be thrown if the getElement method is used on an empty heap. - * - */ -@SuppressWarnings("serial") -public class EmptyHeapException extends Exception { - - public EmptyHeapException(String message) { - super(message); - } - -} diff --git a/DataStructures/Heaps/Heap.java b/DataStructures/Heaps/Heap.java deleted file mode 100644 index 02b2ba2..0000000 --- a/DataStructures/Heaps/Heap.java +++ /dev/null @@ -1,41 +0,0 @@ -package heaps; - -/** - * Interface common to heap data structures.
- *

Heaps are tree-like data structures that allow storing elements in a specific - * way. Each node corresponds to an element and has one parent node (except for the root) and - * at most two children nodes. Every element contains a key, and those keys - * indicate how the tree shall be built. For instance, for a min-heap, the key of a node shall - * be greater than or equal to its parent's and lower than or equal to its children's (the opposite rule applies to a - * max-heap).

- *

All heap-related operations (inserting or deleting an element, extracting the min or max) are performed in - * O(log n) time.

- * @author Nicolas Renard - * - * - */ -public interface Heap { - - /** - * - * @return the top element in the heap, the one with lowest key for min-heap or with - * the highest key for max-heap - * @throws Exception if heap is empty - */ - public abstract HeapElement getElement() throws EmptyHeapException; - /** - * Inserts an element in the heap. Adds it to then end and toggle it until it finds its - * right position. - * - * @param element an instance of the HeapElement class. - */ - public abstract void insertElement(HeapElement element); - - /** - * Delete an element in the heap. - * - * @param elementIndex int containing the position in the heap of the element to be deleted. - */ - public abstract void deleteElement(int elementIndex); - -} diff --git a/DataStructures/Heaps/HeapElement.java b/DataStructures/Heaps/HeapElement.java deleted file mode 100644 index e0cc93c..0000000 --- a/DataStructures/Heaps/HeapElement.java +++ /dev/null @@ -1,132 +0,0 @@ -/** - * - */ -package heaps; - -import java.lang.Double; -import java.lang.Object; - -/** - * Class for heap elements.
- *

A heap element contains two attributes: a key which will be used to build the tree (int - * or double, either primitive type or object) and any kind of IMMUTABLE object the user sees fit - * to carry any information he/she likes. Be aware that the use of a mutable object might - * jeopardize the integrity of this information.

- * @author Nicolas Renard - * - */ -public class HeapElement { - private final double key; - private final Object additionalInfo; - - // Constructors - - /** - * - * @param key : a number of primitive type 'double' - * @param info : any kind of IMMUTABLE object. May be null, since the purpose is only to carry - * additional information of use for the user - */ - public HeapElement(double key, Object info) { - this.key = key; - this.additionalInfo = info; - } - - /** - * - * @param key : a number of primitive type 'int' - * @param info : any kind of IMMUTABLE object. May be null, since the purpose is only to carry - * additional information of use for the user - */ - public HeapElement(int key, Object info) { - this.key = key; - this.additionalInfo = info; - } - - /** - * - * @param key : a number of object type 'Integer' - * @param info : any kind of IMMUTABLE object. May be null, since the purpose is only to carry - * additional information of use for the user - */ - public HeapElement(Integer key, Object info) { - this.key = key; - this.additionalInfo = info; - } - - /** - * - * @param key : a number of object type 'Double' - * @param info : any kind of IMMUTABLE object. May be null, since the purpose is only to carry - * additional information of use for the user - */ - public HeapElement(Double key, Object info) { - this.key = key; - this.additionalInfo = info; - } - - /** - * - * @param key : a number of primitive type 'double' - */ - public HeapElement(double key) { - this.key = key; - this.additionalInfo = null; - } - - /** - * - * @param key : a number of primitive type 'int' - */ - public HeapElement(int key) { - this.key = key; - this.additionalInfo = null; - } - - /** - * - * @param key : a number of object type 'Integer' - */ - public HeapElement(Integer key) { - this.key = key; - this.additionalInfo = null; - } - - /** - * - * @param key : a number of object type 'Double' - */ - public HeapElement(Double key) { - this.key = key; - this.additionalInfo = null; - } - - // Getters - /** - * @return the object containing the additional info provided by the user. - */ - public Object getInfo() { - return additionalInfo; - } - /** - * @return the key value of the element - */ - public double getKey() { - return key; - } - - // Overridden object methods - - public String toString() { - return "Key: " + key + " - " +additionalInfo.toString(); - } - /** - * - * @param otherHeapElement - * @return true if the keys on both elements are identical and the additional info objects - * are identical. - */ - public boolean equals(HeapElement otherHeapElement) { - return (this.key == otherHeapElement.key) && (this.additionalInfo.equals(otherHeapElement.additionalInfo)); - } -} diff --git a/DataStructures/Heaps/MaxHeap.java b/DataStructures/Heaps/MaxHeap.java deleted file mode 100644 index 5f774e3..0000000 --- a/DataStructures/Heaps/MaxHeap.java +++ /dev/null @@ -1,115 +0,0 @@ -package heaps; - -import java.util.ArrayList; -import java.util.List; - -/** - * Heap tree where a node's key is higher than or equal to its parent's and lower than or equal - * to its children's. - * @author Nicolas Renard - * - */ -public class MaxHeap implements Heap { - - private final List maxHeap; - - public MaxHeap(List listElements) throws Exception { - maxHeap = new ArrayList(); - for (HeapElement heapElement : listElements) { - if (heapElement != null) insertElement(heapElement); - else System.out.println("Null element. Not added to heap"); - } - if (maxHeap.size() == 0) System.out.println("No element has been added, empty heap."); - } - - // Get the element at a given index. The key for the list is equal to index value - 1 - public HeapElement getElement(int elementIndex) { - if ((elementIndex <= 0) && (elementIndex > maxHeap.size())) throw new IndexOutOfBoundsException("Index out of heap range"); - return maxHeap.get(elementIndex - 1); - } - - // Get the key of the element at a given index - private double getElementKey(int elementIndex) { - return maxHeap.get(elementIndex - 1).getKey(); - } - - // Swaps two elements in the heap - private void swap(int index1, int index2) { - HeapElement temporaryElement = maxHeap.get(index1 - 1); - maxHeap.set(index1 - 1, maxHeap.get(index2 - 1)); - maxHeap.set(index2 - 1, temporaryElement); - } - - // Toggle an element up to its right place as long as its key is lower than its parent's - private void toggleUp(int elementIndex) { - double key = maxHeap.get(elementIndex - 1).getKey(); - while (getElementKey((int) Math.floor(elementIndex/2)) < key) { - swap(elementIndex, (int) Math.floor(elementIndex/2)); - elementIndex = (int) Math.floor(elementIndex/2); - } - } - - // Toggle an element down to its right place as long as its key is higher - // than any of its children's - private void toggleDown(int elementIndex) { - double key = maxHeap.get(elementIndex - 1).getKey(); - boolean wrongOrder = (key < getElementKey(elementIndex*2)) || (key < getElementKey(Math.min(elementIndex*2, maxHeap.size()))); - while ((2*elementIndex <= maxHeap.size()) && wrongOrder) { - // Check whether it shall swap the element with its left child or its right one if any. - if ((2*elementIndex < maxHeap.size()) && (getElementKey(elementIndex*2 + 1) > getElementKey(elementIndex*2))) { - swap(elementIndex, 2*elementIndex + 1); - elementIndex = 2*elementIndex + 1; - } - else { - swap(elementIndex, 2*elementIndex); - elementIndex = 2*elementIndex; - } - wrongOrder = (key < getElementKey(elementIndex*2)) || (key < getElementKey(Math.min(elementIndex*2, maxHeap.size()))); - - } - } - - private HeapElement extractMax() { - HeapElement result = maxHeap.get(0); - deleteElement(0); - return result; - } - - @Override - public void insertElement(HeapElement element) { - maxHeap.add(element); - toggleUp(maxHeap.size()); - - } - - @Override - public void deleteElement(int elementIndex) { - if (maxHeap.isEmpty()) - try { - throw new EmptyHeapException("Attempt to delete an element from an empty heap"); - } catch (EmptyHeapException e) { - e.printStackTrace(); - } - if ((elementIndex > maxHeap.size()) && (elementIndex <= 0)) throw new IndexOutOfBoundsException("Index out of heap range"); - // The last element in heap replaces the one to be deleted - maxHeap.set(elementIndex - 1, getElement(maxHeap.size())); - maxHeap.remove(maxHeap.size()); - // Shall the new element be moved up... - if (getElementKey(elementIndex) > getElementKey((int) Math.floor(elementIndex/2))) toggleUp(elementIndex); - // ... or down ? - else if (((2*elementIndex <= maxHeap.size()) && (getElementKey(elementIndex) < getElementKey(elementIndex*2))) || - ((2*elementIndex < maxHeap.size()) && (getElementKey(elementIndex) < getElementKey(elementIndex*2)))) toggleDown(elementIndex); - } - - @Override - public HeapElement getElement() throws EmptyHeapException { - try { - return extractMax(); - } catch (Exception e) { - throw new EmptyHeapException("Heap is empty. Error retrieving element"); - } - } - -} - - diff --git a/DataStructures/Heaps/MinHeap.java b/DataStructures/Heaps/MinHeap.java deleted file mode 100644 index fbf2b86..0000000 --- a/DataStructures/Heaps/MinHeap.java +++ /dev/null @@ -1,115 +0,0 @@ -/** - * - */ -package heaps; - -import java.util.ArrayList; -import java.util.List; - -/** - * Heap tree where a node's key is higher than or equal to its parent's and lower than or equal - * to its children's. - * @author Nicolas Renard - * - */ -public class MinHeap implements Heap { - - private final List minHeap; - - public MinHeap(List listElements) throws Exception { - minHeap = new ArrayList(); - for (HeapElement heapElement : listElements) { - if (heapElement != null) insertElement(heapElement); - else System.out.println("Null element. Not added to heap"); - } - if (minHeap.size() == 0) System.out.println("No element has been added, empty heap."); - } - - // Get the element at a given index. The key for the list is equal to index value - 1 - public HeapElement getElement(int elementIndex) { - if ((elementIndex <= 0) && (elementIndex > minHeap.size())) throw new IndexOutOfBoundsException("Index out of heap range"); - return minHeap.get(elementIndex - 1); - } - - // Get the key of the element at a given index - private double getElementKey(int elementIndex) { - return minHeap.get(elementIndex - 1).getKey(); - } - - // Swaps two elements in the heap - private void swap(int index1, int index2) { - HeapElement temporaryElement = minHeap.get(index1 - 1); - minHeap.set(index1 - 1, minHeap.get(index2 - 1)); - minHeap.set(index2 - 1, temporaryElement); - } - - // Toggle an element up to its right place as long as its key is lower than its parent's - private void toggleUp(int elementIndex) { - double key = minHeap.get(elementIndex - 1).getKey(); - while (getElementKey((int) Math.floor(elementIndex/2)) > key) { - swap(elementIndex, (int) Math.floor(elementIndex/2)); - elementIndex = (int) Math.floor(elementIndex/2); - } - } - - // Toggle an element down to its right place as long as its key is higher - // than any of its children's - private void toggleDown(int elementIndex) { - double key = minHeap.get(elementIndex - 1).getKey(); - boolean wrongOrder = (key > getElementKey(elementIndex*2)) || (key > getElementKey(Math.min(elementIndex*2, minHeap.size()))); - while ((2*elementIndex <= minHeap.size()) && wrongOrder) { - // Check whether it shall swap the element with its left child or its right one if any. - if ((2*elementIndex < minHeap.size()) && (getElementKey(elementIndex*2 + 1) < getElementKey(elementIndex*2))) { - swap(elementIndex, 2*elementIndex + 1); - elementIndex = 2*elementIndex + 1; - } - else { - swap(elementIndex, 2*elementIndex); - elementIndex = 2*elementIndex; - } - wrongOrder = (key > getElementKey(elementIndex*2)) || (key > getElementKey(Math.min(elementIndex*2, minHeap.size()))); - - } - } - - private HeapElement extractMin() { - HeapElement result = minHeap.get(0); - deleteElement(0); - return result; - } - - @Override - public void insertElement(HeapElement element) { - minHeap.add(element); - toggleUp(minHeap.size()); - - } - - @Override - public void deleteElement(int elementIndex) { - if (minHeap.isEmpty()) - try { - throw new EmptyHeapException("Attempt to delete an element from an empty heap"); - } catch (EmptyHeapException e) { - e.printStackTrace(); - } - if ((elementIndex > minHeap.size()) && (elementIndex <= 0)) throw new IndexOutOfBoundsException("Index out of heap range"); - // The last element in heap replaces the one to be deleted - minHeap.set(elementIndex - 1, getElement(minHeap.size())); - minHeap.remove(minHeap.size()); - // Shall the new element be moved up... - if (getElementKey(elementIndex) < getElementKey((int) Math.floor(elementIndex/2))) toggleUp(elementIndex); - // ... or down ? - else if (((2*elementIndex <= minHeap.size()) && (getElementKey(elementIndex) > getElementKey(elementIndex*2))) || - ((2*elementIndex < minHeap.size()) && (getElementKey(elementIndex) > getElementKey(elementIndex*2)))) toggleDown(elementIndex); - } - - @Override - public HeapElement getElement() throws EmptyHeapException { - try { - return extractMin(); - } catch (Exception e) { - throw new EmptyHeapException("Heap is empty. Error retrieving element"); - } - } -} diff --git a/DataStructures/Lists/CircleLinkedList.java b/DataStructures/Lists/CircleLinkedList.java deleted file mode 100644 index 1f9a49e..0000000 --- a/DataStructures/Lists/CircleLinkedList.java +++ /dev/null @@ -1,54 +0,0 @@ -public class CircleLinkedList{ - private static class Node{ - Node next; - E value; - private Node(E value, Node next){ - this.value = value; - this.next = next; - } - } - //For better O.O design this should be private allows for better black box design - private int size; - //this will point to dummy node; - private Node head; - //constructer for class.. here we will make a dummy node for circly linked list implementation with reduced error catching as our list will never be empty; - public CircleLinkedList(){ - //creation of the dummy node - head = new Node(null,head); - size = 0; - } - // getter for the size... needed because size is private. - public int getSize(){ return size;} - // for the sake of simplistiy this class will only contain the append function or addLast other add functions can be implemented however this is the basses of them all really. - public void append(E value){ - if(value == null){ - // we do not want to add null elements to the list. - throw new NullPointerException("Cannot add null element to the list"); - } - //head.next points to the last element; - head.next = new Node(value,head); - size++;} - public E remove(int pos){ - if(pos>size || pos< 0){ - //catching errors - throw new IndexOutOfBoundsException("position cannot be greater than size or negative"); - } - Node iterator = head.next; - //we need to keep track of the element before the element we want to remove we can see why bellow. - Node before = head; - for(int i = 1; i<=pos; i++){ - iterator = iterator.next; - before = before.next; - } - E saved = iterator.value; - // assigning the next referance to the the element following the element we want to remove... the last element will be assigned to the head. - before.next = iterator.next; - // scrubbing - iterator.next = null; - iterator.value = null; - return saved; - - } - - } - diff --git a/DataStructures/Lists/DoublyLinkedList.java b/DataStructures/Lists/DoublyLinkedList.java deleted file mode 100644 index c3229d9..0000000 --- a/DataStructures/Lists/DoublyLinkedList.java +++ /dev/null @@ -1,214 +0,0 @@ -/** - * This class implements a DoublyLinkedList. This is done using the classes - * LinkedList and Link. - * - * A linked list is simplar to an array, it holds values. However, - * links in a linked list do not have indees. With a linked list - * you do not need to predetermine it's size as it grows and shrinks - * as it is edited. This is an example of a double ended, doubly - * linked list. Each link references the next link and the previous - * one. - * - * @author Unknown - * - */ - -class DoublyLinkedList{ - /** Head refers to the front of the list */ - private Link head; - /** Tail refers to the back of the list */ - private Link tail; - - /** - * Constructor - */ - public DoublyLinkedList(){ - head = null; - tail = null; - } - - /** - * Insert an element at the head - * - * @param x Element to be inserted - */ - public void insertHead(int x){ - Link newLink = new Link(x); //Create a new link with a value attached to it - if(isEmpty()) //Set the first element added to be the tail - tail = newLink; - else - head.previous = newLink; // newLink <-- currenthead(head) - newLink.next = head; // newLink <--> currenthead(head) - head = newLink; // newLink(head) <--> oldhead - } - - /** - * Insert an element at the tail - * - * @param x Element to be inserted - */ - public void insertTail(int x){ - Link newLink = new Link(x); - newLink.next = null; // currentTail(tail) newlink --> - tail.next = newLink; // currentTail(tail) --> newLink --> - newLink.previous = tail; // currentTail(tail) <--> newLink --> - tail = newLink; // oldTail <--> newLink(tail) --> - } - - /** - * Delete the element at the head - * - * @return The new head - */ - public Link deleteHead(){ - Link temp = head; - head = head.next; // oldHead <--> 2ndElement(head) - head.previous = null; // oldHead --> 2ndElement(head) nothing pointing at old head so will be removed - if(head == null) - tail = null; - return temp; - } - - /** - * Delete the element at the tail - * - * @return The new tail - */ - public Link deleteTail(){ - Link temp = tail; - tail = tail.previous; // 2ndLast(tail) <--> oldTail --> null - tail.next = null; // 2ndLast(tail) --> null - return temp; - } - - /** - * Delete the element from somewhere in the list - * - * @param x element to be deleted - * @return Link deleted - */ - public Link delete(int x){ - Link current = head; - - while(current.value != x) //Find the position to delete - current = current.next; - - if(current == head) - deleteHead(); - - else if(current == tail) - deleteTail(); - - else{ //Before: 1 <--> 2(current) <--> 3 - current.previous.next = current.next; // 1 --> 3 - current.next.previous = current.previous; // 1 <--> 3 - } - return current; - } - - /** - * Inserts element and reorders - * - * @param x Element to be added - */ - public void insertOrdered(int x){ - Link newLink = new Link(x); - Link current = head; - while(current != null && x > current.value) //Find the position to insert - current = current.next; - - if(current == head) - insertHead(x); - - else if(current == null) - insertTail(x); - - else{ //Before: 1 <--> 2(current) <--> 3 - newLink.previous = current.previous; // 1 <-- newLink - current.previous.next = newLink; // 1 <--> newLink - newLink.next = current; // 1 <--> newLink --> 2(current) <--> 3 - current.previous = newLink; // 1 <--> newLink <--> 2(current) <--> 3 - } - } - - /** - * Returns true if list is empty - * - * @return true if list is empty - */ - public boolean isEmpty(){ - return(head == null); - } - - /** - * Prints contents of the list - */ - public void display(){ //Prints contents of the list - Link current = head; - while(current!=null){ - current.displayLink(); - current = current.next; - } - System.out.println(); - } -} - -/** - * This class is used to implement the nodes of the - * linked list. - * - * @author Unknown - * - */ -class Link{ - /** Value of node */ - public int value; - /** This points to the link in front of the new link */ - public Link next; - /** This points to the link behind the new link */ - public Link previous; - - /** - * Constructor - * - * @param value Value of node - */ - public Link(int value){ - this.value = value; - } - - /** - * Displays the node - */ - public void displayLink(){ - System.out.print(value+" "); - } - - /** - * Main Method - * - * @param args Command line arguments - */ - public static void main(String args[]){ - DoublyLinkedList myList = new DoublyLinkedList(); - - myList.insertHead(13); - myList.insertHead(7); - myList.insertHead(10); - myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) --> - - myList.insertTail(11); - myList.display(); // <-- 10(head) <--> 7 <--> 13 <--> 11(tail) --> - - myList.deleteTail(); - myList.display(); // <-- 10(head) <--> 7 <--> 13(tail) --> - - myList.delete(7); - myList.display(); // <-- 10(head) <--> 13(tail) --> - - myList.insertOrdered(23); - myList.insertOrdered(67); - myList.insertOrdered(3); - myList.display(); // <-- 3(head) <--> 10 <--> 13 <--> 23 <--> 67(tail) --> - } -} \ No newline at end of file diff --git a/DataStructures/Lists/SinglyLinkedList.java b/DataStructures/Lists/SinglyLinkedList.java deleted file mode 100644 index 32747cf..0000000 --- a/DataStructures/Lists/SinglyLinkedList.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * This class implements a SinglyLinked List. This is done - * using SinglyLinkedList class and a LinkForLinkedList Class. - * - * A linked list is implar to an array, it hold values. - * However, links in a linked list do not have indexes. With - * a linked list you do not need to predetermine it's size as - * it gorws and shrinks as it is edited. This is an example of - * a singly linked list. Elements can only be added/removed - * at the head/front of the list. - * - * @author Unknown - * - */ -class SinglyLinkedList{ - /**Head refered to the front of the list */ - private Node head; - - /** - * Constructor of SinglyLinkedList - */ - public SinglyLinkedList(){ - head = null; - } - - /** - * This method inserts an element at the head - * - * @param x Element to be added - */ - public void insertHead(int x){ - Node newNode = new Node(x); //Create a new link with a value attached to it - newNode.next = head; //Set the new link to point to the current head - head = newNode; //Now set the new link to be the head - } - - - /** - * Inserts a new node at a specified position - * @param head head node of the linked list - * @param data data to be stored in a new node - * @param position position at which a new node is to be inserted - * @return reference of the head of the linked list - */ - - Node InsertNth(Node head, int data, int position) { - - Node newNode = new Node(); - newNode.data = data; - - if (position == 0) { - newNode.next = head; - return newNode; - } - - Node current = head; - - while (--position > 0) { - current = current.next; - } - - newNode.next = current.next; - current.next = newNode; - return head; - } - - /** - * This method deletes an element at the head - * - * @return The element deleted - */ - public Node deleteHead(){ - Node temp = head; - head = head.next; //Make the second element in the list the new head, the Java garbage collector will later remove the old head - return temp; - } - - /** - * Checks if the list is empty - * - * @return true is list is empty - */ - public boolean isEmpty(){ - return(head == null); - } - - /** - * Prints contents of the list - */ - public void display(){ - Node current = head; - while(current!=null){ - System.out.print(current.getValue()+" "); - current = current.next; - } - System.out.println(); - } - - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String args[]){ - SinglyLinkedList myList = new SinglyLinkedList(); - - System.out.println(myList.isEmpty()); //Will print true - - myList.insertHead(5); - myList.insertHead(7); - myList.insertHead(10); - - myList.display(); // 10(head) --> 7 --> 5 - - myList.deleteHead(); - - myList.display(); // 7(head) --> 5 - } -} - -/** - * This class is the nodes of the SinglyLinked List. - * They consist of a vlue and a pointer to the node - * after them. - * - * @author Unknown - * - */ -class Node{ - /** The value of the node */ - public int value; - /** Point to the next node */ - public Node next; //This is what the link will point to - - /** - * Constructor - * - * @param valuein Value to be put in the node - */ - public Node(int valuein){ - value = valuein; - } - - /** - * Returns value of the node - */ - public int getValue(){ - return value; - } - -} diff --git a/DataStructures/Matrix/Matrix.java b/DataStructures/Matrix/Matrix.java deleted file mode 100644 index 6b05536..0000000 --- a/DataStructures/Matrix/Matrix.java +++ /dev/null @@ -1,259 +0,0 @@ -/** -* Matrix data-type. -* -* @author Kyler Smith, 2017 -*/ - - -public class Matrix { - - public static void main(String[] args) { - - int[][] data1 = new int[0][0]; - int[][] data2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; - int[][] data3 = {{1, 4, 7}, {2, 5, 8}, {3, 6, 9}}; - - Matrix m1 = new Matrix(data1); - Matrix m2 = new Matrix(data2); - Matrix m3 = new Matrix(data3); - - System.out.println("m1 --> Rows: " + m1.getRows() + " Columns: " + m1.getColumns()); - System.out.println("m2 --> Rows: " + m2.getRows() + " Columns: " + m2.getColumns()); - System.out.println("m3 --> Rows: " + m3.getRows() + " Columns: " + m3.getColumns()); - - //check for reference issues - System.out.println("m2 -->\n" + m2); - data2[1][1] = 101; - System.out.println("m2 -->\n" + m2); - - //test equals - System.out.println("m2==null: " + m2.equals(null)); //false - System.out.println("m3==\"MATRIX\": " + m2.equals("MATRIX")); //false - System.out.println("m2==m1: " + m2.equals(m1)); //false - System.out.println("m2==m2: " + m2.equals(m2)); //true - System.out.println("m2==m3: " + m2.equals(m3)); //false - - //test operations (valid) - System.out.println("2 * m2:\n" + m2.scale(2)); - System.out.println("m2 / 2:\n" + m2.divide(2)); - System.out.println("m2 + m3:\n" + m2.plus(m3)); - System.out.println("m2 - m3:\n" + m2.minus(m3)); - System.out.println("m2 * m3: \n"+m2.multiply(m3)); - } - - - /** - * Data needs to be a deep copy as not to change the original state. - */ - private int[][] data; - - /** - * Constructor for the matrix takes in a 2D array - * - * @param pData - */ - public Matrix(int[][] pData) { - - /** Make a deep copy of the data */ - if(pData.length != 0) { - int[][] newData = new int[pData.length][pData[0].length]; - - for(int i = 0; i < pData.length; i++) - for(int j = 0; j < pData[0].length; j++) - newData[i][j] = pData[i][j]; - - this.data = newData; - } else { - this.data = null; - } - } - - /** - * Returns the element specified by the given location - * - * @param x : x cooridinate - * @param y : y cooridinate - * @return int : value at location - */ - public int getElement(int x, int y) { - return data[x][y]; - } - - /** - * Returns the number of rows in the Matrix - * - * @return rows - */ - public int getRows() { - if(this.data == null) - return 0; - - return data.length; - } - - /** - * Returns the number of rows in the Matrix - * - * @return columns - */ - public int getColumns() { - if(this.data == null) - return 0; - return data[0].length; - } - - /** - * Returns this matrix scaled by a factor. That is, computes sA where s is a - * constant and A is a matrix (this object). - * - * @param scalar : value to scale by - * @return A new matrix scaled by the scalar value - */ - public Matrix scale(int scalar) { - - int[][] newData = new int[this.data.length][this.data[0].length]; - - for (int i = 0; i < this.getRows(); ++i) - for(int j = 0; j < this.getColumns(); ++j) - newData[i][j] = this.data[i][j] * scalar; - - return new Matrix(newData); - } - - /** - * Returns this matrix divided by a factor. That is, computes sA where s is a - * constant and A is a matrix (this object). - * - * @param scalar : value to divide by - * @return A new matrix scaled by the scalar value - */ - public Matrix divide(int scalar) { - - int[][] newData = new int[this.data.length][this.data[0].length]; - - for (int i = 0; i < this.getRows(); ++i) - for(int j = 0; j < this.getColumns(); ++j) - newData[i][j] = this.data[i][j] / scalar; - - return new Matrix(newData); - } - - /** - * Adds this matrix to another matrix. - * - * @param other : Matrix to be added - * @return addend - */ - public Matrix plus(Matrix other) throws RuntimeException { - - int[][] newData = new int[this.data.length][this.data[0].length]; - - if(this.getRows() != other.getRows() || this.getColumns() != other.getColumns()) - throw new RuntimeException("Not the same size matrix."); - - for (int i = 0; i < this.getRows(); ++i) - for(int j = 0; j < this.getColumns(); ++j) - newData[i][j] = this.data[i][j] + other.getElement(i, j); - - return new Matrix(newData); - } - - /** - * Subtracts this matrix from another matrix. - * - * @param other : Matrix to be subtracted - * @return difference - */ - public Matrix minus(Matrix other) throws RuntimeException { - - int[][] newData = new int[this.data.length][this.data[0].length]; - - if(this.getRows() != other.getRows() || this.getColumns() != other.getColumns()) - throw new RuntimeException("Not the same size matrix."); - - for (int i = 0; i < this.getRows(); ++i) - for(int j = 0; j < this.getColumns(); ++j) - newData[i][j] = this.data[i][j] - other.getElement(i, j); - - return new Matrix(newData); - } - - /** - * Multiplies this matrix with another matrix. - * - * @param other : Matrix to be multiplied with - * @return product - */ - public Matrix multiply(Matrix other) throws RuntimeException { - - int[][] newData = new int[this.data.length][other.getColumns()]; - - if(this.getColumns() !=other.getRows()) - throw new RuntimeException("The two matrices cannot be multiplied."); - int sum; - for (int i = 0; i < this.getRows(); ++i) - for(int j = 0; j < other.getColumns(); ++j){ - sum = 0; - for(int k=0;k { - ArrayList _queue = new ArrayList(); - - private boolean hasElements() { - return !_queue.isEmpty(); - } - - public T peek() { - T result = null; - if(this.hasElements()) { result = _queue.get(0); } - return result; - } - - public boolean add(T element) { - return _queue.add(element); - } - - public T poll() { - T result = null; - if(this.hasElements()) { result = _queue.remove(0); } - return result; - } - - public static void main(String[] args) { - GenericArrayListQueue queue = new GenericArrayListQueue(); - System.out.println("Running..."); - assert queue.peek() == null; - assert queue.poll() == null; - assert queue.add(1) == true; - assert queue.peek() == 1; - assert queue.add(2) == true; - assert queue.peek() == 1; - assert queue.poll() == 1; - assert queue.peek() == 2; - assert queue.poll() == 2; - assert queue.peek() == null; - assert queue.poll() == null; - System.out.println("Finished."); - } -} diff --git a/DataStructures/Queues/PriorityQueues.java b/DataStructures/Queues/PriorityQueues.java deleted file mode 100644 index acb6b55..0000000 --- a/DataStructures/Queues/PriorityQueues.java +++ /dev/null @@ -1,123 +0,0 @@ -/** - * This class implements a PriorityQueue. - * - * A priority queue adds elements into positions based on their priority. - * So the most important elements are placed at the front/on the top. - * In this example I give numbers that are bigger, a higher priority. - * Queues in theory have no fixed size but when using an array - * implementation it does. - * - * @author Unknown - * - */ -class PriorityQueue{ - /** The max size of the queue */ - private int maxSize; - /** The array for the queue */ - private int[] queueArray; - /** How many items are in the queue */ - private int nItems; - - /** - * Constructor - * - * @param size Size of the queue - */ - public PriorityQueue(int size){ - maxSize = size; - queueArray = new int[size]; - nItems = 0; - } - - /** - * Inserts an element in it's appropriate place - * - * @param value Value to be inserted - */ - public void insert(int value){ - if(nItems == 0){ - queueArray[0] = value; - } - else{ - int j = nItems; - while(j > 0 && queueArray[j-1] > value){ - queueArray[j] = queueArray[j-1]; //Shifts every element up to make room for insertion - j--; - } - queueArray[j] = value; //Once the correct position is found the value is inserted - } - nItems++; - } - - /** - * Remove the element from the front of the queue - * - * @return The element removed - */ - public int remove(){ - return queueArray[--nItems]; - } - - /** - * Checks what's at the front of the queue - * - * @return element at the front of the queue - */ - public int peek(){ - return queueArray[nItems-1]; - } - - /** - * Returns true if the queue is empty - * - * @return true if the queue is empty - */ - public boolean isEmpty(){ - return(nItems == 0); - } - - /** - * Returns true if the queue is full - * - * @return true if the queue is full - */ - public boolean isFull(){ - return(nItems == maxSize); - } - - /** - * Returns the number of elements in the queue - * - * @return number of elements in the queue - */ - public int getSize(){ - return nItems; - } -} - -/** - * This class implements the PriorityQueue class above. - * - * @author Unknown - * - */ -public class PriorityQueues{ - /** - * Main method - * - * @param args Command Line Arguments - */ - public static void main(String args[]){ - PriorityQueue myQueue = new PriorityQueue(4); - myQueue.insert(10); - myQueue.insert(2); - myQueue.insert(5); - myQueue.insert(3); - //[2, 3, 5, 10] Here higher numbers have higher priority, so they are on the top - - for(int i = 3; i>=0; i--) - System.out.print(myQueue.remove() + " "); //will print the queue in reverse order [10, 5, 3, 2] - - //As you can see, a Priority Queue can be used as a sorting algotithm - } -} \ No newline at end of file diff --git a/DataStructures/Queues/Queues.java b/DataStructures/Queues/Queues.java deleted file mode 100644 index 84638cb..0000000 --- a/DataStructures/Queues/Queues.java +++ /dev/null @@ -1,148 +0,0 @@ -/** - * This implements Queues by using the class Queue. - * - * A queue data structure functions the same as a real world queue. - * The elements that are added first are the first to be removed. - * New elements are added to the back/rear of the queue. - * - * @author Unknown - * - */ -class Queue{ - /** Max size of the queue */ - private int maxSize; - /** The array representing the queue */ - private int[] queueArray; - /** Front of the queue */ - private int front; - /** Rear of the queue */ - private int rear; - /** How many items are in the queue */ - private int nItems; - - /** - * Constructor - * - * @param size Size of the new queue - */ - public Queue(int size){ - maxSize = size; - queueArray = new int[size]; - front = 0; - rear = -1; - nItems = 0; - } - - /** - * Inserts an element at the rear of the queue - * - * @param x element to be added - * @return True if the element was added successfully - */ - public boolean insert(int x){ - if(isFull()) - return false; - if(rear == maxSize-1) //If the back of the queue is the end of the array wrap around to the front - rear = -1; - rear++; - queueArray[rear] = x; - nItems++; - return true; - } - - /** - * Remove an element from the front of the queue - * - * @return the new front of the queue - */ - public int remove(){ //Remove an element from the front of the queue - if(isEmpty()){ - System.out.println("Queue is empty"); - return -1; - } - int temp = queueArray[front]; - front++; - if(front == maxSize) //Dealing with wrap-around again - front = 0; - nItems--; - return temp; - } - - /** - * Checks what's at the front of the queue - * - * @return element at the front of the queue - */ - public int peekFront(){ - return queueArray[front]; - } - - /** - * Checks what's at the rear of the queue - * - * @return element at the rear of the queue - */ - public int peekRear(){ - return queueArray[rear]; - } - - /** - * Returns true if the queue is empty - * - * @return true if the queue is empty - */ - public boolean isEmpty(){ - return(nItems == 0); - } - - /** - * Returns true if the queue is full - * - * @return true if the queue is full - */ - public boolean isFull(){ - return(nItems == maxSize); - } - - /** - * Returns the number of elements in the queue - * - * @return number of elements in the queue - */ - public int getSize(){ - return nItems; - } -} - -/** - * This class is the example for the Queue class - * - * @author Unknown - * - */ -public class Queues{ - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String args[]){ - Queue myQueue = new Queue(4); - myQueue.insert(10); - myQueue.insert(2); - myQueue.insert(5); - myQueue.insert(3); - //[10(front), 2, 5, 3(rear)] - - System.out.println(myQueue.isFull()); //Will print true - - myQueue.remove(); //Will make 2 the new front, making 10 no longer part of the queue - //[10, 2(front), 5, 3(rear)] - - myQueue.insert(7); //Insert 7 at the rear which will be index 0 because of wrap around - // [7(rear), 2(front), 5, 3] - - System.out.println(myQueue.peekFront()); //Will print 2 - System.out.println(myQueue.peekRear()); //Will print 7 - } -} \ No newline at end of file diff --git a/DataStructures/Stacks/BalancedBrackets.java b/DataStructures/Stacks/BalancedBrackets.java deleted file mode 100644 index 1a8673d..0000000 --- a/DataStructures/Stacks/BalancedBrackets.java +++ /dev/null @@ -1,89 +0,0 @@ -package data_structures.Stacks; - -import java.util.Scanner; -import java.util.Stack; - -/** - * - * The nested brackets problem is a problem that determines if a sequence of - * brackets are properly nested. A sequence of brackets s is considered properly - * nested if any of the following conditions are true: - s is empty - s has the - * form (U) or [U] or {U} where U is a properly nested string - s has the form - * VW where V and W are properly nested strings For example, the string - * "()()[()]" is properly nested but "[(()]" is not. The function called - * is_balanced takes as input a string S which is a sequence of brackets and - * returns true if S is nested and false otherwise. - * - * @author akshay sharma - * @date: 2017-10-17 - * @author khalil2535 - * - */ -class BalancedBrackets { - - /** - * - * @param s - * @return - */ - static boolean is_balanced(String s) { - Stack bracketsStack = new Stack<>(); - char[] text = s.toCharArray(); - for (char x : text) { - switch (x) { - case '{': - case '<': - case '(': - case '[': - bracketsStack.push(x); - break; - case '}': - if (bracketsStack.peek() == '{') { - bracketsStack.pop(); - break; - } else { - return false; - } - case '>': - if (bracketsStack.peek() == '<') { - bracketsStack.pop(); - break; - } else { - return false; - } - case ')': - if (bracketsStack.peek() == '(') { - bracketsStack.pop(); - break; - } else { - return false; - } - case ']': - if (bracketsStack.peek() == '[') { - bracketsStack.pop(); - break; - } else { - return false; - } - } - } - return bracketsStack.empty(); - } - - /** - * - * @param args - * @TODO remove main method and Test using JUnit or other methodology - */ - public static void main(String args[]) { - try (Scanner in = new Scanner(System.in)) { - System.out.println("Enter sequence of brackets: "); - String s = in.nextLine(); - if (is_balanced(s)) { - System.out.println(s + " is balanced"); - } else { - System.out.println(s + " ain't balanced"); - } - } - } -} diff --git a/DataStructures/Stacks/NodeStack.java b/DataStructures/Stacks/NodeStack.java deleted file mode 100644 index c598bb8..0000000 --- a/DataStructures/Stacks/NodeStack.java +++ /dev/null @@ -1,183 +0,0 @@ -/** -* Implementation of a stack using nodes. -* Unlimited size, no arraylist. -* -* @author Kyler Smith, 2017 -*/ - - -public class NodeStack { - - /** - * Entry point for the program. - */ - public static void main(String[] args) { - NodeStack Stack = new NodeStack(); - - Stack.push(3); - Stack.push(4); - Stack.push(5); - System.out.println("Testing :"); - Stack.print(); // prints : 5 4 3 - - Integer x = Stack.pop(); // x = 5 - Stack.push(1); - Stack.push(8); - Integer y = Stack.peek(); // y = 8 - System.out.println("Testing :"); - Stack.print(); // prints : 8 1 4 3 - - System.out.println("Testing :"); - System.out.println("x : " + x); - System.out.println("y : " + y); - } - - /** - * Information each node should contain. - * @value data : information of the value in the node - * @value head : the head of the stack - * @value next : the next value from this node - * @value previous : the last value from this node - * @value size : size of the stack - */ - private Item data; - private static NodeStack head; - private NodeStack next; - private NodeStack previous; - private static int size = 0; - - - /** - * Constructors for the NodeStack. - */ - public NodeStack() { - } - - private NodeStack(Item item) { - this.data = item; - } - - /** - * Put a value onto the stack. - * - * @param item : value to be put on the stack. - */ - public void push(Item item) { - - NodeStack newNs = new NodeStack(item); - - if(this.isEmpty()) { - NodeStack.setHead(new NodeStack<>(item)); - newNs.setNext(null); - newNs.setPrevious(null); - } else { - newNs.setPrevious(NodeStack.head); - NodeStack.head.setNext(newNs); - NodeStack.head = newNs; - } - - NodeStack.setSize(NodeStack.getSize() + 1); - } - - /** - * Value to be taken off the stack. - * - * @return item : value that is returned. - */ - public Item pop() { - - Item item = (Item) NodeStack.head.getData(); - - NodeStack.head = NodeStack.head.getPrevious(); - NodeStack.head.setNext(null); - - NodeStack.setSize(NodeStack.getSize() - 1); - - return item; - } - - /** - * Value that is next to be taken off the stack. - * - * @return item : the next value that would be popped off the stack. - */ - public Item peek() { - return (Item) NodeStack.head.getData(); - } - - /** - * If the stack is empty or there is a value in. - * - * @return boolean : whether or not the stack has anything in it. - */ - public boolean isEmpty() { - return NodeStack.getSize() == 0; - } - - /** - * Returns the size of the stack. - * - * @return int : number of values in the stack. - */ - public int size() { - return NodeStack.getSize(); - } - - /** - * Print the contents of the stack in the following format. - * - * x <- head (next out) - * y - * z <- tail (first in) - * . - * . - * . - * - */ - public void print() { - for(NodeStack n = NodeStack.head; n != null; n = n.previous) { - System.out.println(n.getData().toString()); - } - } - - /** Getters and setters (private) */ - private NodeStack getHead() { - return NodeStack.head; - } - - private static void setHead(NodeStack ns) { - NodeStack.head = ns; - } - - private NodeStack getNext() { - return next; - } - - private void setNext(NodeStack next) { - this.next = next; - } - - private NodeStack getPrevious() { - return previous; - } - - private void setPrevious(NodeStack previous) { - this.previous = previous; - } - - private static int getSize() { - return size; - } - - private static void setSize(int size) { - NodeStack.size = size; - } - - private Item getData() { - return this.data; - } - - private void setData(Item item) { - this.data = item; - } -} diff --git a/DataStructures/Stacks/StackOfLinkedList.java b/DataStructures/Stacks/StackOfLinkedList.java deleted file mode 100644 index 3505245..0000000 --- a/DataStructures/Stacks/StackOfLinkedList.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ - -// An implementation of a Stack using a Linked List - -class StackOfLinkedList { - - public static void main(String[] args) { - - LinkedListStack stack = new LinkedListStack(); - stack.push(1); - stack.push(2); - stack.push(3); - stack.push(4); - stack.push(5); - - stack.printStack(); - - System.out.println("Size of stack currently is: " + stack.getSize()); - - stack.pop(); - stack.pop(); - - System.out.println("Top element of stack currently is: " + stack.peek()); - - } - -} - -// A node class - -class Node { - public int data; - public Node next; - - public Node(int data) { - this.data = data; - this.next = null; - } -} - -/** - * A class which implements a stack using a linked list - * - * Contains all the stack methods : push, pop, printStack, isEmpty - **/ - -class LinkedListStack { - - Node head = null; - int size = 0; - - public void push(int x) { - Node n = new Node(x); - if (getSize() == 0) { - head = n; - } - else { - Node temp = head; - n.next = temp; - head = n; - } - size++; - } - - public void pop() { - if (getSize() == 0) { - System.out.println("Empty stack. Nothing to pop"); - } - - Node temp = head; - head = head.next; - size--; - - System.out.println("Popped element is: " + temp.data); - } - - public int peek() { - if (getSize() == 0) { - return -1; - } - - return head.data; - } - - public void printStack() { - - Node temp = head; - System.out.println("Stack is printed as below: "); - while (temp != null) { - System.out.println(temp.data + " "); - temp = temp.next; - } - System.out.println(); - - } - - public boolean isEmpty() { - return getSize() == 0; - } - - public int getSize() { - return size; - } - -} diff --git a/DataStructures/Stacks/Stacks.java b/DataStructures/Stacks/Stacks.java deleted file mode 100644 index 2861ef5..0000000 --- a/DataStructures/Stacks/Stacks.java +++ /dev/null @@ -1,240 +0,0 @@ -import java.util.ArrayList; - -/** - * This class implements a Stack using two different implementations. - * Stack is used with a regular array and Stack2 uses an ArrayList. - * - * A stack is exactly what it sounds like. An element gets added to the top of - * the stack and only the element on the top may be removed. This is an example - * of an array implementation of a Stack. So an element can only be added/removed - * from the end of the array. In theory stack have no fixed size, but with an - * array implementation it does. - * - * @author Unknown - * - */ -class Stack{ - /** The max size of the Stack */ - private int maxSize; - /** The array representation of the Stack */ - private int[] stackArray; - /** The top of the stack */ - private int top; - - /** - * Constructor - * - * @param size Size of the Stack - */ - public Stack(int size){ - maxSize = size; - stackArray = new int[maxSize]; - top = -1; - } - - /** - * Adds an element to the top of the stack - * - * @param value The element added - */ - public void push(int value){ - if(!isFull()){ //Checks for a full stack - top++; - stackArray[top] = value; - }else{ - resize(maxSize*2); - push(value);// don't forget push after resizing - } - } - - /** - * Removes the top element of the stack and returns the value you've removed - * - * @return value popped off the Stack - */ - public int pop(){ - if(!isEmpty()){ //Checks for an empty stack - return stackArray[top--]; - } - - if(top < maxSize/4){ - resize(maxSize/2); - return pop();// don't forget pop after resizing - } - else{ - System.out.println("The stack is already empty"); - return -1; - } - } - - /** - * Returns the element at the top of the stack - * - * @return element at the top of the stack - */ - public int peek(){ - if(!isEmpty()){ //Checks for an empty stack - return stackArray[top]; - }else{ - System.out.println("The stack is empty, cant peek"); - return -1; - } - } - - private void resize(int newSize){ - //private int[] transferArray = new int[newSize]; we can't put modifires here ! - int[] transferArray = new int[newSize]; - - //for(int i = 0; i < stackArray.length(); i++){ the length isn't a method . - for(int i = 0; i < stackArray.length; i++){ - transferArray[i] = stackArray[i]; - stackArray = transferArray; - } - maxSize = newSize; - } - - /** - * Returns true if the stack is empty - * - * @return true if the stack is empty - */ - public boolean isEmpty(){ - return(top == -1); - } - - /** - * Returns true if the stack is full - * - * @return true if the stack is full - */ - public boolean isFull(){ - return(top+1 == maxSize); - } - - /** - * Deletes everything in the Stack - * - * Doesn't delete elements in the array - * but if you call push method after calling - * makeEmpty it will overwrite previous - * values - */ - public void makeEmpty(){ //Doesn't delete elements in the array but if you call - top = -1; //push method after calling makeEmpty it will overwrite previous values - } -} - -/** - * This is an ArrayList Implementation of stack, Where size is not - * a problem we can extend the stack as much as we want. - * - * @author Unknown - * - */ -class Stack2{ - /** ArrayList representation of the stack */ - ArrayList stackList; - - /** - * Constructor - */ - Stack2(){ - stackList=new ArrayList<>(); - } - - /** - * Adds value to the end of list which - * is the top for stack - * - * @param value value to be added - */ - void push(int value){ - stackList.add(value); - } - - /** - * Pops last element of list which is indeed - * the top for Stack - * - * @return Element popped - */ - int pop(){ - - if(!isEmpty()){ // checks for an empty Stack - - int popValue=stackList.get(stackList.size()-1); - stackList.remove(stackList.size()-1); //removes the poped element from the list - return popValue; - } - else{ - System.out.print("The stack is already empty "); - return -1; - } - - } - - /** - * Checks for empty Stack - * - * @return true if stack is empty - */ - boolean isEmpty(){ - if(stackList.isEmpty()) - return true; - - else return false; - - } - - /** - * Top element of stack - * - * @return top element of stack - */ - int peek(){ - return stackList.get(stackList.size()-1); - } - } - -/** - * This class implements the Stack and Stack2 created above - * - * @author Unknown - * - */ -public class Stacks{ - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String args[]){ - Stack myStack = new Stack(4); //Declare a stack of maximum size 4 - //Populate the stack - myStack.push(5); - myStack.push(8); - myStack.push(2); - myStack.push(9); - - System.out.println("*********************Stack Array Implementation*********************"); - System.out.println(myStack.isEmpty()); //will print false - System.out.println(myStack.isFull()); //will print true - System.out.println(myStack.peek()); //will print 9 - System.out.println(myStack.pop()); //will print 9 - System.out.println(myStack.peek()); // will print 2 - - Stack2 myStack2 = new Stack2(); //Declare a stack of maximum size 4 - //Populate the stack - myStack2.push(5); - myStack2.push(8); - myStack2.push(2); - myStack2.push(9); - - System.out.println("*********************Stack List Implementation*********************"); - System.out.println(myStack2.isEmpty()); //will print false - System.out.println(myStack2.peek()); //will print 9 - System.out.println(myStack2.pop()); //will print 9 - System.out.println(myStack2.peek()); // will print 2 - System.out.println(myStack2.pop()); //will print 2 - } -} diff --git a/DataStructures/Trees/AVLTree.java b/DataStructures/Trees/AVLTree.java deleted file mode 100644 index 4bcf402..0000000 --- a/DataStructures/Trees/AVLTree.java +++ /dev/null @@ -1,212 +0,0 @@ -public class AVLTree { - - private Node root; - - private class Node { - private int key; - private int balance; - private int height; - private Node left, right, parent; - - Node(int k, Node p) { - key = k; - parent = p; - } - } - - public boolean insert(int key) { - if (root == null) - root = new Node(key, null); - else { - Node n = root; - Node parent; - while (true) { - if (n.key == key) - return false; - - parent = n; - - boolean goLeft = n.key > key; - n = goLeft ? n.left : n.right; - - if (n == null) { - if (goLeft) { - parent.left = new Node(key, parent); - } else { - parent.right = new Node(key, parent); - } - rebalance(parent); - break; - } - } - } - return true; - } - - private void delete(Node node){ - if(node.left == null && node.right == null){ - if(node.parent == null) root = null; - else{ - Node parent = node.parent; - if(parent.left == node){ - parent.left = null; - }else parent.right = null; - rebalance(parent); - } - return; - } - if(node.left!=null){ - Node child = node.left; - while (child.right!=null) child = child.right; - node.key = child.key; - delete(child); - }else{ - Node child = node.right; - while (child.left!=null) child = child.left; - node.key = child.key; - delete(child); - } - } - - public void delete(int delKey) { - if (root == null) - return; - Node node = root; - Node child = root; - - while (child != null) { - node = child; - child = delKey >= node.key ? node.right : node.left; - if (delKey == node.key) { - delete(node); - return; - } - } - } - - private void rebalance(Node n) { - setBalance(n); - - if (n.balance == -2) { - if (height(n.left.left) >= height(n.left.right)) - n = rotateRight(n); - else - n = rotateLeftThenRight(n); - - } else if (n.balance == 2) { - if (height(n.right.right) >= height(n.right.left)) - n = rotateLeft(n); - else - n = rotateRightThenLeft(n); - } - - if (n.parent != null) { - rebalance(n.parent); - } else { - root = n; - } - } - - private Node rotateLeft(Node a) { - - Node b = a.right; - b.parent = a.parent; - - a.right = b.left; - - if (a.right != null) - a.right.parent = a; - - b.left = a; - a.parent = b; - - if (b.parent != null) { - if (b.parent.right == a) { - b.parent.right = b; - } else { - b.parent.left = b; - } - } - - setBalance(a, b); - - return b; - } - - private Node rotateRight(Node a) { - - Node b = a.left; - b.parent = a.parent; - - a.left = b.right; - - if (a.left != null) - a.left.parent = a; - - b.right = a; - a.parent = b; - - if (b.parent != null) { - if (b.parent.right == a) { - b.parent.right = b; - } else { - b.parent.left = b; - } - } - - setBalance(a, b); - - return b; - } - - private Node rotateLeftThenRight(Node n) { - n.left = rotateLeft(n.left); - return rotateRight(n); - } - - private Node rotateRightThenLeft(Node n) { - n.right = rotateRight(n.right); - return rotateLeft(n); - } - - private int height(Node n) { - if (n == null) - return -1; - return n.height; - } - - private void setBalance(Node... nodes) { - for (Node n : nodes) - reheight(n); - n.balance = height(n.right) - height(n.left); - } - - public void printBalance() { - printBalance(root); - } - - private void printBalance(Node n) { - if (n != null) { - printBalance(n.left); - System.out.printf("%s ", n.balance); - printBalance(n.right); - } - } - - private void reheight(Node node){ - if(node!=null){ - node.height=1 + Math.max(height(node.left), height(node.right)); - } - } - - public static void main(String[] args) { - AVLTree tree = new AVLTree(); - - System.out.println("Inserting values 1 to 10"); - for (int i = 1; i < 10; i++) - tree.insert(i); - - System.out.print("Printing balance: "); - tree.printBalance(); - } -} diff --git a/DataStructures/Trees/BinaryTree.java b/DataStructures/Trees/BinaryTree.java deleted file mode 100644 index a20d24e..0000000 --- a/DataStructures/Trees/BinaryTree.java +++ /dev/null @@ -1,268 +0,0 @@ -/** -* This entire class is used to build a Binary Tree data structure. -* There is the Node Class and the Tree Class, both explained below. -* -* @author Unknown -* -*/ - - -/** -* This class implements the nodes that will go on the Binary Tree. -* They consist of the data in them, the node to the left, the node -* to the right, and the parent from which they came from. -* -* @author Unknown -* -*/ -class Node{ - /** Data for the node */ - public int data; - /** The Node to the left of this one */ - public Node left; - /** The Node to the right of this one */ - public Node right; - /** The parent of this node */ - public Node parent; - - /** - * Constructor of Node - * - * @param value Value to put in the node - */ - public Node(int value){ - data = value; - left = null; - right = null; - parent = null; - } -} - - -/** -* A binary tree is a data structure in which an element -* has two successors(children). The left child is usually -* smaller than the parent, and the right child is usually -* bigger. -* -* @author Unknown -* -*/ -class Tree{ - /** The root of the Binary Tree */ - private Node root; - - /** - * Constructor - */ - public Tree(){ - root = null; - } - - /** - * Method to find a Node with a certain value - * - * @param key Value being looked for - * @return The node if it finds it, otherwise returns the parent - */ - public Node find(int key) { - Node current = root; - while (current != null) { - if(key < current.data) { - current = current.left; - } else if(key > current.data) { - current = current.right; - } else { // If you find the value return it - return current; - } - } - return null; - } - - /** - * Inserts certain value into the Binary Tree - * - * @param value Value to be inserted - */ - public void put(int value){ - Node newNode = new Node(value); - if(root == null) - root = newNode; - else{ - //This will return the soon to be parent of the value you're inserting - Node parent = find(value); - - //This if/else assigns the new node to be either the left or right child of the parent - if(value < parent.data){ - parent.left = newNode; - parent.left.parent = parent; - return; - } - else{ - parent.right = newNode; - parent.right.parent = parent; - return; - } - } - } - - /** - * Deletes a given value from the Binary Tree - * - * @param value Value to be deleted - * @return If the value was deleted - */ - public boolean remove(int value){ - //temp is the node to be deleted - Node temp = find(value); - - //If the value doesn't exist - if(temp.data != value) - return false; - - //No children - if(temp.right == null && temp.left == null){ - if(temp == root) - root = null; - - //This if/else assigns the new node to be either the left or right child of the parent - else if(temp.parent.data < temp.data) - temp.parent.right = null; - else - temp.parent.left = null; - return true; - } - - //Two children - else if(temp.left != null && temp.right != null){ - Node successor = findSuccessor(temp); - - //The left tree of temp is made the left tree of the successor - successor.left = temp.left; - successor.left.parent = successor; - - //If the successor has a right child, the child's grandparent is it's new parent - if(successor.right != null && successor.parent != temp){ - successor.right.parent = successor.parent; - successor.parent.left = successor.right; - successor.right = temp.right; - successor.right.parent = successor; - } - if(temp == root){ - successor.parent = null; - root = successor; - return true; - } - - //If you're not deleting the root - else{ - successor.parent = temp.parent; - - //This if/else assigns the new node to be either the left or right child of the parent - if(temp.parent.data < temp.data) - temp.parent.right = successor; - else - temp.parent.left = successor; - return true; - } - } - //One child - else{ - //If it has a right child - if(temp.right != null){ - if(temp == root){ - root = temp.right; return true;} - - temp.right.parent = temp.parent; - - //Assigns temp to left or right child - if(temp.data < temp.parent.data) - temp.parent.left = temp.right; - else - temp.parent.right = temp.right; - return true; - } - //If it has a left child - else{ - if(temp == root){ - root = temp.left; return true;} - - temp.left.parent = temp.parent; - - //Assigns temp to left or right side - if(temp.data < temp.parent.data) - temp.parent.left = temp.left; - else - temp.parent.right = temp.left; - return true; - } - } - } - - /** - * This method finds the Successor to the Node given. - * Move right once and go left down the tree as far as you can - * - * @param n Node that you want to find the Successor of - * @return The Successor of the node - */ - public Node findSuccessor(Node n){ - if(n.right == null) - return n; - Node current = n.right; - Node parent = n.right; - while(current != null){ - parent = current; - current = current.left; - } - return parent; - } - - /** - * Returns the root of the Binary Tree - * - * @return the root of the Binary Tree - */ - public Node getRoot(){ - return root; - } - - /** - * Prints leftChild - root - rightChild - * - * @param localRoot The local root of the binary tree - */ - public void inOrder(Node localRoot){ - if(localRoot != null){ - inOrder(localRoot.left); - System.out.print(localRoot.data + " "); - inOrder(localRoot.right); - } - } - - /** - * Prints root - leftChild - rightChild - * - * @param localRoot The local root of the binary tree - */ - public void preOrder(Node localRoot){ - if(localRoot != null){ - System.out.print(localRoot.data + " "); - preOrder(localRoot.left); - preOrder(localRoot.right); - } - } - - /** - * Prints rightChild - leftChild - root - * - * @param localRoot The local root of the binary tree - */ - public void postOrder(Node localRoot){ - if(localRoot != null){ - postOrder(localRoot.left); - postOrder(localRoot.right); - System.out.print(localRoot.data + " "); - } - } - } diff --git a/DataStructures/Trees/FindHeightOfTree.java b/DataStructures/Trees/FindHeightOfTree.java deleted file mode 100644 index 675b1e8..0000000 --- a/DataStructures/Trees/FindHeightOfTree.java +++ /dev/null @@ -1,100 +0,0 @@ -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ -import java.util.LinkedList; - -public class FindHeightOfTree { - - // Driver Program - public static void main(String[] args) { - Node tree = new Node(5); - tree.insert(3); - tree.insert(7); - tree.insert(1); - tree.insert(-1); - tree.insert(29); - tree.insert(93); - tree.insert(6); - tree.insert(0); - tree.insert(-5); - tree.insert(-6); - tree.insert(-8); - tree.insert(-1); - - // A level order representation of the tree - tree.printLevelOrder(); - System.out.println(); - - System.out.println("Height of the tree is: " + tree.findHeight()); - } -} - -/** - * The Node class which initializes a Node of a tree - * printLevelOrder: ROOT -> ROOT's CHILDREN -> ROOT's CHILDREN's CHILDREN -> etc - * findHeight: Returns the height of the tree i.e. the number of links between root and farthest leaf - */ -class Node { - Node left, right; - int data; - - public Node(int data) { - this.data = data; - } - - public void insert (int value) { - if (value < data) { - if (left == null) { - left = new Node(value); - } - else { - left.insert(value); - } - } - else { - if (right == null) { - right = new Node(value); - } - else { - right.insert(value); - } - } - } - - public void printLevelOrder() { - LinkedList queue = new LinkedList<>(); - queue.add(this); - while(!queue.isEmpty()) { - Node n = queue.poll(); - System.out.print(n.data + " "); - if (n.left != null) { - queue.add(n.left); - } - if (n.right != null) { - queue.add(n.right); - } - } - } - - public int findHeight() { - return findHeight(this); - } - - private int findHeight(Node root) { - if (root.left == null && root.right == null) { - return 0; - } - else if (root.left != null && root.right != null) { - return 1 + Math.max(findHeight(root.left), findHeight(root.right)); - } - else if (root.left == null && root.right != null) { - return 1 + findHeight(root.right); - } - else { - return 1 + findHeight(root.left); - } - } -} - diff --git a/DataStructures/Trees/GenericTree.Java b/DataStructures/Trees/GenericTree.Java deleted file mode 100644 index 16ab5fb..0000000 --- a/DataStructures/Trees/GenericTree.Java +++ /dev/null @@ -1,226 +0,0 @@ -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.Scanner; - -public class treeclass { - private class Node { - int data; - ArrayList child = new ArrayList<>(); - } - - private Node root; - private int size; - - /* - A generic tree is a tree which can have as many children as it can be - It might be possible that every node present is directly connected to - root node. - - In this code - Every function has two copies: one function is helper function which can be called from - main and from that function a private function is called which will do the actual work. - I have done this, while calling from main one have to give minimum parameters. - - */ - public treeclass() { //Constructor - Scanner scn = new Scanner(System.in); - root = create_treeG(null, 0, scn); - } - - private Node create_treeG(Node node, int childindx, Scanner scn) { - // display - if (node == null) { - System.out.println("Enter root's data"); - } else { - System.out.println("Enter data of parent of index " + node.data + " " + childindx); - } - // input - node = new Node(); - node.data = scn.nextInt(); - System.out.println("number of children"); - int number = scn.nextInt(); - for (int i = 0; i < number; i++) { - Node childd = create_treeG(node, i, scn); - size++; - node.child.add(childd); - } - return node; - } - - /* - Function to display the generic tree - */ - public void display() { //Helper function - display_1(root); - return; - } - - private void display_1(Node parent) { - System.out.print(parent.data + "=>"); - for (int i = 0; i < parent.child.size(); i++) { - System.out.print(parent.child.get(i).data + " "); - } - System.out.println("."); - for (int i = 0; i < parent.child.size(); i++) { - display_1(parent.child.get(i)); - } - return; - } - - /* - One call store the size directly but if you are asked compute size this function to calcuate - size goes as follows - */ - - public int size2call() { - return size2(root); - } - - public int size2(Node roott) { - int sz = 0; - for (int i = 0; i < roott.child.size(); i++) { - sz += size2(roott.child.get(i)); - } - return sz + 1; - } - - /* - Function to compute maximum value in the generic tree - */ - public int maxcall() { - int maxi = root.data; - return max(root, maxi); - } - - private int max(Node roott, int maxi) { - if (maxi < roott.data) - maxi = roott.data; - for (int i = 0; i < roott.child.size(); i++) { - maxi = max(roott.child.get(i), maxi); - } - - return maxi; - } - - /* - Function to compute HEIGHT of the generic tree - */ - - public int heightcall() { - return height(root) - 1; - } - - private int height(Node node) { - int h = 0; - for (int i = 0; i < node.child.size(); i++) { - int k = height(node.child.get(i)); - if (k > h) - h = k; - } - return h + 1; - } - - /* - Function to find whether a number is present in the generic tree or not - */ - - public boolean findcall(int info) { - return find(root, info); - } - - private boolean find(Node node, int info) { - if (node.data == info) - return true; - for (int i = 0; i < node.child.size(); i++) { - if (find(node.child.get(i), info)) - return true; - } - return false; - } - - /* - Function to calculate depth of generic tree - */ - public void depthcaller(int dep) { - depth(root, dep); - } - - public void depth(Node node, int dep) { - if (dep == 0) { - System.out.println(node.data); - return; - } - for (int i = 0; i < node.child.size(); i++) - depth(node.child.get(i), dep - 1); - return; - } - - /* - Function to print generic tree in pre-order - */ - public void preordercall() { - preorder(root); - System.out.println("."); - } - - private void preorder(Node node) { - System.out.print(node.data + " "); - for (int i = 0; i < node.child.size(); i++) - preorder(node.child.get(i)); - } - - /* - Function to print generic tree in post-order - */ - public void postordercall() { - postorder(root); - System.out.println("."); - } - - private void postorder(Node node) { - for (int i = 0; i < node.child.size(); i++) - postorder(node.child.get(i)); - System.out.print(node.data + " "); - } - - /* - Function to print generic tree in level-order - */ - - public void levelorder() { - LinkedList q = new LinkedList<>(); - q.addLast(root); - while (!q.isEmpty()) { - int k = q.getFirst().data; - System.out.print(k + " "); - - for (int i = 0; i < q.getFirst().child.size(); i++) { - q.addLast(q.getFirst().child.get(i)); - } - q.removeFirst(); - } - System.out.println("."); - } - - /* - Function to remove all leaves of generic tree - */ - public void removeleavescall() { - removeleaves(root); - } - - private void removeleaves(Node node) { - ArrayList arr = new ArrayList<>(); - for (int i = 0; i < node.child.size(); i++) { - if (node.child.get(i).child.size() == 0) { - arr.add(i); - // node.child.remove(i); - // i--; - } else - removeleaves(node.child.get(i)); - } - for (int i = arr.size() - 1; i >= 0; i--) { - node.child.remove(arr.get(i) + 0); - } - } - diff --git a/DataStructures/Trees/LevelOrderTraversal.java b/DataStructures/Trees/LevelOrderTraversal.java deleted file mode 100644 index 8cb304f..0000000 --- a/DataStructures/Trees/LevelOrderTraversal.java +++ /dev/null @@ -1,78 +0,0 @@ -class Node -{ - int data; - Node left, right; - public Node(int item) - { - data = item; - left = right = null; - } -} - -public class LevelOrderTraversal -{ - // Root of the Binary Tree - Node root; - - public LevelOrderTraversal() - { - root = null; - } - - /* function to print level order traversal of tree*/ - void printLevelOrder() - { - int h = height(root); - int i; - for (i=1; i<=h; i++) - printGivenLevel(root, i); - } - - /* Compute the "height" of a tree -- the number of - nodes along the longest path from the root node - down to the farthest leaf node.*/ - int height(Node root) - { - if (root == null) - return 0; - else - { - /* compute height of each subtree */ - int lheight = height(root.left); - int rheight = height(root.right); - - /* use the larger one */ - if (lheight > rheight) - return(lheight+1); - else return(rheight+1); - } - } - - /* Print nodes at the given level */ - void printGivenLevel (Node root ,int level) - { - if (root == null) - return; - if (level == 1) - System.out.print(root.data + " "); - else if (level > 1) - { - printGivenLevel(root.left, level-1); - printGivenLevel(root.right, level-1); - } - } - - /* Driver program to test above functions */ - public static void main(String args[]) - { - LevelOrderTraversal tree = new LevelOrderTraversal(); - tree.root= new Node(1); - tree.root.left= new Node(2); - tree.root.right= new Node(3); - tree.root.left.left= new Node(4); - tree.root.left.right= new Node(5); - - System.out.println("Level order traversal of binary tree is "); - tree.printLevelOrder(); - } -} \ No newline at end of file diff --git a/DataStructures/Trees/LevelOrderTraversalQueue.java b/DataStructures/Trees/LevelOrderTraversalQueue.java deleted file mode 100644 index ce7ad74..0000000 --- a/DataStructures/Trees/LevelOrderTraversalQueue.java +++ /dev/null @@ -1,62 +0,0 @@ -import java.util.Queue; -import java.util.LinkedList; - -/* Class to represent Tree node */ -class Node { - int data; - Node left, right; - - public Node(int item) { - data = item; - left = null; - right = null; - } -} - -/* Class to print Level Order Traversal */ -public class LevelOrderTraversalQueue { - - Node root; - - /* Given a binary tree. Print its nodes in level order - using array for implementing queue */ - void printLevelOrder() - { - Queue queue = new LinkedList(); - queue.add(root); - while (!queue.isEmpty()) - { - - /* poll() removes the present head. - For more information on poll() visit - http://www.tutorialspoint.com/java/util/linkedlist_poll.htm */ - Node tempNode = queue.poll(); - System.out.print(tempNode.data + " "); - - /*Enqueue left child */ - if (tempNode.left != null) { - queue.add(tempNode.left); - } - - /*Enqueue right child */ - if (tempNode.right != null) { - queue.add(tempNode.right); - } - } - } - - public static void main(String args[]) - { - /* creating a binary tree and entering - the nodes */ - LevelOrderTraversalQueue tree_level = new LevelOrderTraversalQueue(); - tree_level.root = new Node(1); - tree_level.root.left = new Node(2); - tree_level.root.right = new Node(3); - tree_level.root.left.left = new Node(4); - tree_level.root.left.right = new Node(5); - - System.out.println("Level order traversal of binary tree is - "); - tree_level.printLevelOrder(); - } -} \ No newline at end of file diff --git a/DataStructures/Trees/PrintTopViewofTree.java b/DataStructures/Trees/PrintTopViewofTree.java deleted file mode 100644 index 27016ee..0000000 --- a/DataStructures/Trees/PrintTopViewofTree.java +++ /dev/null @@ -1,105 +0,0 @@ -// Java program to print top view of Binary tree -import java.util.*; - -// Class for a tree node -class TreeNode -{ - // Members - int key; - TreeNode left, right; - - // Constructor - public TreeNode(int key) - { - this.key = key; - left = right = null; - } -} - -// A class to represent a queue item. The queue is used to do Level -// order traversal. Every Queue item contains node and horizontal -// distance of node from root -class QItem -{ - TreeNode node; - int hd; - public QItem(TreeNode n, int h) - { - node = n; - hd = h; - } -} - -// Class for a Binary Tree -class Tree -{ - TreeNode root; - - // Constructors - public Tree() { root = null; } - public Tree(TreeNode n) { root = n; } - - // This method prints nodes in top view of binary tree - public void printTopView() - { - // base case - if (root == null) { return; } - - // Creates an empty hashset - HashSet set = new HashSet<>(); - - // Create a queue and add root to it - Queue Q = new LinkedList(); - Q.add(new QItem(root, 0)); // Horizontal distance of root is 0 - - // Standard BFS or level order traversal loop - while (!Q.isEmpty()) - { - // Remove the front item and get its details - QItem qi = Q.remove(); - int hd = qi.hd; - TreeNode n = qi.node; - - // If this is the first node at its horizontal distance, - // then this node is in top view - if (!set.contains(hd)) - { - set.add(hd); - System.out.print(n.key + " "); - } - - // Enqueue left and right children of current node - if (n.left != null) - Q.add(new QItem(n.left, hd-1)); - if (n.right != null) - Q.add(new QItem(n.right, hd+1)); - } - } -} - -// Driver class to test above methods -public class PrintTopViewofTree -{ - public static void main(String[] args) - { - /* Create following Binary Tree - 1 - / \ - 2 3 - \ - 4 - \ - 5 - \ - 6*/ - TreeNode root = new TreeNode(1); - root.left = new TreeNode(2); - root.right = new TreeNode(3); - root.left.right = new TreeNode(4); - root.left.right.right = new TreeNode(5); - root.left.right.right.right = new TreeNode(6); - Tree t = new Tree(root); - System.out.println("Following are nodes in top view of Binary Tree"); - t.printTopView(); - } -} \ No newline at end of file diff --git a/DataStructures/Trees/RedBlackBST.java b/DataStructures/Trees/RedBlackBST.java deleted file mode 100644 index 08a8fb0..0000000 --- a/DataStructures/Trees/RedBlackBST.java +++ /dev/null @@ -1,330 +0,0 @@ -/** - * - * @author jack870131 - */ -public class RedBlackBST { - - private final int R = 0; - private final int B = 1; - - private class Node { - - int key = -1, color = B; - Node left = nil, right = nil, p = nil; - - Node(int key) { - this.key = key; - } - } - - private final Node nil = new Node(-1); - private Node root = nil; - - public void printTree(Node node) { - if (node == nil) { - return; - } - printTree(node.left); - System.out.print(((node.color == R) ? " R " : " B ") + "Key: " + node.key + " Parent: " + node.p.key + "\n"); - printTree(node.right); - } - - public void printTreepre(Node node) { - if (node == nil) { - return; - } - System.out.print(((node.color == R) ? " R " : " B ") + "Key: " + node.key + " Parent: " + node.p.key + "\n"); - printTree(node.left); - printTree(node.right); - } - - private Node findNode(Node findNode, Node node) { - if (root == nil) { - return null; - } - if (findNode.key < node.key) { - if (node.left != nil) { - return findNode(findNode, node.left); - } - } else if (findNode.key > node.key) { - if (node.right != nil) { - return findNode(findNode, node.right); - } - } else if (findNode.key == node.key) { - return node; - } - return null; - } - - private void insert(Node node) { - Node temp = root; - if (root == nil) { - root = node; - node.color = B; - node.p = nil; - } else { - node.color = R; - while (true) { - if (node.key < temp.key) { - if (temp.left == nil) { - temp.left = node; - node.p = temp; - break; - } else { - temp = temp.left; - } - } else if (node.key >= temp.key) { - if (temp.right == nil) { - temp.right = node; - node.p = temp; - break; - } else { - temp = temp.right; - } - } - } - fixTree(node); - } - } - - private void fixTree(Node node) { - while (node.p.color == R) { - Node y = nil; - if (node.p == node.p.p.left) { - y = node.p.p.right; - - if (y != nil && y.color == R) { - node.p.color = B; - y.color = B; - node.p.p.color = R; - node = node.p.p; - continue; - } - if (node == node.p.right) { - node = node.p; - rotateLeft(node); - } - node.p.color = B; - node.p.p.color = R; - rotateRight(node.p.p); - } else { - y = node.p.p.left; - if (y != nil && y.color == R) { - node.p.color = B; - y.color = B; - node.p.p.color = R; - node = node.p.p; - continue; - } - if (node == node.p.left) { - node = node.p; - rotateRight(node); - } - node.p.color = B; - node.p.p.color = R; - rotateLeft(node.p.p); - } - } - root.color = B; - } - - void rotateLeft(Node node) { - if (node.p != nil) { - if (node == node.p.left) { - node.p.left = node.right; - } else { - node.p.right = node.right; - } - node.right.p = node.p; - node.p = node.right; - if (node.right.left != nil) { - node.right.left.p = node; - } - node.right = node.right.left; - node.p.left = node; - } else { - Node right = root.right; - root.right = right.left; - right.left.p = root; - root.p = right; - right.left = root; - right.p = nil; - root = right; - } - } - - void rotateRight(Node node) { - if (node.p != nil) { - if (node == node.p.left) { - node.p.left = node.left; - } else { - node.p.right = node.left; - } - - node.left.p = node.p; - node.p = node.left; - if (node.left.right != nil) { - node.left.right.p = node; - } - node.left = node.left.right; - node.p.right = node; - } else { - Node left = root.left; - root.left = root.left.right; - left.right.p = root; - root.p = left; - left.right = root; - left.p = nil; - root = left; - } - } - - void transplant(Node target, Node with) { - if (target.p == nil) { - root = with; - } else if (target == target.p.left) { - target.p.left = with; - } else - target.p.right = with; - with.p = target.p; - } - - Node treeMinimum(Node subTreeRoot) { - while (subTreeRoot.left != nil) { - subTreeRoot = subTreeRoot.left; - } - return subTreeRoot; - } - - boolean delete(Node z) { - if ((z = findNode(z, root)) == null) - return false; - Node x; - Node y = z; - int yorigcolor = y.color; - - if (z.left == nil) { - x = z.right; - transplant(z, z.right); - } else if (z.right == nil) { - x = z.left; - transplant(z, z.left); - } else { - y = treeMinimum(z.right); - yorigcolor = y.color; - x = y.right; - if (y.p == z) - x.p = y; - else { - transplant(y, y.right); - y.right = z.right; - y.right.p = y; - } - transplant(z, y); - y.left = z.left; - y.left.p = y; - y.color = z.color; - } - if (yorigcolor == B) - deleteFixup(x); - return true; - } - - void deleteFixup(Node x) { - while (x != root && x.color == B) { - if (x == x.p.left) { - Node w = x.p.right; - if (w.color == R) { - w.color = B; - x.p.color = R; - rotateLeft(x.p); - w = x.p.right; - } - if (w.left.color == B && w.right.color == B) { - w.color = R; - x = x.p; - continue; - } else if (w.right.color == B) { - w.left.color = B; - w.color = R; - rotateRight(w); - w = x.p.right; - } - if (w.right.color == R) { - w.color = x.p.color; - x.p.color = B; - w.right.color = B; - rotateLeft(x.p); - x = root; - } - } else { - Node w = x.p.left; - if (w.color == R) { - w.color = B; - x.p.color = R; - rotateRight(x.p); - w = x.p.left; - } - if (w.right.color == B && w.left.color == B) { - w.color = R; - x = x.p; - continue; - } else if (w.left.color == B) { - w.right.color = B; - w.color = R; - rotateLeft(w); - w = x.p.left; - } - if (w.left.color == R) { - w.color = x.p.color; - x.p.color = B; - w.left.color = B; - rotateRight(x.p); - x = root; - } - } - } - x.color = B; - } - - public void insertDemo() { - Scanner scan = new Scanner(System.in); - while (true) { - System.out.println("Add items"); - - int item; - Node node; - - item = scan.nextInt(); - while (item != -999) { - node = new Node(item); - insert(node); - item = scan.nextInt(); - } - printTree(root); - System.out.println("Pre order"); - printTreepre(root); - break; - } - } - - public void deleteDemo() { - Scanner scan = new Scanner(System.in); - System.out.println("Delete items"); - int item; - Node node; - item = scan.nextInt(); - node = new Node(item); - System.out.print("Deleting item " + item); - if (delete(node)) { - System.out.print(": deleted!"); - } else { - System.out.print(": does not exist!"); - } - - System.out.println(); - printTree(root); - System.out.println("Pre order"); - printTreepre(root); - } -} \ No newline at end of file diff --git a/DataStructures/Trees/TreeTraversal.java b/DataStructures/Trees/TreeTraversal.java deleted file mode 100644 index 60a2cd4..0000000 --- a/DataStructures/Trees/TreeTraversal.java +++ /dev/null @@ -1,124 +0,0 @@ -import java.util.LinkedList; - -/** -* -* @author Varun Upadhyay (https://github.com/varunu28) -* -*/ - - -// Driver Program -public class TreeTraversal { - public static void main(String[] args) { - Node tree = new Node(5); - tree.insert(3); - tree.insert(2); - tree.insert(7); - tree.insert(4); - tree.insert(6); - tree.insert(8); - - // Prints 5 3 2 4 7 6 8 - System.out.println("Pre order traversal:"); - tree.printPreOrder(); - System.out.println(); - // Prints 2 3 4 5 6 7 8 - System.out.println("In order traversal:"); - tree.printInOrder(); - System.out.println(); - // Prints 2 4 3 6 8 7 5 - System.out.println("Post order traversal:"); - tree.printPostOrder(); - System.out.println(); - // Prints 5 3 7 2 4 6 8 - System.out.println("Level order traversal:"); - tree.printLevelOrder(); - System.out.println(); - } -} - -/** -* The Node class which initializes a Node of a tree -* Consists of all 4 traversal methods: printInOrder, printPostOrder, printPreOrder & printLevelOrder -* printInOrder: LEFT -> ROOT -> RIGHT -* printPreOrder: ROOT -> LEFT -> RIGHT -* printPostOrder: LEFT -> RIGHT -> ROOT -* printLevelOrder: Prints by level (starting at root), from left to right. -*/ -class Node { - Node left, right; - int data; - - public Node(int data) { - this.data = data; - } - - public void insert (int value) { - if (value < data) { - if (left == null) { - left = new Node(value); - } - else { - left.insert(value); - } - } - else { - if (right == null) { - right = new Node(value); - } - else { - right.insert(value); - } - } - } - - public void printInOrder() { - if (left != null) { - left.printInOrder(); - } - System.out.print(data + " "); - if (right != null) { - right.printInOrder(); - } - } - - public void printPreOrder() { - System.out.print(data + " "); - if (left != null) { - left.printPreOrder(); - } - if (right != null) { - right.printPreOrder(); - } - } - - public void printPostOrder() { - if (left != null) { - left.printPostOrder(); - } - if (right != null) { - right.printPostOrder(); - } - System.out.print(data + " "); - } - - /** - * O(n) time algorithm. - * Uses O(n) space to store nodes in a queue to aid in traversal. - */ - public void printLevelOrder() { - LinkedList queue = new LinkedList<>(); - queue.add(this); - while (queue.size() > 0) { - Node head = queue.remove(); - System.out.print(head.data + " "); - // Add children of recently-printed node to queue, if they exist. - if (head.left != null) { - queue.add(head.left); - } - if (head.right != null) { - queue.add(head.right); - } - } - } -} diff --git a/DataStructures/Trees/TrieImp.java b/DataStructures/Trees/TrieImp.java deleted file mode 100644 index c55586f..0000000 --- a/DataStructures/Trees/TrieImp.java +++ /dev/null @@ -1,135 +0,0 @@ -//Trie Data structure implementation without any libraries */ - -/** - * - * @author Dheeraj Kumar Barnwal (https://github.com/dheeraj92) - * - */ -import java.util.Scanner; - -public class TrieImp { - - public class TrieNode { - TrieNode[] child; - boolean end; - - public TrieNode(){ - child = new TrieNode[26]; - end = false; - } - } - private final TrieNode root; - public TrieImp(){ - root = new TrieNode(); - } - - public void insert(String word){ - TrieNode currentNode = root; - for(int i=0; i < word.length();i++){ - TrieNode node = currentNode.child[word.charAt(i)-'a']; - if(node == null){ - node = new TrieNode(); - currentNode.child[word.charAt(i)-'a']=node; - } - currentNode = node; - } - currentNode.end = true; - } - public boolean search(String word){ - TrieNode currentNode = root; - for(int i=0;i= min and <= max. */ - boolean isBSTUtil(Node node, int min, int max) - { - /* an empty tree is BST */ - if (node == null) - return true; - - /* false if this node violates the min/max constraints */ - if (node.data < min || node.data > max) - return false; - - /* otherwise check the subtrees recursively - tightening the min/max constraints */ - // Allow only distinct values - return (isBSTUtil(node.left, min, node.data-1) && - isBSTUtil(node.right, node.data+1, max)); - } - - /* Driver program to test above functions */ - public static void main(String args[]) - { - ValidBSTOrNot tree = new ValidBSTOrNot(); - tree.root = new Node(4); - tree.root.left = new Node(2); - tree.root.right = new Node(5); - tree.root.left.left = new Node(1); - tree.root.left.right = new Node(3); - - if (tree.isBST()) - System.out.println("IS BST"); - else - System.out.println("Not a BST"); - } -} \ No newline at end of file diff --git a/Dynamic Programming/CoinChange.java b/Dynamic Programming/CoinChange.java deleted file mode 100644 index f4cda72..0000000 --- a/Dynamic Programming/CoinChange.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ - -public class CoinChange { - - // Driver Program - public static void main(String[] args) { - - int amount = 12; - int[] coins = {1, 2, 5}; - - System.out.println("Number of combinations of getting change for " + amount + " is: " + change(coins, amount)); - } - - /** - * This method finds the number of combinations of getting change for a given amount and change coins - * - * @param coins The list of coins - * @param amount The amount for which we need to find the change - * Finds the number of combinations of change - **/ - public static int change(int[] coins, int amount) { - - int[] combinations = new int[amount+1]; - combinations[0] = 1; - - for (int coin : coins) { - for (int i=coin; i insert ? insert : replace; - min = delete > min ? min : delete; - dp[i + 1][j + 1] = min; - } - } - } - /* return the final answer , after traversing through both the strings*/ - return dp[len1][len2]; - } - - - // Driver program to test above function - public static void main(String args[]) - { - Scanner input = new Scanner(System.in); - String s1,s2; - System.out.println("Enter the First String"); - s1 = input.nextLine(); - System.out.println("Enter the Second String"); - s2 = input.nextLine(); - //ans stores the final Edit Distance between the two strings - int ans=0; - ans=minDistance(s1,s2); - System.out.println("The minimum Edit Distance between \"" + s1 + "\" and \"" + s2 +"\" is "+ans); - } - } diff --git a/Dynamic Programming/EggDropping.java b/Dynamic Programming/EggDropping.java deleted file mode 100644 index 382d7ea..0000000 --- a/Dynamic Programming/EggDropping.java +++ /dev/null @@ -1,53 +0,0 @@ -//Dynamic Programming solution for the Egg Dropping Puzzle -public class EggDropping -{ - - // min trials with n eggs and m floors - - private static int minTrials(int n, int m) - { - - int eggFloor[][] = new int[n+1][m+1]; - int result, x; - - for (int i = 1; i <= n; i++) - { - eggFloor[i][0] = 0; // Zero trial for zero floor. - eggFloor[i][1] = 1; // One trial for one floor - } - - // j trials for only 1 egg - - for (int j = 1; j <= m; j++) - eggFloor[1][j] = j; - - // Using bottom-up approach in DP - - for (int i = 2; i <= n; i++) - { - for (int j = 2; j <= m; j++) - { - eggFloor[i][j] = Integer.MAX_VALUE; - for (x = 1; x <= j; x++) - { - result = 1 + Math.max(eggFloor[i-1][x-1], eggFloor[i][j-x]); - - //choose min of all values for particular x - if (result < eggFloor[i][j]) - eggFloor[i][j] = result; - } - } - } - - return eggFloor[n][m]; - } - - //testing program - public static void main(String args[]) - { - int n = 2, m = 4; - //result outputs min no. of trials in worst case for n eggs and m floors - int result = minTrials(n, m); - System.out.println(result); - } -} diff --git a/Dynamic Programming/Fibonacci.java b/Dynamic Programming/Fibonacci.java deleted file mode 100644 index b2524b4..0000000 --- a/Dynamic Programming/Fibonacci.java +++ /dev/null @@ -1,75 +0,0 @@ -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Map; - -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ - -public class Fibonacci { - - private static Map map = new HashMap(); - - public static void main(String[] args) throws Exception { - - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - int n = Integer.parseInt(br.readLine()); - - System.out.println(fibMemo(n)); // Returns 8 for n = 6 - System.out.println(fibBotUp(n)); // Returns 8 for n = 6 - } - - /** - * This method finds the nth fibonacci number using memoization technique - * - * @param n The input n for which we have to determine the fibonacci number - * Outputs the nth fibonacci number - **/ - - private static int fibMemo(int n) { - if (map.containsKey(n)) { - return map.get(n); - } - - int f; - - if (n <= 2) { - f = 1; - } - else { - f = fibMemo(n-1) + fibMemo(n-2); - map.put(n,f); - } - - return f; - } - - /** - * This method finds the nth fibonacci number using bottom up - * - * @param n The input n for which we have to determine the fibonacci number - * Outputs the nth fibonacci number - **/ - - private static int fibBotUp(int n) { - - Map fib = new HashMap(); - - for (int i=1;imaxsum){ - maxsum=cursum; - } - if(cursum<=0){ - cursum=0; - } - } - return maxsum; - } - - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String[] args) { - Scanner sc=new Scanner(System.in); - int n,arr[],i; - n=sc.nextInt(); - arr=new int[n]; - for(i=0;i lcsMatrix[i][j-1] ? lcsMatrix[i-1][j] : lcsMatrix[i][j-1]; - } - } - } - return lcsString(str1, str2, lcsMatrix); - } - - public static String lcsString (String str1, String str2, int[][] lcsMatrix) { - StringBuilder lcs = new StringBuilder(); - int i = str1.length(), - j = str2.length(); - while(i > 0 && j > 0) { - if(str1.charAt(i-1) == str2.charAt(j-1)) { - lcs.append(str1.charAt(i-1)); - i--; - j--; - } else if(lcsMatrix[i-1][j] > lcsMatrix[i][j-1]) { - i--; - } else { - j--; - } - } - return lcs.reverse().toString(); - } - - public static void main(String[] args) { - String str1 = "DSGSHSRGSRHTRD"; - String str2 = "DATRGAGTSHS"; - String lcs = getLCS(str1, str2); - - //Print LCS - if(lcs != null) { - System.out.println("String 1: " + str1); - System.out.println("String 2: " + str2); - System.out.println("LCS: " + lcs); - System.out.println("LCS length: " + lcs.length()); - } - } -} \ No newline at end of file diff --git a/Dynamic Programming/LongestIncreasingSubsequence.java b/Dynamic Programming/LongestIncreasingSubsequence.java deleted file mode 100644 index eaa574a..0000000 --- a/Dynamic Programming/LongestIncreasingSubsequence.java +++ /dev/null @@ -1,62 +0,0 @@ -import java.util.Scanner; - -/** - * - * @author Afrizal Fikri (https://github.com/icalF) - * - */ -public class LongestIncreasingSubsequence { - public static void main(String[] args) throws Exception { - - Scanner sc = new Scanner(System.in); - int n = sc.nextInt(); - - int ar[] = new int[n]; - for (int i = 0; i < n; i++) { - ar[i] = sc.nextInt(); - } - - System.out.println(LIS(ar)); - } - - private static int upperBound(int[] ar, int l, int r, int key) { - while (l < r-1) { - int m = (l + r) / 2; - if (ar[m] >= key) - r = m; - else - l = m; - } - - return r; - } - - private static int LIS(int[] array) { - int N = array.length; - if (N == 0) - return 0; - - int[] tail = new int[N]; - int length = 1; // always points empty slot in tail - - tail[0] = array[0]; - for (int i = 1; i < N; i++) { - - // new smallest value - if (array[i] < tail[0]) - tail[0] = array[i]; - - // array[i] extends largest subsequence - else if (array[i] > tail[length-1]) - tail[length++] = array[i]; - - // array[i] will become end candidate of an existing subsequence or - // Throw away larger elements in all LIS, to make room for upcoming grater elements than array[i] - // (and also, array[i] would have already appeared in one of LIS, identify the location and replace it) - else - tail[upperBound(tail, -1, length-1, array[i])] = array[i]; - } - - return length; - } -} \ No newline at end of file diff --git a/Dynamic Programming/RodCutting.java b/Dynamic Programming/RodCutting.java deleted file mode 100644 index cd25120..0000000 --- a/Dynamic Programming/RodCutting.java +++ /dev/null @@ -1,32 +0,0 @@ -/* A Dynamic Programming solution for Rod cutting problem - Returns the best obtainable price for a rod of - length n and price[] as prices of different pieces */ - -public class RodCutting { - - private static int cutRod(int price[],int n) - { - int val[] = new int[n+1]; - val[0] = 0; - - for (int i = 1; i<=n; i++) - { - int max_val = Integer.MIN_VALUE; - for (int j = 0; j < i; j++) - max_val = Math.max(max_val,price[j] + val[i-j-1]); - - val[i] = max_val; - } - - return val[n]; - } - - //main function to test - public static void main(String args[]) - { - int arr[] = new int[] {2, 5, 13, 19, 20}; - int size = arr.length; - System.out.println("Maximum Obtainable Value is " + - cutRod(arr, size)); - } -} diff --git a/MinimizingLateness/MinimizingLateness.java b/MinimizingLateness/MinimizingLateness.java deleted file mode 100644 index a6613cb..0000000 --- a/MinimizingLateness/MinimizingLateness.java +++ /dev/null @@ -1,52 +0,0 @@ -import java.io.*; -import java.util.*; - -public class MinimizingLateness { - - private static class Schedule { // Schedule class - int t = 0; // Time required for the operation to be performed - int d = 0; // Time the job should be completed - int s = 0; // Start time of the task - int f = 0; // End time of the operation - - public Schedule(int t, int d) { - this.t = t; - this.d = d; - } - } - - public static void main(String[] args) throws IOException { - // TODO Auto-generated method stub - StringTokenizer token; - - String ch; - BufferedReader in = new BufferedReader(new FileReader("input.txt")); - int indexCount; // size of array index - ch = in.readLine(); - indexCount = Integer.parseInt(ch); // The first line specifies the size of the operation (= the size of the array) - System.out.println("Input Data : "); - System.out.println(indexCount); // number of operations - Schedule array[] = new Schedule[indexCount]; // Create an array to hold the operation - int i = 0; - while ((ch = in.readLine()) != null) { - token = new StringTokenizer(ch, " "); - // Include the time required for the operation to be performed in the array and the time it should be completed. - array[i] = new Schedule(Integer.parseInt(token.nextToken()), Integer.parseInt(token.nextToken())); - i++; // 다음 인덱스 - System.out.println(array[i - 1].t + " " + array[i - 1].d); - } - - int tryTime = 0; // Total time worked - int lateness = 0; // Lateness - for (int j = 0; j < indexCount - 1; j++) { - array[j].s = tryTime; // Start time of the task - array[j].f = tryTime + array[j].t; // Time finished - tryTime = tryTime + array[j].t; // Add total work time - // Lateness - lateness = lateness + Math.max(0, tryTime - array[j].d); - } - System.out.println(); - System.out.println("Output Data : "); - System.out.println(lateness); - } -} diff --git a/MinimizingLateness/data06_lateness.txt b/MinimizingLateness/data06_lateness.txt deleted file mode 100644 index e2bac0d..0000000 --- a/MinimizingLateness/data06_lateness.txt +++ /dev/null @@ -1,7 +0,0 @@ -6 -3 6 -2 8 -1 9 -4 9 -3 14 -2 15 \ No newline at end of file diff --git a/Misc/PalindromicPrime.java b/Misc/PalindromicPrime.java deleted file mode 100644 index 8664672..0000000 --- a/Misc/PalindromicPrime.java +++ /dev/null @@ -1,41 +0,0 @@ -import java.util.Scanner; -public class PalindromePrime { - - public static void main(String[] args) { // Main funtion - Scanner in = new Scanner(System.in); - System.out.println("Enter the quantity of First Palindromic Primes you want"); - int n = in.nextInt(); // Input of how mant first pallindromic prime we want - funtioning(n); // calling funtion - functioning - } - - public static boolean prime(int num) { // checking if number is prime or not - for (int divisor = 2; divisor <= num / 2; divisor++) { - if (num % divisor == 0) { - return false; // false if not prime - } - } - return true; // True if prime - } - - public static int reverse(int n){ // Returns the reverse of the number - int reverse = 0; - while(n!=0){ - reverse = reverse * 10; - reverse = reverse + n%10; - n = n/10; - } - return reverse; - } - - public static void funtioning(int y){ - int count =0; - int num = 2; - while(count < y){ - if(prime(num) && num == reverse(num)){ // number is prime and it's reverse is same - count++; // counts check when to terminate while loop - System.out.print(num + "\n"); // Print the Palindromic Prime - } - num++; // inrease iterator value by one - } - } -}; diff --git a/Misc/heap_sort.java b/Misc/heap_sort.java deleted file mode 100644 index 991d689..0000000 --- a/Misc/heap_sort.java +++ /dev/null @@ -1,73 +0,0 @@ -public class heap_sort -{ - public void sort(int arr[]) - { - int n = arr.length; - - // Build heap (rearrange array) - for (int i = n / 2 - 1; i >= 0; i--) - heapify(arr, n, i); - - // One by one extract an element from heap - for (int i=n-1; i>=0; i--) - { - // Move current root to end - int temp = arr[0]; - arr[0] = arr[i]; - arr[i] = temp; - - // call max heapify on the reduced heap - heapify(arr, i, 0); - } - } - - // To heapify a subtree rooted with node i which is - // an index in arr[]. n is size of heap - void heapify(int arr[], int n, int i) - { - int largest = i; // Initialize largest as root - int l = 2*i + 1; // left = 2*i + 1 - int r = 2*i + 2; // right = 2*i + 2 - - // If left child is larger than root - if (l < n && arr[l] > arr[largest]) - largest = l; - - // If right child is larger than largest so far - if (r < n && arr[r] > arr[largest]) - largest = r; - - // If largest is not root - if (largest != i) - { - int swap = arr[i]; - arr[i] = arr[largest]; - arr[largest] = swap; - - // Recursively heapify the affected sub-tree - heapify(arr, n, largest); - } - } - - /* A utility function to print array of size n */ - static void printArray(int arr[]) - { - int n = arr.length; - for (int i=0; i 0) { - remainder = number % 10; - sum = sum + (remainder * remainder * remainder); - number = number / 10; - } - if (sum == temp) { - return true; - } else { - return false; - } - - } -} \ No newline at end of file diff --git a/Others/BrianKernighanAlgorithm.java b/Others/BrianKernighanAlgorithm.java deleted file mode 100644 index cb27eec..0000000 --- a/Others/BrianKernighanAlgorithm.java +++ /dev/null @@ -1,55 +0,0 @@ -import java.util.Scanner; - -/** - * - * @author Nishita Aggarwal - * - * Brian Kernighan’s Algorithm - * - * algorithm to count the number of set bits in a given number - * - * Subtraction of 1 from a number toggles all the bits (from right to left) till the rightmost set bit(including the - * rightmost set bit). - * So if we subtract a number by 1 and do bitwise & with itself i.e. (n & (n-1)), we unset the rightmost set bit. - * - * If we do n & (n-1) in a loop and count the no of times loop executes we get the set bit count. - * - * - * Time Complexity: O(logn) - * - */ - - -public class BrianKernighanAlgorithm { - - /** - * @param num: number in which we count the set bits - * - * @return int: Number of set bits - * */ - static int countSetBits(int num) - { - int cnt = 0; - while(num != 0) - { - num = num & (num-1); - cnt++; - } - return cnt; - } - - - /** - * - * @param args : command line arguments - * - */ - public static void main(String args[]) - { - Scanner sc = new Scanner(System.in); - int num = sc.nextInt(); - int setBitCount = countSetBits(num); - System.out.println(setBitCount); - sc.close(); - } -} diff --git a/Others/CountChar.java b/Others/CountChar.java deleted file mode 100644 index 6504aab..0000000 --- a/Others/CountChar.java +++ /dev/null @@ -1,43 +0,0 @@ -import java.util.Scanner; - - -/** - * @author Kyler Smith, 2017 - * - * Implementation of a character count. - * (Slow, could be improved upon, effectively O(n). - * */ - -public class CountChar { - - public static void main(String[] args) { - Scanner input = new Scanner(System.in); - System.out.print("Enter your text: "); - String str = input.nextLine(); - input.close(); - System.out.println("There are " + CountCharacters(str) + " characters."); - } - - /** - * @param str: String to count the characters - * - * @return int: Number of characters in the passed string - * */ - - private static int CountCharacters(String str) { - - int count = 0; - - if(str == "" || str == null) //Exceptions - { - return 0; - } - - for(int i = 0; i < str.length(); i++) { - if(!Character.isWhitespace(str.charAt(i))) { - count++; - }} - - return count; - } -} diff --git a/Others/Dijkshtra.java b/Others/Dijkshtra.java deleted file mode 100644 index 05011dd..0000000 --- a/Others/Dijkshtra.java +++ /dev/null @@ -1,61 +0,0 @@ -/* -@author : Mayank K Jha - -*/ - - -import java.io.IOException; -import java.util.Arrays; -import java.util.Scanner; -import java.util.Stack; - -public class Dijkshtra { - -public static void main(String[] args) throws IOException { - Scanner in =new Scanner(System.in); - - int n=in.nextInt(); //n = Number of nodes or vertices - int m=in.nextInt(); //m = Number of Edges - long w[][]=new long [n+1][n+1]; //Adjacency Matrix - - //Initializing Matrix with Certain Maximum Value for path b/w any two vertices - for (long[] row: w) - Arrays.fill(row, 1000000l); - //From above,we Have assumed that,initially path b/w any two Pair of vertices is Infinite such that Infinite = 1000000l - //For simplicity , We can also take path Value = Long.MAX_VALUE , but i have taken Max Value = 1000000l . - - //Taking Input as Edge Location b/w a pair of vertices - for(int i=0;icmp){ //Comparing previous edge value with current value - Cycle Case - w[x][y]=cmp; w[y][x]=cmp; - } - } - - //Implementing Dijkshtra's Algorithm - - Stack t=new Stack(); - int src=in.nextInt(); - for(int i=1;i<=n;i++){ - if(i!=src){t.push(i);}} - Stack p=new Stack(); - p.push(src); - w[src][src]=0; - while(!t.isEmpty()){int min=989997979,loc=-1; - for(int i=0;i{ - @Override - public int compare(Node o1, Node o2) { - if(o1.freq>o2.freq){return 1;} - else if(o1.freq it=li.iterator(); - while(it.hasNext()){Node n=it.next();System.out.print(n.freq+" ");}System.out.println(); - } - - //Function for making tree (Huffman Tree) - public static Node make_huffmann_tree(List li){ - //Sorting list in increasing order of its letter frequency - li.sort(new comp()); - Node temp=null; - Iterator it=li.iterator(); - //System.out.println(li.size()); - //Loop for making huffman tree till only single node remains in list - while(true){ - temp=new Node(); - //a and b are Node which are to be combine to make its parent - Node a=new Node(),b=new Node(); - a=null;b=null; - //checking if list is eligible for combining or not - //here first assignment of it.next in a will always be true as list till end will - //must have atleast one node - a=(Node)it.next(); - //Below condition is to check either list has 2nd node or not to combine - //If this condition will be false, then it means construction of huffman tree is completed - if(it.hasNext()){b=(Node)it.next();} - //Combining first two smallest nodes in list to make its parent whose frequncy - //will be equals to sum of frequency of these two nodes - if(b!=null){ - temp.freq=a.freq+b.freq;a.data=0;b.data=1;//assigining 0 and 1 to left and right nodes - temp.left=a;temp.right=b; - //after combing, removing first two nodes in list which are already combined - li.remove(0);//removes first element which is now combined -step1 - li.remove(0);//removes 2nd element which comes on 1st position after deleting first in step1 - li.add(temp);//adding new combined node to list - //print_list(li); //For visualizing each combination step - } - //Sorting after combining to again repeat above on sorted frequency list - li.sort(new comp()); - it=li.iterator();//resetting list pointer to first node (head/root of tree) - if(li.size()==1){return (Node)it.next();} //base condition ,returning root of huffman tree - } -} - - //Function for finding path between root and given letter ch - public static void dfs(Node n,String ch){ - Stack st=new Stack(); // stack for storing path - int freq=n.freq; // recording root freq to avoid it adding in path encoding - find_path_and_encode(st,n,ch,freq); - } - - //A simple utility function to print stack (Used for printing path) - public static void print_path(Stack st){ - for(int i=0;i st,Node root,String s,int f){ - //Base condition - if(root!= null){ - if(root.freq!=f){st.push(root);} // avoiding root to add in path/encoding bits - if(root.letr.equals(s)){print_path(st);return;} // Recursion stopping condition when path gets founded - find_path_and_encode(st,root.left,s,f); - find_path_and_encode(st,root.right,s,f); - //Popping if path not found in right or left of this node,because we previously - //pushed this node in taking a mindset that it might be in path - st.pop(); - } - } - - public static void main(String args[]){ - List li=new LinkedList<>(); - Scanner in=new Scanner(System.in); - System.out.println("Enter number of distinct letters "); - int n=in.nextInt(); - String s[]=new String[n]; - System.out.print("Enter letters with its frequncy to encode\n"); - for(int i=0;i 0 && T.charAt(i) != P.charAt(q)) { - q = pi[q - 1]; - } - - if (T.charAt(i) == P.charAt(q)) { - q++; - } - - if (q == n) { - System.out.println("Pattern starts: " + (i + 1 - n)); - q = pi[q - 1]; - } - } - - } - - // return the prefix function - private int[] computePrefixFunction(final String P) { - final int n = P.length(); - final int[] pi = new int[n]; - pi[0] = 0; - int q = 0; - for (int i = 1; i < n; i++) { - while (q > 0 && P.charAt(q) != P.charAt(i)) { - q = pi[q - 1]; - } - - if (P.charAt(q) == P.charAt(i)) { - q++; - } - - pi[i] = q; - - } - - return pi; - } -} diff --git a/Others/LinearCongruentialGenerator.java b/Others/LinearCongruentialGenerator.java deleted file mode 100644 index b03c10d..0000000 --- a/Others/LinearCongruentialGenerator.java +++ /dev/null @@ -1,57 +0,0 @@ -/*** - * A pseudorandom number generator. - * - * @author Tobias Carryer - * Date: October 10, 2017 - */ -public class LinearCongruentialGenerator { - - private double a, c, m, previousValue; - - /*** - * These parameters are saved and used when nextNumber() is called. - * The current timestamp in milliseconds is used as the seed. - * - * @param multiplier - * @param increment - * @param modulo The maximum number that can be generated (exclusive). A common value is 2^32. - */ - public LinearCongruentialGenerator( double multiplier, double increment, double modulo ) { - this(System.currentTimeMillis(), multiplier, increment, modulo); - } - - /*** - * These parameters are saved and used when nextNumber() is called. - * - * @param seed - * @param multiplier - * @param increment - * @param modulo The maximum number that can be generated (exclusive). A common value is 2^32. - */ - public LinearCongruentialGenerator( double seed, double multiplier, double increment, double modulo ) { - this.previousValue = seed; - this.a = multiplier; - this.c = increment; - this.m = modulo; - } - - /** - * The smallest number that can be generated is zero. - * The largest number that can be generated is modulo-1. modulo is set in the constructor. - * @return a pseudorandom number. - */ - public double nextNumber() { - previousValue = (a * previousValue + c) % m; - return previousValue; - } - - public static void main( String[] args ) { - // Show the LCG in action. - // Decisive proof that the LCG works could be made by adding each number - // generated to a Set while checking for duplicates. - LinearCongruentialGenerator lcg = new LinearCongruentialGenerator(1664525, 1013904223, Math.pow(2.0, 32.0)); - for( int i = 0; i < 512; i++ ) { - System.out.println(lcg.nextNumber()); - } - } -} diff --git a/Others/LowestBasePalindrome.java b/Others/LowestBasePalindrome.java deleted file mode 100644 index d0df5c3..0000000 --- a/Others/LowestBasePalindrome.java +++ /dev/null @@ -1,144 +0,0 @@ -import java.util.InputMismatchException; -import java.util.Scanner; - -/** - * Class for finding the lowest base in which a given integer is a palindrome. - * Includes auxiliary methods for converting between bases and reversing strings. - * - * NOTE: There is potential for error, see note at line 63. - * - * @author RollandMichael - * @version 2017.09.28 - * - */ -public class LowestBasePalindrome { - - public static void main(String[] args) { - Scanner in = new Scanner(System.in); - int n=0; - while (true) { - try { - System.out.print("Enter number: "); - n = in.nextInt(); - break; - } catch (InputMismatchException e) { - System.out.println("Invalid input!"); - in.next(); - } - } - System.out.println(n+" is a palindrome in base "+lowestBasePalindrome(n)); - System.out.println(base2base(Integer.toString(n),10, lowestBasePalindrome(n))); - } - - /** - * Given a number in base 10, returns the lowest base in which the - * number is represented by a palindrome (read the same left-to-right - * and right-to-left). - * @param num A number in base 10. - * @return The lowest base in which num is a palindrome. - */ - public static int lowestBasePalindrome(int num) { - int base, num2=num; - int digit; - char digitC; - boolean foundBase=false; - String newNum = ""; - String digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - - while (!foundBase) { - // Try from bases 2 to num-1 - for (base=2; base0) { - // Obtain the first digit of n in the current base, - // which is equivalent to the integer remainder of (n/base). - // The next digit is obtained by dividing n by the base and - // continuing the process of getting the remainder. This is done - // until n is <=0 and the number in the new base is obtained. - digit = (num % base); - num/=base; - // If the digit isn't in the set of [0-9][A-Z] (beyond base 36), its character - // form is just its value in ASCII. - - // NOTE: This may cause problems, as the capital letters are ASCII values - // 65-90. It may cause false positives when one digit is, for instance 10 and assigned - // 'A' from the character array and the other is 65 and also assigned 'A'. - - // Regardless, the character is added to the representation of n - // in the current base. - if (digit>=digits.length()) { - digitC=(char)(digit); - newNum+=digitC; - continue; - } - newNum+=digits.charAt(digit); - } - // Num is assigned back its original value for the next iteration. - num=num2; - // Auxiliary method reverses the number. - String reverse = reverse(newNum); - // If the number is read the same as its reverse, then it is a palindrome. - // The current base is returned. - if (reverse.equals(newNum)) { - foundBase=true; - return base; - } - } - } - // If all else fails, n is always a palindrome in base n-1. ("11") - return num-1; - } - - private static String reverse(String str) { - String reverse = ""; - for(int i=str.length()-1; i>=0; i--) { - reverse += str.charAt(i); - } - return reverse; - } - - private static String base2base(String n, int b1, int b2) { - // Declare variables: decimal value of n, - // character of base b1, character of base b2, - // and the string that will be returned. - int decimalValue = 0, charB2; - char charB1; - String output=""; - // Go through every character of n - for (int i=0; i9 and store it in charB2 - if (charB1 >= 'A' && charB1 <= 'Z') - charB2 = 10 + (charB1 - 'A'); - // Else, store the integer value in charB2 - else - charB2 = charB1 - '0'; - // Convert the digit to decimal and add it to the - // decimalValue of n - decimalValue = decimalValue * b1 + charB2; - } - - // Converting the decimal value to base b2: - // A number is converted from decimal to another base - // by continuously dividing by the base and recording - // the remainder until the quotient is zero. The number in the - // new base is the remainders, with the last remainder - // being the left-most digit. - - // While the quotient is NOT zero: - while (decimalValue != 0) { - // If the remainder is a digit < 10, simply add it to - // the left side of the new number. - if (decimalValue % b2 < 10) - output = Integer.toString(decimalValue % b2) + output; - // If the remainder is >= 10, add a character with the - // corresponding value to the new number. (A = 10, B = 11, C = 12, ...) - else - output = (char)((decimalValue % b2)+55) + output; - // Divide by the new base again - decimalValue /= b2; - } - return output; - } -} diff --git a/Others/Node.java b/Others/Node.java deleted file mode 100644 index ab495b7..0000000 --- a/Others/Node.java +++ /dev/null @@ -1,16 +0,0 @@ -public class Node { - public Object anElement; - public Node less; - public Node greater; - - public Node(Object theElement) { - this(theElement, null, null); //an empty node at the end will be by itself with no children, therefore the other 2 parameters are always null - //obviously the node can still be a child of other elements - } - - public Node(Object currentElement, Node lessSide, Node greaterSide) { - anElement = currentElement; - this.less = lessSide; - this.greater = greaterSide; - } -} diff --git a/Others/Palindrome.java b/Others/Palindrome.java deleted file mode 100644 index 0bbddb7..0000000 --- a/Others/Palindrome.java +++ /dev/null @@ -1,26 +0,0 @@ -class Palindrome { - - private String reverseString(String x){ //*helper method - String output = ""; - for(int i=x.length()-1; i>=0; i--){ - output += x.charAt(i); //addition of chars create String - } - return output; - } - - - public Boolean FirstWay(String x){ //*palindrome method, returns true if palindrome - return (x.equalsIgnoreCase(reverseString(x))); - } - - public boolean SecondWay(String x) - { - if (x.length() == 0 || x.length() == 1) - return true; - - if (x.charAt(0) != x.charAt(x.length() - 1)) - return false; - - return SecondWay(x.substring(1 , x.length() - 1)); - } - } diff --git a/Others/PasswordGen.java b/Others/PasswordGen.java deleted file mode 100644 index bde0a50..0000000 --- a/Others/PasswordGen.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.Collections; -import java.util.Random; -import java.util.List; -import java.util.ArrayList; - -/* - Creates a random password from ASCII letters - Given password length bounds - - author: AKS1996 - date: 2017-10-25 -*/ - -class PasswordGen { - public static void main(String args[]){ - String password = generatePassword(8,16); - System.out.print("Password: " + password); - } - - static String generatePassword(int min_length, int max_length){ - Random random = new Random(); - - String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - String lower = "abcdefghijklmnopqrstuvwxyz"; - String numbers = "0123456789"; - String specialChars = "!@#$%^&*(){}?"; - - String allChars = upper+lower+numbers+specialChars; - - List letters = new ArrayList(); - for(char c:allChars.toCharArray()) - letters.add(c); - - // Inbuilt method to randomly shuffle a elements of a list - Collections.shuffle(letters); - String password = ""; - - // Note that size of the password is also random - for(int i = random.nextInt(max_length-min_length) + min_length; i>0; --i) { - password += letters.get(random.nextInt(letters.size())); - } - - return password; - } -} diff --git a/Others/PerlinNoise.java b/Others/PerlinNoise.java deleted file mode 100644 index 1d0f795..0000000 --- a/Others/PerlinNoise.java +++ /dev/null @@ -1,164 +0,0 @@ -import java.util.Random; -import java.util.Scanner; - -/** - * For detailed info and implementation see: Perlin-Noise - */ -public class PerlinNoise { - /** - * @param width width of noise array - * @param height height of noise array - * @param octaveCount numbers of layers used for blending noise - * @param persistence value of impact each layer get while blending - * @param seed used for randomizer - * @return float array containing calculated "Perlin-Noise" values - */ - static float[][] generatePerlinNoise(int width, int height, int octaveCount, float persistence, long seed) { - final float[][] base = new float[width][height]; - final float[][] perlinNoise = new float[width][height]; - final float[][][] noiseLayers = new float[octaveCount][][]; - - Random random = new Random(seed); - //fill base array with random values as base for noise - for(int x = 0; x < width; x++) { - for(int y = 0; y < height; y++) { - base[x][y] = random.nextFloat(); - } - } - - //calculate octaves with different roughness - for(int octave = 0; octave < octaveCount; octave++) { - noiseLayers[octave] = generatePerlinNoiseLayer(base, width, height, octave); - } - - float amplitude = 1f; - float totalAmplitude = 0f; - - //calculate perlin noise by blending each layer together with specific persistence - for(int octave = octaveCount - 1; octave >= 0; octave--) { - amplitude *= persistence; - totalAmplitude += amplitude; - - for(int x = 0; x < width; x++) { - for(int y = 0; y < height; y++) { - //adding each value of the noise layer to the noise - //by increasing amplitude the rougher noises will have more impact - perlinNoise[x][y] += noiseLayers[octave][x][y] * amplitude; - } - } - } - - //normalize values so that they stay between 0..1 - for(int x = 0; x < width; x++) { - for (int y = 0; y < height; y++) { - perlinNoise[x][y] /= totalAmplitude; - } - } - - return perlinNoise; - } - - /** - * @param base base random float array - * @param width width of noise array - * @param height height of noise array - * @param octave current layer - * @return float array containing calculated "Perlin-Noise-Layer" values - */ - static float[][] generatePerlinNoiseLayer(float[][] base, int width, int height, int octave) { - float[][] perlinNoiseLayer = new float[width][height]; - - //calculate period (wavelength) for different shapes - int period = 1 << octave; //2^k - float frequency = 1f / period; // 1/2^k - - for(int x = 0; x < width; x++) { - //calculates the horizontal sampling indices - int x0 = (x / period) * period; - int x1 = (x0 + period) % width; - float horizintalBlend = (x - x0) * frequency; - - for(int y = 0; y < height; y++) { - //calculates the vertical sampling indices - int y0 = (y / period) * period; - int y1 = (y0 + period) % height; - float verticalBlend = (y - y0) * frequency; - - //blend top corners - float top = interpolate(base[x0][y0], base[x1][y0], horizintalBlend); - - //blend bottom corners - float bottom = interpolate(base[x0][y1], base[x1][y1], horizintalBlend); - - //blend top and bottom interpolation to get the final blend value for this cell - perlinNoiseLayer[x][y] = interpolate(top, bottom, verticalBlend); - } - } - - return perlinNoiseLayer; - } - - /** - * @param a value of point a - * @param b value of point b - * @param alpha determine which value has more impact (closer to 0 -> a, closer to 1 -> b) - * @return interpolated value - */ - static float interpolate(float a, float b, float alpha) { - return a * (1 - alpha) + alpha * b; - } - - public static void main(String[] args) { - Scanner in = new Scanner(System.in); - - final int width; - final int height; - final int octaveCount; - final float persistence; - final long seed; - final String charset; - final float[][] perlinNoise; - - System.out.println("Width (int): "); - width = in.nextInt(); - - System.out.println("Height (int): "); - height = in.nextInt(); - - System.out.println("Octave count (int): "); - octaveCount = in.nextInt(); - - System.out.println("Persistence (float): "); - persistence = in.nextFloat(); - - System.out.println("Seed (long): "); - seed = in.nextLong(); - - System.out.println("Charset (String): "); - charset = in.next(); - - - perlinNoise = generatePerlinNoise(width, height, octaveCount, persistence, seed); - final char[] chars = charset.toCharArray(); - final int length = chars.length; - final float step = 1f / length; - //output based on charset - for(int x = 0; x < width; x++) { - for(int y = 0; y < height; y++) { - float value = step; - float noiseValue = perlinNoise[x][y]; - - for (char c : chars) { - if (noiseValue <= value) { - System.out.print(c); - break; - } - - value += step; - } - } - - System.out.println(); - } - } -} diff --git a/Others/PowerOfTwoOrNot.java b/Others/PowerOfTwoOrNot.java deleted file mode 100644 index 36facfe..0000000 --- a/Others/PowerOfTwoOrNot.java +++ /dev/null @@ -1,33 +0,0 @@ -import java.util.Scanner; - -/** -*A utility to check if a given number is power of two or not. -*For example 8,16 etc. -*/ -public class PowerOfTwoOrNot { - - public static void main (String[] args) { - - Scanner sc = new Scanner(System.in); - System.out.println("Enter the number"); - int num = sc.nextInt(); - boolean isPowerOfTwo = checkIfPowerOfTwoOrNot(num); - if (isPowerOfTwo) { - System.out.println("Number is a power of two"); - } else { - System.out.println("Number is not a power of two"); - } - } - - -/** -* Checks whether given number is power of two or not. -* -* @param number -* @return boolean -*/ -public static boolean checkIfPowerOfTwoOrNot(int number) { - return number != 0 && ((number & (number-1)) == 0); - } - -} diff --git a/Others/QueueUsingTwoStacks.java b/Others/QueueUsingTwoStacks.java deleted file mode 100644 index 271c35c..0000000 --- a/Others/QueueUsingTwoStacks.java +++ /dev/null @@ -1,158 +0,0 @@ -import java.util.Stack; - -/** - * This implements Queue using two Stacks. - * - * Big O Runtime: - * insert(): O(1) - * remove(): O(1) amortized - * isEmpty(): O(1) - * - * A queue data structure functions the same as a real world queue. - * The elements that are added first are the first to be removed. - * New elements are added to the back/rear of the queue. - * - * @author sahilb2 (https://www.github.com/sahilb2) - * - */ -class QueueWithStack { - - // Stack to keep track of elements inserted into the queue - private Stack inStack; - // Stack to keep track of elements to be removed next in queue - private Stack outStack; - - /** - * Constructor - */ - public QueueWithStack() { - this.inStack = new Stack(); - this.outStack = new Stack(); - } - - /** - * Inserts an element at the rear of the queue - * - * @param x element to be added - */ - public void insert(Object x) { - // Insert element into inStack - this.inStack.push(x); - } - - /** - * Remove an element from the front of the queue - * - * @return the new front of the queue - */ - public Object remove() { - if(this.outStack.isEmpty()) { - // Move all elements from inStack to outStack (preserving the order) - while(!this.inStack.isEmpty()) { - this.outStack.push( this.inStack.pop() ); - } - } - return this.outStack.pop(); - } - - /** - * Peek at the element from the front of the queue - * - * @return the front element of the queue - */ - public Object peekFront() { - if(this.outStack.isEmpty()) { - // Move all elements from inStack to outStack (preserving the order) - while(!this.inStack.isEmpty()) { - this.outStack.push( this.inStack.pop() ); - } - } - return this.outStack.peek(); - } - - /** - * Peek at the element from the back of the queue - * - * @return the back element of the queue - */ - public Object peekBack() { - return this.inStack.peek(); - } - - /** - * Returns true if the queue is empty - * - * @return true if the queue is empty - */ - public boolean isEmpty() { - return (this.inStack.isEmpty() && this.outStack.isEmpty()); - } - -} - -/** - * This class is the example for the Queue class - * - * @author sahilb2 (https://www.github.com/sahilb2) - * - */ -public class QueueUsingTwoStacks { - - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String args[]){ - QueueWithStack myQueue = new QueueWithStack(); - myQueue.insert(1); - System.out.println(myQueue.peekBack()); //Will print 1 - // instack: [(top) 1] - // outStack: [] - myQueue.insert(2); - System.out.println(myQueue.peekBack()); //Will print 2 - // instack: [(top) 2, 1] - // outStack: [] - myQueue.insert(3); - System.out.println(myQueue.peekBack()); //Will print 3 - // instack: [(top) 3, 2, 1] - // outStack: [] - myQueue.insert(4); - System.out.println(myQueue.peekBack()); //Will print 4 - // instack: [(top) 4, 3, 2, 1] - // outStack: [] - - System.out.println(myQueue.isEmpty()); //Will print false - - System.out.println(myQueue.remove()); //Will print 1 - System.out.println(myQueue.peekBack()); //Will print NULL - // instack: [] - // outStack: [(top) 2, 3, 4] - - myQueue.insert(5); - System.out.println(myQueue.peekFront()); //Will print 2 - // instack: [(top) 5] - // outStack: [(top) 2, 3, 4] - - myQueue.remove(); - System.out.println(myQueue.peekFront()); //Will print 3 - // instack: [(top) 5] - // outStack: [(top) 3, 4] - myQueue.remove(); - System.out.println(myQueue.peekFront()); //Will print 4 - // instack: [(top) 5] - // outStack: [(top) 4] - myQueue.remove(); - // instack: [(top) 5] - // outStack: [] - System.out.println(myQueue.peekFront()); //Will print 5 - // instack: [] - // outStack: [(top) 5] - myQueue.remove(); - // instack: [] - // outStack: [] - - System.out.println(myQueue.isEmpty()); //Will print true - - } -} diff --git a/Others/ReturnSubsequence.java b/Others/ReturnSubsequence.java deleted file mode 100644 index ef3aaed..0000000 --- a/Others/ReturnSubsequence.java +++ /dev/null @@ -1,59 +0,0 @@ -/* -This program will return all the subsequences of the input string in a string array; -Sample Input: -abc -Sample Output: -"" ( Empty String ) -c -b -bc -a -ac -ab -abc - - */ - -import java.util.Scanner; - -public class ReturnSubsequence { - /* - Main function will accept the given string and implement return subsequences function - */ - public static void main(String[] args) { - System.out.println("Enter String: "); - Scanner s=new Scanner(System.in); - String givenString=s.next(); //given string - String[] subsequence=returnSubsequence(givenString); //calling returnSubsequence() function - System.out.println("Subsequences : "); - for(int i=0;i stack=new Stack<>(); - - //Main function - public static void main(String[] args) { - //To Create a Dummy Stack containing integers from 0-9 - for(int i=0;i<10;i++) - { - stack.push(i); - } - System.out.println("STACK"); - - //To print that dummy Stack - for(int k=9;k>=0;k--) - { - System.out.println(k); - } - - //Reverse Function called - reverseUsingRecursion(stack); - - System.out.println("REVERSED STACK : "); - //To print reversed stack - while (!stack.isEmpty()) - { - System.out.println(stack.pop()); - } - - - } - - //Function Used to reverse Stack Using Recursion - private static void reverseUsingRecursion(Stack stack) { - if(stack.isEmpty()) // If stack is empty then return - { - return; - } - /* All items are stored in call stack until we reach the end*/ - - int temptop=stack.peek(); - stack.pop(); - reverseUsingRecursion(stack); //Recursion call - insertAtEnd(temptop); // Insert items held in call stack one by one into stack - } - - //Function used to insert element at the end of stack - private static void insertAtEnd(int temptop) { - if(stack.isEmpty()) - { - stack.push(temptop); // If stack is empty push the element - } - else { - int temp = stack.peek(); /* All the items are stored in call stack until we reach end*/ - stack.pop(); - - insertAtEnd(temptop); //Recursive call - - stack.push(temp); - } - - } - -} diff --git a/Others/ReverseString.java b/Others/ReverseString.java deleted file mode 100644 index 9f4d977..0000000 --- a/Others/ReverseString.java +++ /dev/null @@ -1,46 +0,0 @@ -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * This method produces a reversed version of a string - * - * @author Unknown - * - */ -class ReverseString -{ - - /** - * This method reverses the string str and returns it - * @param str String to be reversed - * @return Reversed string - */ - public static String reverse(String str){ - if(str.isEmpty() || str == null) return str; - - char arr[] = str.toCharArray(); - for(int i = 0, j = str.length() - 1; i < j; i++, j--){ - char temp = arr[i]; - arr[i] = arr[j]; - arr[j] = temp; - } - return new String(arr); - } - - /** - * Main Method - * - * @param args Command line arguments - * @throws IOException Exception thrown because of BufferedReader - */ - public static void main(String args[]) throws IOException - { - BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); - System.out.println("Enter the string"); - String srr=br.readLine(); - System.out.println("Reverse="+reverse(srr)); - br.close(); - } -} - diff --git a/Others/RootPrecision.java b/Others/RootPrecision.java deleted file mode 100644 index b792d69..0000000 --- a/Others/RootPrecision.java +++ /dev/null @@ -1,33 +0,0 @@ -import java.io.*; -import java.util.*; -import java.text.*; -import java.math.*; -import java.util.regex.*; - -public class RootPrecision { - - public static void main(String[] args) { - //take input - Scanner scn = new Scanner(System.in); - - int N = scn.nextInt(); //N is the input number - int P = scn.nextInt(); //P is precision value for eg - P is 3 in 2.564 and 5 in 3.80870. - - System.out.println(squareRoot(N, P)); - } - - public static double squareRoot(int N, int P) { - double rv = 0; //rv means return value - - double root = Math.pow(N, 0.5); - - //calculate precision to power of 10 and then multiply it with root value. - int precision = (int) Math.pow(10, P); - root = root * precision; - /*typecast it into integer then divide by precision and again typecast into double - so as to have decimal points upto P precision */ - - rv = (int)root; - return (double)rv/precision; - } -} diff --git a/Others/SieveOfEratosthenes.java b/Others/SieveOfEratosthenes.java deleted file mode 100644 index 4b6fd5b..0000000 --- a/Others/SieveOfEratosthenes.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ -public class SieveOfEratosthenes { - - /** - * This method implements the Sieve of Eratosthenes Algorithm - * - * @param n The number till which we have to check for prime - * Prints all the prime numbers till n - **/ - - public static void findPrimesTillN(int n) { - int[] arr = new int[n+1]; - - for (int i=0;i<=n;i++) { - arr[i] = 1; - } - - arr[0] = arr[1] = 0; - - for (int i=2;i<=Math.sqrt(n);i++) { - if (arr[i] == 1) { - for (int j=2;i*j <= n;j++) { - arr[i*j] = 0; - } - } - } - - for (int i=0;i skyline) { - Iterator it = skyline.iterator(); - - while(it.hasNext()) { - Skyline temp = it.next(); - System.out.print(temp.coordinates + "," + temp.height); - if(it.hasNext()) { - System.out.print(","); - } - } - - } - - public ArrayList findSkyline(int start, int end) { - if(start == end) { - ArrayList list = new ArrayList<>(); - list.add(new Skyline(building[start].left, building[start].height)); - list.add(new Skyline(building[end].right, 0)); - - return list; - } - - int mid = (start + end) / 2; - - ArrayList sky1 = this.findSkyline(start, mid); - ArrayList sky2 = this.findSkyline(mid + 1, end); - - return this.mergeSkyline(sky1, sky2); - } - - public ArrayList mergeSkyline(ArrayList sky1, ArrayList sky2) { - int currentH1 = 0, currentH2 = 0; - ArrayList skyline = new ArrayList<>(); - int maxH = 0; - - while(!sky1.isEmpty() && !sky2.isEmpty()) { - if(sky1.get(0).coordinates < sky2.get(0).coordinates) { - int currentX = sky1.get(0).coordinates; - currentH1 = sky1.get(0).height; - - if(currentH1 < currentH2) { - sky1.remove(0); - if(maxH != currentH2) skyline.add(new Skyline(currentX, currentH2)); - } else { - maxH = currentH1; - sky1.remove(0); - skyline.add(new Skyline(currentX, currentH1)); - } - } else { - int currentX = sky2.get(0).coordinates; - currentH2 = sky2.get(0).height; - - if(currentH2 < currentH1) { - sky2.remove(0); - if(maxH != currentH1) skyline.add(new Skyline(currentX, currentH1)); - } else { - maxH = currentH2; - sky2.remove(0); - skyline.add(new Skyline(currentX, currentH2)); - } - } - } - - while(!sky1.isEmpty()) { - skyline.add(sky1.get(0)); - sky1.remove(0); - } - - while(!sky2.isEmpty()) { - skyline.add(sky2.get(0)); - sky2.remove(0); - } - - return skyline; - } - - public class Skyline { - public int coordinates; - public int height; - - public Skyline(int coordinates, int height) { - this.coordinates = coordinates; - this.height = height; - } - } - - public class Building { - public int left; - public int height; - public int right; - - public Building(int left, int height, int right) { - this.left = left; - this.height = height; - this.right = right; - } - } - - public static void main(String[] args) { - SkylineProblem skylineProblem = new SkylineProblem(); - skylineProblem.run(); - } -} diff --git a/Others/StackPostfixNotation.java b/Others/StackPostfixNotation.java deleted file mode 100644 index be77eea..0000000 --- a/Others/StackPostfixNotation.java +++ /dev/null @@ -1,38 +0,0 @@ -import java.util.*; - -public class StackPostfixNotation { - public static void main(String[] args) { - Scanner scanner = new Scanner(System.in); - String post = scanner.nextLine(); // Takes input with spaces in between eg. "1 21 +" - System.out.println(postfixEvaluate(post)); - } - - // Evaluates the given postfix expression string and returns the result. - public static int postfixEvaluate(String exp) { - Stack s = new Stack (); - Scanner tokens = new Scanner(exp); - - while (tokens.hasNext()) { - if (tokens.hasNextInt()) { - s.push(tokens.nextInt()); // If int then push to stack - } else { // else pop top two values and perform the operation - int num2 = s.pop(); - int num1 = s.pop(); - String op = tokens.next(); - - if (op.equals("+")) { - s.push(num1 + num2); - } else if (op.equals("-")) { - s.push(num1 - num2); - } else if (op.equals("*")) { - s.push(num1 * num2); - } else { - s.push(num1 / num2); - } - - // "+", "-", "*", "/" - } - } - return s.pop(); - } -} diff --git a/Others/TopKWords.java b/Others/TopKWords.java deleted file mode 100644 index e2d3c6f..0000000 --- a/Others/TopKWords.java +++ /dev/null @@ -1,84 +0,0 @@ -import java.io.*; -import java.util.*; - -/* display the most frequent K words in the file and the times it appear - in the file – shown in order (ignore case and periods) */ - -public class TopKWords { - static class CountWords { - private String fileName; - - public CountWords(String fileName) { - this.fileName = fileName; - } - - public Map getDictionary() { - Map dictionary = new HashMap<>(); - FileInputStream fis = null; - - try { - - fis = new FileInputStream(fileName); // open the file - int in = 0; - String s = ""; // init a empty word - in = fis.read(); // read one character - - while (-1 != in) { - if (Character.isLetter((char)in)) { - s += (char)in; //if get a letter, append to s - } else { - // this branch means an entire word has just been read - if (s.length() > 0) { - // see whether word exists or not - if (dictionary.containsKey(s)) { - // if exist, count++ - dictionary.put(s, dictionary.get(s) + 1); - } else { - // if not exist, initiate count of this word with 1 - dictionary.put(s, 1); - } - } - s = ""; // reInit a empty word - } - in = fis.read(); - } - return dictionary; - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - // you always have to close the I/O streams - fis.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - return null; - } - } - public static void main(String[] args) { - // you can replace the filePath with yours - CountWords cw = new CountWords("/Users/lisanaaa/Desktop/words.txt"); - Map dictionary = cw.getDictionary(); // get the words dictionary: {word: frequency} - - // we change the map to list for convenient sort - List> list = new ArrayList<>(dictionary.entrySet()); - - // sort by lambda valueComparator - list.sort(Comparator.comparing( - m -> m.getValue()) - ); - - Scanner input = new Scanner(System.in); - int k = input.nextInt(); - while (k > list.size()) { - System.out.println("Retype a number, your number is too large"); - input = new Scanner(System.in); - k = input.nextInt(); - } - for (int i = 0; i < k; i++) { - System.out.println(list.get(list.size() - i - 1)); - } - } -} - diff --git a/Others/TowerOfHanoiUsingRecursion.java b/Others/TowerOfHanoiUsingRecursion.java deleted file mode 100644 index b5ee7ad..0000000 --- a/Others/TowerOfHanoiUsingRecursion.java +++ /dev/null @@ -1,26 +0,0 @@ -import java.util.Scanner; - -class TowerOfHanoi -{ - public static void shift(int n, String startPole, String intermediatePole, String endPole) - { - if (n == 0) // if n becomes zero the program returns thus ending the loop. - { - return; - } - - - // Shift function is called in recursion for swapping the n-1 disc from the startPole to the intermediatePole - shift(n - 1, startPole, endPole, intermediatePole); - System.out.println("\nMove \"" + n + "\" from " + startPole + " --> " + endPole); // Result Printing - // Shift function is called in recursion for swapping the n-1 disc from the intermediatePole to the endPole - shift(n - 1, intermediatePole, startPole, endPole); - } - public static void main(String[] args) - { - System.out.print("Enter number of discs on Pole 1: "); - Scanner scanner = new Scanner(System.in); - int numberOfDiscs = scanner.nextInt(); //input of number of discs on pole 1 - shift(numberOfDiscs, "Pole1", "Pole2", "Pole3"); //Shift function called - } -} diff --git a/Others/countwords.java b/Others/countwords.java deleted file mode 100644 index a93aa1a..0000000 --- a/Others/countwords.java +++ /dev/null @@ -1,26 +0,0 @@ -import java.util.Scanner; - -/** - * You enter a string into this program, and it will return how - * many words were in that particular string - * - * @author Marcus - * - */ - public class countwords{ - - public static void main(String[] args){ - Scanner input = new Scanner(System.in); - System.out.println("Enter your text: "); - String str = input.nextLine(); - - System.out.println("Your text has " + wordCount(str) + " word(s)"); - input.close(); - } - - private static int wordCount(String s){ - if(s.isEmpty() || s == null) return 0; - return s.trim().split("[\\s]+").length; - } - - } diff --git a/Others/crc32.java b/Others/crc32.java deleted file mode 100644 index e27c247..0000000 --- a/Others/crc32.java +++ /dev/null @@ -1,27 +0,0 @@ -import java.util.BitSet; - -//Generates a crc32 checksum for a given string or byte array -public class crc32 { - - public static void main(String[] args) { - System.out.println(Integer.toHexString(crc32("Hello World"))); - } - - public static int crc32(String str) { - return crc32(str.getBytes()); - } - - public static int crc32(byte[] data) { - BitSet bitSet = BitSet.valueOf(data); - int crc32 = 0xFFFFFFFF; //initial value - for(int i=0;i>>31)&1) != (bitSet.get(i)?1:0)) - crc32 = (crc32 << 1) ^ 0x04C11DB7; //xoring with polynomial - else - crc32 = (crc32 << 1); - } - crc32 = Integer.reverse(crc32); //result reflect - return crc32 ^ 0xFFFFFFFF; //final xor value - } - -} diff --git a/Others/krishnamurthy.java b/Others/krishnamurthy.java deleted file mode 100644 index 52480eb..0000000 --- a/Others/krishnamurthy.java +++ /dev/null @@ -1,28 +0,0 @@ -import java.util.Scanner; - -class krishnamurthy { - static int fact(int n) { - int i, p = 1; - for (i = n; i >= 1; i--) - p = p * i; - return p; - } - - public static void main(String args[]) { - Scanner sc = new Scanner(System.in); - int a, b, s = 0; - System.out.print("Enter the number : "); - a = sc.nextInt(); - int n = a; - while (a > 0) { - b = a % 10; - s = s + fact(b); - a = a / 10; - } - if (s == n) - System.out.print(n + " is a krishnamurthy number"); - else - System.out.print(n + " is not a krishnamurthy number"); - sc.close(); - } -} diff --git a/Others/removeDuplicateFromString.java b/Others/removeDuplicateFromString.java deleted file mode 100644 index ce8f349..0000000 --- a/Others/removeDuplicateFromString.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.io.BufferedReader; -import java.io.InputStreamReader; - -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ - -public class removeDuplicateFromString { - public static void main (String[] args) throws Exception{ - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - String inp_str = br.readLine(); - - System.out.println("Actual string is: " + inp_str); - System.out.println("String after removing duplicates: " + removeDuplicate(inp_str)); - - br.close(); - } - - /** - * This method produces a string after removing all the duplicate characters from input string and returns it - * Example: Input String - "aabbbccccddddd" - * Output String - "abcd" - * @param s String from which duplicate characters have to be removed - * @return string with only unique characters - */ - - public static String removeDuplicate(String s) { - if(s.isEmpty() || s == null) { - return s; - } - - StringBuilder sb = new StringBuilder(""); - int n = s.length(); - - for (int i = 0; i < n; i++) { - if (sb.toString().indexOf(s.charAt(i)) == -1) { - sb.append(String.valueOf(s.charAt(i))); - } - } - - return sb.toString(); - } -} diff --git a/README.md b/README.md index ce2cdec..2bf7432 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# The Algorithms - Java [![Build Status](https://travis-ci.org/TheAlgorithms/Java.svg)](https://travis-ci.org/TheAlgorithms/Java) +# The Algorithms - Java ### All algorithms implemented in Java (for education) diff --git a/Searches/src/search/BinarySearch.java b/Searches/src/search/BinarySearch.java deleted file mode 100644 index c560ca1..0000000 --- a/Searches/src/search/BinarySearch.java +++ /dev/null @@ -1,94 +0,0 @@ -package search; - -import java.util.Arrays; -import java.util.Random; -import java.util.stream.Stream; - -import static java.lang.String.format; - -/** - * - * - * - * Binary search is one of the most popular algorithms - * The algorithm finds the position of a target value within a sorted array - * - * Worst-case performance O(log n) - * Best-case performance O(1) - * Average performance O(log n) - * Worst-case space complexity O(1) - * - * - * @author Varun Upadhyay (https://github.com/varunu28) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * @see SearchAlgorithm - * @see IterativeBinarySearch - * - */ - -class BinarySearch implements SearchAlgorithm { - - /** - * - * @param array is an array where the element should be found - * @param key is an element which should be found - * @param is any comparable type - * @return index of the element - */ - @Override - public > int find(T array[], T key) { - return search(array, key, 0, array.length); - } - - /** - * This method implements the Generic Binary Search - * - * @param array The array to make the binary search - * @param key The number you are looking for - * @param left The lower bound - * @param right The upper bound - * @return the location of the key - **/ - private > int search(T array[], T key, int left, int right){ - if (right < left) return -1; // this means that the key not found - - // find median - int median = (left + right) >>> 1; - int comp = key.compareTo(array[median]); - - if (comp < 0) { - return search(array, key, left, median - 1); - } - - if (comp > 0) { - return search(array, key, median + 1, right); - } - - return median; - } - - // Driver Program - public static void main(String[] args) { - - //just generate data - Random r = new Random(); - int size = 100; - int maxElement = 100000; - Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)).limit(size).sorted().toArray(Integer[]::new); - - - //the element that should be found - Integer shouldBeFound = integers[r.nextInt(size - 1)]; - - BinarySearch search = new BinarySearch(); - int atIndex = search.find(integers, shouldBeFound); - - System.out.println(String.format("Should be found: %d. Found %d at index %d. An array length %d" - , shouldBeFound, integers[atIndex], atIndex, size)); - - - int toCheck = Arrays.binarySearch(integers, shouldBeFound); - System.out.println(format("Found by system method at an index: %d. Is equal: %b", toCheck, toCheck == atIndex)); - } -} diff --git a/Searches/src/search/InterpolationSearch.java b/Searches/src/search/InterpolationSearch.java deleted file mode 100644 index 06313d1..0000000 --- a/Searches/src/search/InterpolationSearch.java +++ /dev/null @@ -1,79 +0,0 @@ -package search; - -import java.util.Arrays; -import java.util.Random; -import java.util.stream.IntStream; - -import static java.lang.String.format; - -/** - * - * Interpolation search algorithm implementation - * - * Worst-case performance O(n) - * Best-case performance O(1) - * Average performance O(log(log(n))) if the elements are uniformly distributed if not O(n) - * Worst-case space complexity O(1) - * - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - */ -class InterpolationSearch { - - - /** - * @param array is a sorted array - * @param key is a value what shoulb be found in the array - * @return an index if the array contains the key unless -1 - */ - public int find(int array[], int key) { - // Find indexes of two corners - int start = 0, end = (array.length - 1); - - // Since array is sorted, an element present - // in array must be in range defined by corner - while (start <= end && key >= array[start] && key <= array[end]) - { - // Probing the position with keeping - // uniform distribution in mind. - int pos = start + (((end-start) / (array[end]-array[start]))*(key - array[start])); - - // Condition of target found - if (array[pos] == key) - return pos; - - // If key is larger, key is in upper part - if (array[pos] < key) - start = pos + 1; - - // If key is smaller, x is in lower part - else - end = pos - 1; - } - return -1; - } - - // Driver method - public static void main(String[] args) { - Random r = new Random(); - int size = 100; - int maxElement = 100000; - int[] integers = IntStream.generate(() -> r.nextInt(maxElement)).limit(size).sorted().toArray(); - - - //the element that should be found - Integer shouldBeFound = integers[r.nextInt(size - 1)]; - - InterpolationSearch search = new InterpolationSearch(); - int atIndex = search.find(integers, shouldBeFound); - - System.out.println(String.format("Should be found: %d. Found %d at index %d. An array length %d" - , shouldBeFound, integers[atIndex], atIndex, size)); - - - int toCheck = Arrays.binarySearch(integers, shouldBeFound); - System.out.println(format("Found by system method at an index: %d. Is equal: %b", toCheck, toCheck == atIndex)); - } -} - diff --git a/Searches/src/search/IterativeBinarySearch.java b/Searches/src/search/IterativeBinarySearch.java deleted file mode 100644 index 17bfe39..0000000 --- a/Searches/src/search/IterativeBinarySearch.java +++ /dev/null @@ -1,82 +0,0 @@ -package search; - -import java.util.Arrays; -import java.util.Random; -import java.util.stream.Stream; - -import static java.lang.String.format; - -/** - * Binary search is one of the most popular algorithms - * This class represents iterative version {@link BinarySearch} - * Iterative binary search is likely to have lower constant factors because it doesn't involve the overhead of manipulating the call stack. - * But in java the recursive version can be optimized by the compiler to this version. - * - * Worst-case performance O(log n) - * Best-case performance O(1) - * Average performance O(log n) - * Worst-case space complexity O(1) - * - * @author Gabriele La Greca : https://github.com/thegabriele97 - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * @see SearchAlgorithm - * @see BinarySearch - * - */ - -public final class IterativeBinarySearch implements SearchAlgorithm { - - /** - * This method implements an iterative version of binary search algorithm - * - * @param array a sorted array - * @param key the key to search in array - * - * @return the index of key in the array or -1 if not found - */ - @Override - public > int find(T[] array, T key) { - int l, r, k, cmp; - - l = 0; - r = array.length - 1; - - while (l <= r) { - k = (l + r) / 2; - cmp = key.compareTo(array[k]); - - if (cmp == 0) { - return k; - } else if (cmp < 0) { - r = --k; - } else { - l = ++k; - } - } - - return -1; - } - - //Only a main method for test purpose - public static void main(String[] args) { - Random r = new Random(); - int size = 100; - int maxElement = 100000; - Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)).limit(size).sorted().toArray(Integer[]::new); - - - //the element that should be found - Integer shouldBeFound = integers[r.nextInt(size - 1)]; - - IterativeBinarySearch search = new IterativeBinarySearch(); - int atIndex = search.find(integers, shouldBeFound); - - System.out.println(String.format("Should be found: %d. Found %d at index %d. An array length %d" - , shouldBeFound, integers[atIndex], atIndex, size)); - - - int toCheck = Arrays.binarySearch(integers, shouldBeFound); - System.out.println(format("Found by system method at an index: %d. Is equal: %b", toCheck, toCheck == atIndex)); - } -} diff --git a/Searches/src/search/IterativeTernarySearch.java b/Searches/src/search/IterativeTernarySearch.java deleted file mode 100644 index c3538e6..0000000 --- a/Searches/src/search/IterativeTernarySearch.java +++ /dev/null @@ -1,87 +0,0 @@ -package search; - -import java.util.Arrays; -import java.util.Random; -import java.util.stream.Stream; - -import static java.lang.String.format; - -/** - * - * A iterative version of a ternary search algorithm - * This is better way to implement the ternary search, because a recursive version adds some overhead to a stack. - * But in java the compile can transform the recursive version to iterative implicitly, - * so there are no much differences between these two algorithms - * - * Worst-case performance Θ(log3(N)) - * Best-case performance O(1) - * Average performance Θ(log3(N)) - * Worst-case space complexity O(1) - * - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * @since 2018-04-13 - * - * @see SearchAlgorithm - * @see TernarySearch - * - */ - -public class IterativeTernarySearch implements SearchAlgorithm { - - - @Override - public > int find(T[] array, T key) { - int left = 0; - int right = array.length - 1; - - while (right > left) { - - int leftCmp = array[left].compareTo(key); - int rightCmp = array[right].compareTo(key); - if (leftCmp == 0) return left; - if (rightCmp == 0) return right; - - int leftThird = left + (right - left) / 3 + 1; - int rightThird = right - (right - left) / 3 - 1; - - - if (array[leftThird].compareTo(key) <= 0) { - left = leftThird; - } else { - right = rightThird; - } - } - - return -1; - } - - - public static void main(String[] args) { - //just generate data - Random r = new Random(); - int size = 100; - int maxElement = 100000; - Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)) - .limit(size) - .sorted() - .toArray(Integer[]::new); - - - //the element that should be found - Integer shouldBeFound = integers[r.nextInt(size - 1)]; - - IterativeTernarySearch search = new IterativeTernarySearch(); - int atIndex = search.find(integers, shouldBeFound); - - System.out.println(format("Should be found: %d. Found %d at index %d. An array length %d", - shouldBeFound, integers[atIndex], atIndex, size)); - - int toCheck = Arrays.binarySearch(integers, shouldBeFound); - System.out.println(format("Found by system method at an index: %d. Is equal: %b", - toCheck, toCheck == atIndex)); - - } - - -} diff --git a/Searches/src/search/LinearSearch.java b/Searches/src/search/LinearSearch.java deleted file mode 100644 index 6e96da0..0000000 --- a/Searches/src/search/LinearSearch.java +++ /dev/null @@ -1,63 +0,0 @@ -package search; - -import java.util.Random; -import java.util.stream.Stream; - -/** - * Linear search is the easiest search algorithm - * It works with sorted and unsorted arrays (an binary search works only with sorted array) - * This algorithm just compares all elements of an array to find a value - * - * Worst-case performance O(n) - * Best-case performance O(1) - * Average performance O(n) - * Worst-case space complexity - * - * - * @author Varun Upadhyay (https://github.com/varunu28) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * - * @see BinarySearch - * @see SearchAlgorithm - */ - -public class LinearSearch implements SearchAlgorithm { - - /** - * Generic Linear search method - * - * @param array List to be searched - * @param value Key being searched for - * @return Location of the key - */ - @Override - public > int find(T[] array, T value) { - for (int i = 0; i < array.length ; i++) { - if (array[i].compareTo(value) == 0) { - return i; - } - } - return -1; - } - - - public static void main(String[] args) { - //just generate data - Random r = new Random(); - int size = 200; - int maxElement = 100; - Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)).limit(size).toArray(Integer[]::new); - - - //the element that should be found - Integer shouldBeFound = integers[r.nextInt(size - 1)]; - - LinearSearch search = new LinearSearch(); - int atIndex = search.find(integers, shouldBeFound); - - System.out.println(String.format("Should be found: %d. Found %d at index %d. An array length %d" - , shouldBeFound, integers[atIndex], atIndex, size)); - } - -} diff --git a/Searches/src/search/SaddlebackSearch.java b/Searches/src/search/SaddlebackSearch.java deleted file mode 100644 index 68779db..0000000 --- a/Searches/src/search/SaddlebackSearch.java +++ /dev/null @@ -1,80 +0,0 @@ -package search; - -import java.util.Scanner; - -/** - * Program to perform Saddleback Search - * Given a sorted 2D array(elements are sorted across every row and column, assuming ascending order) - * of size n*m we can search a given element in O(n+m) - *

- * we start from bottom left corner - * if the current element is greater than the given element then we move up - * else we move right - * Sample Input: - * 5 5 ->Dimensions - * -10 -5 -3 4 9 - * -6 -2 0 5 10 - * -4 -1 1 6 12 - * 2 3 7 8 13 - * 100 120 130 140 150 - * 140 ->element to be searched - * output: 4 3 // first value is row, second one is column - * - * @author Nishita Aggarwal - */ -public class SaddlebackSearch { - - /** - * This method performs Saddleback Search - * - * @param arr The **Sorted** array in which we will search the element. - * @param row the current row. - * @param col the current column. - * @param key the element that we want to search for. - * @return The index(row and column) of the element if found. - * Else returns -1 -1. - */ - private static int[] find(int arr[][], int row, int col, int key) { - - //array to store the answer row and column - int ans[] = {-1, -1}; - if (row < 0 || col >= arr[row].length) { - return ans; - } - if (arr[row][col] == key) { - ans[0] = row; - ans[1] = col; - return ans; - } - //if the current element is greater than the given element then we move up - else if (arr[row][col] > key) { - return find(arr, row - 1, col, key); - } - //else we move right - return find(arr, row, col + 1, key); - } - - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String[] args) { - // TODO Auto-generated method stub - Scanner sc = new Scanner(System.in); - int arr[][]; - int i, j, rows = sc.nextInt(), col = sc.nextInt(); - arr = new int[rows][col]; - for (i = 0; i < rows; i++) { - for (j = 0; j < col; j++) { - arr[i][j] = sc.nextInt(); - } - } - int ele = sc.nextInt(); - //we start from bottom left corner - int ans[] = find(arr, rows - 1, 0, ele); - System.out.println(ans[0] + " " + ans[1]); - sc.close(); - } - -} diff --git a/Searches/src/search/SearchAlgorithm.java b/Searches/src/search/SearchAlgorithm.java deleted file mode 100644 index ca3bf59..0000000 --- a/Searches/src/search/SearchAlgorithm.java +++ /dev/null @@ -1,20 +0,0 @@ -package search; - -/** - * The common interface of most searching algorithms - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - **/ -public interface SearchAlgorithm { - - /** - * - * @param key is an element which should be found - * @param array is an array where the element should be found - * @param Comparable type - * @return first found index of the element - */ - > int find(T array[], T key); - -} diff --git a/Searches/src/search/TernarySearch.java b/Searches/src/search/TernarySearch.java deleted file mode 100644 index 7e60edf..0000000 --- a/Searches/src/search/TernarySearch.java +++ /dev/null @@ -1,106 +0,0 @@ -package search; - - -import java.util.Arrays; -import java.util.Random; -import java.util.stream.Stream; - -import static java.lang.String.format; - -/** - * - * - * - * A ternary search algorithm is a technique in computer science for finding the minimum or maximum of a unimodal function - * The algorithm determines either that the minimum or maximum cannot be in the first third of the domain - * or that it cannot be in the last third of the domain, then repeats on the remaining third. - * - * Worst-case performance Θ(log3(N)) - * Best-case performance O(1) - * Average performance Θ(log3(N)) - * Worst-case space complexity O(1) - * - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * @see SearchAlgorithm - * @see IterativeBinarySearch - * - */ - -public class TernarySearch implements SearchAlgorithm{ - - /** - * @param arr The **Sorted** array in which we will search the element. - * @param value The value that we want to search for. - * @return The index of the element if found. - * Else returns -1. - */ - @Override - public > int find(T[] arr, T value){ - return ternarySearch(arr, value, 0, arr.length - 1); - } - - /** - * @param arr The **Sorted** array in which we will search the element. - * @param key The value that we want to search for. - * @param start The starting index from which we will start Searching. - * @param end The ending index till which we will Search. - * @return Returns the index of the Element if found. - * Else returns -1. - */ - private > int ternarySearch(T[] arr, T key, int start, int end) { - if (start > end){ - return -1; - } - /* First boundary: add 1/3 of length to start */ - int mid1 = start + (end - start) / 3; - /* Second boundary: add 2/3 of length to start */ - int mid2 = start + 2 * (end - start) / 3; - - if (key.compareTo(arr[mid1]) == 0) { - return mid1; - } - else if (key.compareTo(arr[mid2]) == 0) { - return mid2; - } - - /* Search the first (1/3) rd part of the array.*/ - - else if (key.compareTo(arr[mid1]) < 0) { - return ternarySearch(arr, key, start, --mid1); - } - /* Search 3rd (1/3)rd part of the array */ - - else if (key.compareTo(arr[mid2]) > 0) { - return ternarySearch(arr, key, ++mid2, end); - } - /* Search middle (1/3)rd part of the array */ - - else { - return ternarySearch(arr, key, mid1, mid2); - } - } - - public static void main(String[] args) { - //just generate data - Random r = new Random(); - int size = 100; - int maxElement = 100000; - Integer[] integers = Stream.generate(() -> r.nextInt(maxElement)).limit(size).sorted().toArray(Integer[]::new); - - - //the element that should be found - Integer shouldBeFound = integers[r.nextInt(size - 1)]; - - TernarySearch search = new TernarySearch(); - int atIndex = search.find(integers, shouldBeFound); - - System.out.println(format("Should be found: %d. Found %d at index %d. An array length %d" - , shouldBeFound, integers[atIndex], atIndex, size)); - - int toCheck = Arrays.binarySearch(integers, shouldBeFound); - System.out.println(format("Found by system method at an index: %d. Is equal: %b", toCheck, toCheck == atIndex)); - - } -} \ No newline at end of file diff --git a/SkylineProblem/SkylineProblem.java b/SkylineProblem/SkylineProblem.java deleted file mode 100644 index a0b7063..0000000 --- a/SkylineProblem/SkylineProblem.java +++ /dev/null @@ -1,131 +0,0 @@ -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Scanner; - -public class SkylineProblem { - Building[] building; - int count; - - public void run() { - Scanner sc = new Scanner(System.in); - - int num = sc.nextInt(); - this.building = new Building[num]; - - for(int i = 0; i < num; i++) { - String input = sc.next(); - String[] data = input.split(","); - this.add(Integer.parseInt(data[0]), Integer.parseInt(data[1]), Integer.parseInt(data[2])); - } - this.print(this.findSkyline(0, num - 1)); - - sc.close(); - } - - public void add(int left, int height, int right) { - building[count++] = new Building(left, height, right); - } - - public void print(ArrayList skyline) { - Iterator it = skyline.iterator(); - - while(it.hasNext()) { - Skyline temp = it.next(); - System.out.print(temp.coordinates + "," + temp.height); - if(it.hasNext()) { - System.out.print(","); - } - } - - } - - public ArrayList findSkyline(int start, int end) { - if(start == end) { - ArrayList list = new ArrayList<>(); - list.add(new Skyline(building[start].left, building[start].height)); - list.add(new Skyline(building[end].right, 0)); - - return list; - } - - int mid = (start + end) / 2; - - ArrayList sky1 = this.findSkyline(start, mid); - ArrayList sky2 = this.findSkyline(mid + 1, end); - - return this.mergeSkyline(sky1, sky2); - } - - public ArrayList mergeSkyline(ArrayList sky1, ArrayList sky2) { - int currentH1 = 0, currentH2 = 0; - ArrayList skyline = new ArrayList<>(); - int maxH = 0; - - while(!sky1.isEmpty() && !sky2.isEmpty()) { - if(sky1.get(0).coordinates < sky2.get(0).coordinates) { - int currentX = sky1.get(0).coordinates; - currentH1 = sky1.get(0).height; - - if(currentH1 < currentH2) { - sky1.remove(0); - if(maxH != currentH2) skyline.add(new Skyline(currentX, currentH2)); - } else { - maxH = currentH1; - sky1.remove(0); - skyline.add(new Skyline(currentX, currentH1)); - } - } else { - int currentX = sky2.get(0).coordinates; - currentH2 = sky2.get(0).height; - - if(currentH2 < currentH1) { - sky2.remove(0); - if(maxH != currentH1) skyline.add(new Skyline(currentX, currentH1)); - } else { - maxH = currentH2; - sky2.remove(0); - skyline.add(new Skyline(currentX, currentH2)); - } - } - } - - while(!sky1.isEmpty()) { - skyline.add(sky1.get(0)); - sky1.remove(0); - } - - while(!sky2.isEmpty()) { - skyline.add(sky2.get(0)); - sky2.remove(0); - } - - return skyline; - } - - public class Skyline { - public int coordinates; - public int height; - - public Skyline(int coordinates, int height) { - this.coordinates = coordinates; - this.height = height; - } - } - - public class Building { - public int left; - public int height; - public int right; - - public Building(int left, int height, int right) { - this.left = left; - this.height = height; - this.right = right; - } - } - - public static void main(String[] args) { - SkylineProblem skylineProblem = new SkylineProblem(); - skylineProblem.run(); - } -} diff --git a/Sorts/src/sort/BinaryTreeSort.java b/Sorts/src/sort/BinaryTreeSort.java deleted file mode 100644 index 59d58ab..0000000 --- a/Sorts/src/sort/BinaryTreeSort.java +++ /dev/null @@ -1,96 +0,0 @@ -package sort; - -import static sort.SortUtils.less; -import static sort.SortUtils.print; - -/** - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * @see SortAlgorithm - * - */ -public class BinaryTreeSort implements SortAlgorithm { - - interface TreeVisitor> { - void visit(Node node); - } - - private static class SortVisitor> implements TreeVisitor { - - private final T[] array; - private int counter; - - SortVisitor(T[] array) { - this.array = array; - } - - @Override - public void visit(Node node) { - array[counter++] = node.value; - } - } - - private static class Node>{ - private T value; - private Node left; - private Node right; - - Node(T value) { - this.value = value; - } - - void insert(Node node) { - if (less(node.value, value)){ - if (left != null) left.insert(node); - else left = node; - } - else { - if (right != null) right.insert(node); - else right = node; - } - } - - void traverse(TreeVisitor visitor) { - if ( left != null) - left.traverse(visitor); - - visitor.visit(this); - - if ( right != null ) - right.traverse(visitor ); - } - - } - - - @Override - public > T[] sort(T[] array) { - - Node root = new Node<>(array[0]); - for (int i = 1; i < array.length; i++) { - root.insert(new Node<>(array[i])); - } - - root.traverse(new SortVisitor<>(array)); - - return array; - } - - - public static void main(String args[]) { - - Integer[] intArray = {12, 40, 9, 3, 19, 74, 7, 31, 23, 54, 26, 81, 12}; - BinaryTreeSort treeSort = new BinaryTreeSort(); - Integer[] sorted = treeSort.sort(intArray); - print(sorted); - - Double[] decimalArray = {8.2, 1.5, 3.14159265, 9.3, 5.1, 4.8, 2.6}; - print(treeSort.sort(decimalArray)); - - String[] stringArray = {"c", "a", "e", "b","d", "dd","da","zz", "AA", "aa","aB","Hb", "Z"}; - print(treeSort.sort(stringArray)); - } - -} - diff --git a/Sorts/src/sort/BogoSort.java b/Sorts/src/sort/BogoSort.java deleted file mode 100644 index 1079ca2..0000000 --- a/Sorts/src/sort/BogoSort.java +++ /dev/null @@ -1,59 +0,0 @@ -package sort; - -import java.util.Random; - -import static sort.SortUtils.*; - - -/** - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * @see SortAlgorithm - * - */ -public class BogoSort implements SortAlgorithm { - - private static final Random random = new Random(); - - - private static > boolean isSorted(T array[]){ - for(int i = 0; i void nextPermutation(T array[]){ - int length = array.length; - - for (int i = 0; i < array.length; i++) { - int randomIndex = i + random.nextInt(length - i); - swap(array, randomIndex, i); - } - } - - public > T[] sort(T array[]) { - while(!isSorted(array)){ - nextPermutation(array); - } - return array; - } - - // Driver Program - public static void main(String[] args) { - // Integer Input - Integer[] integers = {4, 23, 6, 78, 1, 54, 231, 9, 12}; - - BogoSort bogoSort = new BogoSort(); - - // print a sorted array - print(bogoSort.sort(integers)); - - // String Input - String[] strings = {"c", "a", "e", "b","d"}; - - print(bogoSort.sort(strings)); - } -} diff --git a/Sorts/src/sort/BubbleSort.java b/Sorts/src/sort/BubbleSort.java deleted file mode 100644 index 1173245..0000000 --- a/Sorts/src/sort/BubbleSort.java +++ /dev/null @@ -1,55 +0,0 @@ -package sort; - -import static sort.SortUtils.*; - -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * @see SortAlgorithm - */ - -class BubbleSort implements SortAlgorithm { - /** - * This method implements the Generic Bubble Sort - * - * @param array The array to be sorted - * Sorts the array in increasing order - **/ - - @Override - public > T[] sort(T array[]) { - int last = array.length; - //Sorting - boolean swap; - do { - swap = false; - for (int count = 0; count < last-1; count++) { - if (less(array[count], array[count + 1])) { - swap = swap(array, count, count + 1); - } - } - last--; - } while (swap); - return array; - } - - // Driver Program - public static void main(String[] args) { - - // Integer Input - Integer[] integers = {4, 23, 6, 78, 1, 54, 231, 9, 12}; - BubbleSort bubbleSort = new BubbleSort(); - bubbleSort.sort(integers); - - // Output => 231, 78, 54, 23, 12, 9, 6, 4, 1 - print(integers); - - // String Input - String[] strings = {"c", "a", "e", "b","d"}; - //Output => e, d, c, b, a - print(bubbleSort.sort(strings)); - - } -} diff --git a/Sorts/src/sort/CocktailShakerSort.java b/Sorts/src/sort/CocktailShakerSort.java deleted file mode 100644 index 7982b8f..0000000 --- a/Sorts/src/sort/CocktailShakerSort.java +++ /dev/null @@ -1,67 +0,0 @@ -package sort; - -import static sort.SortUtils.*; - -/** - * - * @author Mateus Bizzo (https://github.com/MattBizzo) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - */ - -class CocktailShakerSort implements SortAlgorithm { - - /** - * This method implements the Generic Cocktail Shaker Sort - * - * @param array The array to be sorted - * Sorts the array in increasing order - **/ - - @Override - public > T[] sort(T[] array) { - - int length = array.length; - int left = 0; - int right = length - 1; - int swappedLeft, swappedRight; - while (left < right) { - // front - swappedRight = 0; - for (int i = left; i < right; i++) { - if (less(array[i + 1], array[i])) { - swap(array, i, i + 1); - swappedRight = i; - } - } - // back - right = swappedRight; - swappedLeft = length - 1; - for (int j = right; j > left; j--) { - if (less(array[j], array[j - 1])) { - swap(array, j - 1, j); - swappedLeft = j; - } - } - left = swappedLeft; - } - return array; - - } - - // Driver Program - public static void main(String[] args) { - // Integer Input - Integer[] integers = { 4, 23, 6, 78, 1, 54, 231, 9, 12 }; - CocktailShakerSort shakerSort = new CocktailShakerSort(); - - // Output => 1 4 6 9 12 23 54 78 231 - print(shakerSort.sort(integers)); - - // String Input - String[] strings = { "c", "a", "e", "b", "d" }; - print(shakerSort.sort(strings)); - } - - -} diff --git a/Sorts/src/sort/CombSort.java b/Sorts/src/sort/CombSort.java deleted file mode 100644 index 492605c..0000000 --- a/Sorts/src/sort/CombSort.java +++ /dev/null @@ -1,76 +0,0 @@ -package sort; - -import static sort.SortUtils.*; - - -/** - * - * Comb Sort algorithm implementation - * - * Best-case performance O(n * log(n)) - * Worst-case performance O(n ^ 2) - * Worst-case space complexity O(1) - * - * Comb sort improves on bubble sort. - * - * - * @see BubbleSort - * @see SortAlgorithm - * - * @author Sandeep Roy (https://github.com/sandeeproy99) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - */ -class CombSort implements SortAlgorithm { - - // To find gap between elements - private int nextGap(int gap) { - // Shrink gap by Shrink factor - gap = ( gap * 10 ) / 13; - return ( gap < 1 ) ? 1 : gap; - } - - /** - * Function to sort arr[] using Comb - * @param arr - an array should be sorted - * @return sorted array - */ - @Override - public > T[] sort(T arr[]) { - int size = arr.length; - - // initialize gap - int gap = size; - - // Initialize swapped as true to make sure that loop runs - boolean swapped = true; - - // Keep running while gap is more than 1 and last iteration caused a swap - while (gap != 1 || swapped) { - // Find next gap - gap = nextGap(gap); - - // Initialize swapped as false so that we can check if swap happened or not - swapped = false; - - // Compare all elements with current gap - for (int i = 0; i < size - gap ; i++) { - if (less(arr[i + gap], arr[i])) { - // Swap arr[i] and arr[i+gap] - swapped = swap(arr, i, i + gap); - } - } - } - return arr; - } - - // Driver method - public static void main(String args[]) { - CombSort ob = new CombSort(); - Integer arr[] = {8, 4, 1, 56, 3, -44, -1 , 0 , 36, 34, 8, 12 , -66, - 78, 23, -6, 28, 0}; - ob.sort(arr); - - System.out.println("sorted array"); - print(arr); - } -} diff --git a/Sorts/src/sort/CountingSort.java b/Sorts/src/sort/CountingSort.java deleted file mode 100644 index 39442a0..0000000 --- a/Sorts/src/sort/CountingSort.java +++ /dev/null @@ -1,102 +0,0 @@ -package sort; - -import java.util.*; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.toList; -import static java.util.stream.Collectors.toMap; -import static sort.SortUtils.print; - -/** - * - * @author Youssef Ali (https://github.com/youssefAli11997) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - */ -class CountingSort implements SortAlgorithm { - - - - @Override - public > T[] sort(T[] unsorted) { - return sort(Arrays.asList(unsorted)).toArray(unsorted); - } - - /** - * This method implements the Generic Counting Sort - * - * @param list The list to be sorted - * - * Sorts the list in increasing order - * The method uses list elements as keys in the frequency map - **/ - @Override - public > List sort(List list) { - - Map frequency = new TreeMap<>(); - // The final output array - List sortedArray = new ArrayList<>(list.size()); - - // Counting the frequency of @param array elements - list.forEach(v -> frequency.put(v, frequency.getOrDefault(v, 0) + 1)); - - // Filling the sortedArray - for(Map.Entry element : frequency.entrySet()) { - for(int j=0; j> List streamSort(List list) { - return list.stream() - .collect(toMap(k -> k, v -> 1, (v1, v2) -> v1 + v2, TreeMap::new)) - .entrySet() - .stream() - .flatMap(entry -> IntStream.rangeClosed(1, entry.getValue()).mapToObj(t -> entry.getKey())) - .collect(toList()); - } - - // Driver Program - public static void main(String[] args) { - // Integer Input - List unsortedInts = Stream.of(4, 23, 6, 78, 1, 54, 23, 1, 9, 231, 9, 12).collect(toList()); - CountingSort countingSort = new CountingSort(); - - System.out.println("Before Sorting:"); - print(unsortedInts); - - // Output => 1 1 4 6 9 9 12 23 23 54 78 231 - System.out.println("After Sorting:"); - print(countingSort.sort(unsortedInts)); - System.out.println("After Sorting By Streams:"); - print(streamSort(unsortedInts)); - - System.out.println("\n------------------------------\n"); - - // String Input - List unsortedStrings = Stream.of("c", "a", "e", "b","d", "a", "f", "g", "c").collect(toList()); - - System.out.println("Before Sorting:"); - print(unsortedStrings); - - //Output => a a b c c d e f g - System.out.println("After Sorting:"); - print(countingSort.sort(unsortedStrings)); - - System.out.println("After Sorting By Streams:"); - print(streamSort(unsortedStrings)); - - } -} diff --git a/Sorts/src/sort/CycleSort.java b/Sorts/src/sort/CycleSort.java deleted file mode 100644 index ea4f055..0000000 --- a/Sorts/src/sort/CycleSort.java +++ /dev/null @@ -1,81 +0,0 @@ -package sort; - -import static sort.SortUtils.less; -import static sort.SortUtils.print; - -/** - * @author Podshivalov Nikita (https://github.com/nikitap492) - */ -class CycleSort implements SortAlgorithm { - - - @Override - public > T[] sort(T[] arr) { - int n = arr.length; - - // traverse array elements - for (int j = 0; j <= n - 2; j++) { - // initialize item as starting point - T item = arr[j]; - - // Find position where we put the item. - int pos = j; - for (int i = j + 1; i < n; i++) - if (less(arr[i], item)) pos++; - - // If item is already in correct position - if (pos == j) continue; - - // ignore all duplicate elements - while (item.compareTo(arr[pos]) == 0) - pos += 1; - - // put the item to it's right position - if (pos != j) { - item = replace(arr, pos, item); - } - - // Rotate rest of the cycle - while (pos != j) { - pos = j; - - // Find position where we put the element - for (int i = j + 1; i < n; i++) - if (less(arr[i], item)){ - pos += 1; - } - - - // ignore all duplicate elements - while (item.compareTo(arr[pos]) == 0) - pos += 1; - - // put the item to it's right position - if (item != arr[pos]) { - item = replace(arr, pos, item); - } - } - } - - return arr; - } - - private > T replace(T[] arr, int pos, T item){ - T temp = item; - item = arr[pos]; - arr[pos] = temp; - return item; - } - - - - public static void main(String[] args) { - Integer arr[] = { 4, 23, 6, 78, 1, 26, 11, 23 , 0, -6, 3, 54, 231, 9, 12 }; - CycleSort cycleSort = new CycleSort(); - cycleSort.sort(arr); - - System.out.println("After sort : "); - print(arr); - } - -} diff --git a/Sorts/src/sort/GnomeSort.java b/Sorts/src/sort/GnomeSort.java deleted file mode 100644 index 14af67c..0000000 --- a/Sorts/src/sort/GnomeSort.java +++ /dev/null @@ -1,44 +0,0 @@ -package sort; - -import static sort.SortUtils.*; - -/** - * Implementation of gnome sort - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * @since 2018-04-10 - * - **/ -public class GnomeSort implements SortAlgorithm{ - - @Override - public > T[] sort(T[] arr) { - int i = 1; - int j = 2; - while (i < arr.length){ - if ( less(arr[i - 1], arr[i]) ) i = j++; - else { - swap(arr, i - 1, i); - if (--i == 0){ i = j++; } - } - } - - return null; - } - - public static void main(String[] args) { - Integer[] integers = { 4, 23, 6, 78, 1, 26, 11, 23 , 0, -6, 3, 54, 231, 9, 12 }; - String[] strings = {"c", "a", "e", "b","d", "dd","da","zz", "AA", "aa","aB","Hb", "Z"}; - GnomeSort gnomeSort = new GnomeSort(); - - gnomeSort.sort(integers); - gnomeSort.sort(strings); - - System.out.println("After sort : "); - print(integers); - print(strings); - - - } - -} diff --git a/Sorts/src/sort/HeapSort.java b/Sorts/src/sort/HeapSort.java deleted file mode 100644 index 6fab374..0000000 --- a/Sorts/src/sort/HeapSort.java +++ /dev/null @@ -1,131 +0,0 @@ -package sort; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static sort.SortUtils.*; - -/** - * Heap Sort Algorithm - * Implements MinHeap - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - */ -public class HeapSort implements SortAlgorithm { - - - private static class Heap> { - /** Array to store heap */ - private T[] heap; - - /** - * Constructor - * - * @param heap array of unordered integers - */ - public Heap(T[] heap) { - this.heap = heap; - } - - /** - * Heapifies subtree from top as root to last as last child - * - * @param rootIndex index of root - * @param lastChild index of last child - */ - private void heapSubtree(int rootIndex, int lastChild) { - int leftIndex = rootIndex * 2 + 1; - int rightIndex = rootIndex * 2 + 2; - T root = heap[rootIndex]; - if (rightIndex <= lastChild) { // if has right and left children - T left = heap[leftIndex]; - T right = heap[rightIndex]; - if (less(left, right) && less(left, root)) { - swap(heap, leftIndex, rootIndex); - heapSubtree(leftIndex, lastChild); - } else if (less(right, root)) { - swap(heap, rightIndex, rootIndex); - heapSubtree(rightIndex, lastChild); - } - } else if (leftIndex <= lastChild) { // if no right child, but has left child - T left = heap[leftIndex]; - if (less(left, root)) { - swap(heap, leftIndex, rootIndex); - heapSubtree(leftIndex, lastChild); - } - } - } - - - /** - * Makes heap with root as root - * - * @param root index of root of heap - */ - private void makeMinHeap(int root) { - int leftIndex = root * 2 + 1; - int rightIndex = root * 2 + 2; - boolean hasLeftChild = leftIndex < heap.length; - boolean hasRightChild = rightIndex < heap.length; - if (hasRightChild) { //if has left and right - makeMinHeap(leftIndex); - makeMinHeap(rightIndex); - heapSubtree(root, heap.length - 1); - } else if (hasLeftChild) { - heapSubtree(root, heap.length - 1); - } - } - - /** - * Gets the root of heap - * - * @return root of heap - */ - private T getRoot(int size) { - swap(heap, 0, size); - heapSubtree(0, size - 1); - return heap[size]; // return old root - } - - - - - - } - - @Override - public > T[] sort(T[] unsorted) { - return sort(Arrays.asList(unsorted)).toArray(unsorted); - } - - @Override - public > List sort(List unsorted) { - int size = unsorted.size(); - - @SuppressWarnings("unchecked") - Heap heap = new Heap<>(unsorted.toArray((T[]) new Comparable[unsorted.size()])); - - heap.makeMinHeap(0); // make min heap using index 0 as root. - List sorted = new ArrayList<>(size); - while (size > 0) { - T min = heap.getRoot(--size); - sorted.add(min); - } - - return sorted; - } - - /** - * Main method - * - * @param args the command line arguments - */ - public static void main(String[] args) { - Integer[] heap = {4, 23, 6, 78, 1, 54, 231, 9, 12}; - HeapSort heapSort = new HeapSort(); - print(heapSort.sort(heap)); - } - -} diff --git a/Sorts/src/sort/InsertionSort.java b/Sorts/src/sort/InsertionSort.java deleted file mode 100644 index 5936143..0000000 --- a/Sorts/src/sort/InsertionSort.java +++ /dev/null @@ -1,61 +0,0 @@ -package sort; - -import static sort.SortUtils.less; -import static sort.SortUtils.print; - -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - */ - -class InsertionSort implements SortAlgorithm { - - /** - * This method implements the Generic Insertion Sort - * Sorts the array in increasing order - * - * @param array The array to be sorted - * - **/ - - @Override - public > T[] sort(T[] array) { - for (int j = 1; j < array.length; j++) { - - // Picking up the key(Card) - T key = array[j]; - int i = j - 1; - - while (i >= 0 && less(key, array[i])) { - array[i + 1] = array[i]; - i--; - } - // Placing the key (Card) at its correct position in the sorted subarray - array[i + 1] = key; - } - return array; - } - - // Driver Program - public static void main(String[] args) { - // Integer Input - Integer[] integers = {4, 23, 6, 78, 1, 54, 231, 9, 12}; - - InsertionSort sort = new InsertionSort(); - - sort.sort(integers); - - // Output => 1 4 6 9 12 23 54 78 231 - print(integers); - - // String Input - String[] strings = {"c", "a", "e", "b","d"}; - - sort.sort(strings); - - //Output => a b c d e - print(strings); - } -} diff --git a/Sorts/src/sort/MergeSort.java b/Sorts/src/sort/MergeSort.java deleted file mode 100644 index 2c7a141..0000000 --- a/Sorts/src/sort/MergeSort.java +++ /dev/null @@ -1,113 +0,0 @@ -package sort; - -import static sort.SortUtils.print; - -/** - * This method implements the Generic Merge Sort - * - * - * @author Varun Upadhyay (https://github.com/varunu28) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * - * @see SortAlgorithm - * - */ - -class MergeSort implements SortAlgorithm { - - - /** - * This method implements the Generic Merge Sort - * @param unsorted the array which should be sorted - * @param Comparable class - * @return sorted array - */ - @Override - @SuppressWarnings("unchecked") - public > T[] sort(T[] unsorted) { - T[] tmp = (T[]) new Comparable[unsorted.length]; - doSort(unsorted, tmp, 0, unsorted.length - 1); - return unsorted; - } - - /** - * - * @param arr The array to be sorted - * @param temp The copy of the actual array - * @param left The first index of the array - * @param right The last index of the array - * Recursively sorts the array in increasing order - **/ - private static > void doSort(T[] arr, T[] temp, int left, int right) { - if (left < right) { - int mid = left + (right - left) / 2; - doSort(arr, temp, left, mid); - doSort(arr, temp,mid + 1, right); - merge(arr, temp, left, mid, right); - } - - } - - /** - * This method implements the merge step of the merge sort - * - * @param arr The array to be sorted - * @param temp The copy of the actual array - * @param left The first index of the array - * @param mid The middle index of the array - * @param right The last index of the array - * merges two parts of an array in increasing order - **/ - - private static > void merge(T[] arr, T[] temp, int left, int mid, int right) { - System.arraycopy(arr, left, temp, left, right - left + 1); - - - int i= left; - int j = mid + 1; - int k = left; - - while (i <= mid && j <= right) { - if (temp[i].compareTo(temp[j]) <= 0) { - arr[k] = temp[i]; - i++; - } - else { - arr[k] = temp[j]; - j++; - } - k++; - } - - while (i <= mid) { - arr[k] = temp[i]; - i++; - k++; - } - - while (j <= right) { - arr[k] = temp[j]; - j++; - k++; - } - } - - // Driver program - public static void main(String[] args) { - - // Integer Input - Integer[] arr = {4, 23, 6, 78, 1, 54, 231, 9, 12}; - MergeSort mergeSort = new MergeSort(); - mergeSort.sort(arr); - - // Output => 1 4 6 9 12 23 54 78 231 - print(arr); - - // String Inpu - String[] stringArray = {"c", "a", "e", "b","d"}; - mergeSort.sort(stringArray); - //Output => a b c d e - print(stringArray); - } -} diff --git a/Sorts/src/sort/PancakeSort.java b/Sorts/src/sort/PancakeSort.java deleted file mode 100644 index 902db4b..0000000 --- a/Sorts/src/sort/PancakeSort.java +++ /dev/null @@ -1,47 +0,0 @@ -package sort; - -import static sort.SortUtils.*; - -/** - * Implementation of gnome sort - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * @since 2018-04-10 - * - **/ -public class PancakeSort implements SortAlgorithm { - - - @Override - public > T[] sort(T[] array){ - int size = array.length; - - for (int i = 0; i < size; i++) { - T max = array[0]; - int index = 0; - for (int j = 0; j < size - i; j++) { - if ( less(max, array[j]) ) { - max = array[j]; - index = j; - } - } - flip(array, index, array.length - 1 - i); - } - return array; - } - - - public static void main(String[] args) { - - Integer[] arr = {10, 9, 8, 7, 6, 15, 14, 7, 4, 3, 8, 6, 3, 1 ,2, -2, -5, -8, -3, -1, 13, 12, 11, 5, 4, 3, 2, 1}; - PancakeSort pancakeSort = new PancakeSort(); - System.out.println("After sorting:"); - pancakeSort.sort(arr); - print(arr); - } - - - - - -} diff --git a/Sorts/src/sort/QuickSort.java b/Sorts/src/sort/QuickSort.java deleted file mode 100644 index 4159fc8..0000000 --- a/Sorts/src/sort/QuickSort.java +++ /dev/null @@ -1,97 +0,0 @@ -package sort; - -import static sort.SortUtils.*; - -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * - * @see SortAlgorithm - * - */ -class QuickSort implements SortAlgorithm { - - - - /** - * This method implements the Generic Quick Sort - * - * @param array The array to be sorted - * Sorts the array in increasing order - **/ - - @Override - public > T[] sort(T[] array) { - doSort(array, 0, array.length - 1); - return array; - } - - - /** - * The sorting process - * - * @param left The first index of an array - * @param right The last index of an array - * @param array The array to be sorted - * - **/ - - private static > void doSort(T[] array, int left, int right) { - if (left < right) { - int pivot = partition(array, left, right); - doSort(array, left, pivot - 1); - doSort(array, pivot , right); - } - } - - /** - * This method finds the partition index for an array - * - * @param array The array to be sorted - * @param left The first index of an array - * @param right The last index of an array - * Finds the partition index of an array - **/ - - private static > int partition(T[] array, int left, int right) { - int mid = (left + right) / 2; - T pivot = array[mid]; - - while(left <= right) { - while(less(array[left], pivot)){ - ++left; - } - while(less(pivot, array[right])) { - --right; - } - if(left <= right) { - swap(array, left, right); - ++left; - --right; - } - } - return left; - } - - // Driver Program - public static void main(String[] args) { - - // For integer input - Integer[] array = {3, 4, 1, 32, 0, 1, 5, 12 ,2, 5 ,7 ,8 ,9, 2, 44, 111, 5}; - - QuickSort quickSort = new QuickSort(); - // quickSort.sort(array); - - //Output => 0 1 1 2 2 3 4 5 5 5 7 8 9 12 32 44 111 - print(array); - - String[] stringArray = {"c", "a", "e", "b", "d"}; - quickSort.sort(stringArray); - - //Output => a b c d e - print(stringArray); - } -} - diff --git a/Sorts/src/sort/RadixSort.java b/Sorts/src/sort/RadixSort.java deleted file mode 100644 index 0d1e696..0000000 --- a/Sorts/src/sort/RadixSort.java +++ /dev/null @@ -1,65 +0,0 @@ -package sort; - -import java.util.Arrays; - -class RadixSort { - - - private static int getMax(int arr[], int n) { - int mx = arr[0]; - for (int i = 1; i < n; i++) - if (arr[i] > mx) - mx = arr[i]; - return mx; - } - - private static void countSort(int arr[], int n, int exp) - { - int output[] = new int[n]; - int i; - int count[] = new int[10]; - Arrays.fill(count,0); - - for (i = 0; i < n; i++) - count[ (arr[i]/exp)%10 ]++; - - for (i = 1; i < 10; i++) - count[i] += count[i - 1]; - - for (i = n - 1; i >= 0; i--) - { - output[count[ (arr[i]/exp)%10 ] - 1] = arr[i]; - count[ (arr[i]/exp)%10 ]--; - } - - for (i = 0; i < n; i++) - arr[i] = output[i]; - } - - private static void radixsort(int arr[], int n) { - - int m = getMax(arr, n); - - - for (int exp = 1; m/exp > 0; exp *= 10) - countSort(arr, n, exp); - } - - - static void print(int arr[], int n) - { - for (int i=0; i> T[] sort(T[] arr) { - int n = arr.length; - for (int i = 0; i < n - 1; i++) { - // Initial index of min - int min = i; - - for (int j = i +1 ; j < n; j++) { - if (less(arr[j], arr[min])) { - min = j; - } - } - - // Swapping if index of min is changed - if (min != i) { - swap(arr, i , min); - } - } - - return arr; - } - - // Driver Program - public static void main(String[] args) { - - Integer[] arr = {4, 23, 6, 78, 1, 54, 231, 9, 12}; - - SelectionSort selectionSort = new SelectionSort(); - - Integer[] sorted = selectionSort.sort(arr); - - // Output => 1 4 6 9 12 23 54 78 231 - print(sorted); - - // String Input - String[] strings = {"c", "a", "e", "b","d"}; - String[] sortedStrings = selectionSort.sort(strings); - - //Output => a b c d e - print(sortedStrings); - } -} diff --git a/Sorts/src/sort/ShellSort.java b/Sorts/src/sort/ShellSort.java deleted file mode 100644 index bafd19b..0000000 --- a/Sorts/src/sort/ShellSort.java +++ /dev/null @@ -1,50 +0,0 @@ -package sort; - -import static sort.SortUtils.*; - - -/** - * @author dpunosevac - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - * @see SortAlgorithm - * - */ -public class ShellSort implements SortAlgorithm { - - /** - * This method implements Generic Shell Sort. - * @param array The array to be sorted - */ - @Override - public > T[] sort(T[] array) { - int N = array.length; - int h = 1; - - while (h < N/3) { - h = 3 * h + 1; - } - - while (h >= 1) { - for (int i = h; i < N; i++) { - for (int j = i; j >= h && less(array[j], array[j-h]); j -= h) { - swap(array, j, j - h); - } - } - - h /= 3; - } - - return array; - } - - public static void main(String[] args) { - Integer[] toSort = {4, 23, 6, 78, 1, 54, 231, 9, 12}; - - ShellSort sort = new ShellSort(); - Integer[] sorted = sort.sort(toSort); - - print(sorted); - - } -} diff --git a/Sorts/src/sort/SortAlgorithm.java b/Sorts/src/sort/SortAlgorithm.java deleted file mode 100644 index 46b1f58..0000000 --- a/Sorts/src/sort/SortAlgorithm.java +++ /dev/null @@ -1,31 +0,0 @@ -package sort; - -import java.util.Arrays; -import java.util.List; - -/** - * The common interface of most sorting algorithms - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - **/ -public interface SortAlgorithm { - - /** - * Main method arrays sorting algorithms - * @param unsorted - an array should be sorted - * @return a sorted array - */ - > T[] sort(T[] unsorted); - - /** - * Auxiliary method for algorithms what wanted to work with lists from JCF - * @param unsorted - a list should be sorted - * @return a sorted list - */ - @SuppressWarnings("unchecked") - default > List sort(List unsorted){ - return Arrays.asList(sort(unsorted.toArray((T[]) new Comparable[unsorted.size()]))); - } - -} diff --git a/Sorts/src/sort/SortUtils.java b/Sorts/src/sort/SortUtils.java deleted file mode 100644 index 8766e9d..0000000 --- a/Sorts/src/sort/SortUtils.java +++ /dev/null @@ -1,75 +0,0 @@ -package sort; - -import java.util.Arrays; -import java.util.List; - -/** - * The class contains util methods - * - * @author Podshivalov Nikita (https://github.com/nikitap492) - * - **/ -final class SortUtils { - - - /** - * Helper method for swapping places in array - * @param array The array which elements we want to swap - * @param idx index of the first element - * @param idy index of the second element - */ - static boolean swap(T[] array, int idx, int idy){ - T swap = array[idx]; - array[idx] = array[idy]; - array[idy] = swap; - return true; - } - - - /** - * This method checks if first element is less then the other element - * @param v first element - * @param w second element - * @return true if the first element is less then the second element - */ - static > boolean less(T v, T w) { - return v.compareTo(w) < 0; - } - - - /** - * Just print list - * @param toPrint - a list which should be printed - */ - static void print(List toPrint){ - toPrint.stream() - .map(Object::toString) - .map(str -> str + " ") - .forEach(System.out::print); - - System.out.println(); - } - - - /** - * Prints an array - * @param toPrint - the array which should be printed - */ - static void print(Object[] toPrint){ - System.out.println(Arrays.toString(toPrint)); - } - - - - /** - * Swaps all position from {@param left} to @{@param right} for {@param array} - * @param array is an array - * @param left is a left flip border of the array - * @param right is a right flip border of the array - */ - static > void flip(T[] array, int left, int right) { - while (left <= right) { - swap(array, left++ , right--); - } - } -} diff --git a/ciphers/AES.java b/ciphers/AES.java deleted file mode 100644 index 75ae8db..0000000 --- a/ciphers/AES.java +++ /dev/null @@ -1,605 +0,0 @@ -package ciphers; - -import java.math.BigInteger; -import java.util.Scanner; - -/** - * This class is build to demonstrate the application of the AES-algorithm on a - * single 128-Bit block of data. - * - * @see khalil2535 - */ -public class AES { - - /** - * Precalculated values for x to the power of 2 in Rijndaels galois field. Used - * as 'RCON' during the key expansion. - */ - private static final int[] RCON = { 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, - 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, - 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, - 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, - 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, - 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, - 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, - 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, - 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, - 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, - 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, - 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, - 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, - 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, - 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d }; - - /** - * Rijndael S-box Substitution table used for encryption in the subBytes step, - * as well as the key expansion. - */ - private static final int[] SBOX = { 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, - 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, - 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, - 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, - 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, - 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, - 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, - 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, - 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, - 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, - 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, 0xBA, - 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70, 0x3E, 0xB5, - 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11, 0x69, - 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, - 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 }; - - /** - * Inverse Rijndael S-box Substitution table used for decryption in the - * subBytesDec step. - */ - private static final int[] INVERSE_SBOX = { 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, - 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, - 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, - 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, - 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, - 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, - 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, - 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, - 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, - 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, - 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, - 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60, 0x51, - 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D, - 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, - 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D }; - - /** - * Precalculated lookup table for galois field multiplication by 2 used in the - * MixColums step during encryption. - */ - private static final int[] MULT2 = { 0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x18, - 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, - 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x54, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, - 0x62, 0x64, 0x66, 0x68, 0x6a, 0x6c, 0x6e, 0x70, 0x72, 0x74, 0x76, 0x78, 0x7a, 0x7c, 0x7e, 0x80, 0x82, 0x84, - 0x86, 0x88, 0x8a, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa4, 0xa6, 0xa8, - 0xaa, 0xac, 0xae, 0xb0, 0xb2, 0xb4, 0xb6, 0xb8, 0xba, 0xbc, 0xbe, 0xc0, 0xc2, 0xc4, 0xc6, 0xc8, 0xca, 0xcc, - 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xee, 0xf0, - 0xf2, 0xf4, 0xf6, 0xf8, 0xfa, 0xfc, 0xfe, 0x1b, 0x19, 0x1f, 0x1d, 0x13, 0x11, 0x17, 0x15, 0x0b, 0x09, 0x0f, - 0x0d, 0x03, 0x01, 0x07, 0x05, 0x3b, 0x39, 0x3f, 0x3d, 0x33, 0x31, 0x37, 0x35, 0x2b, 0x29, 0x2f, 0x2d, 0x23, - 0x21, 0x27, 0x25, 0x5b, 0x59, 0x5f, 0x5d, 0x53, 0x51, 0x57, 0x55, 0x4b, 0x49, 0x4f, 0x4d, 0x43, 0x41, 0x47, - 0x45, 0x7b, 0x79, 0x7f, 0x7d, 0x73, 0x71, 0x77, 0x75, 0x6b, 0x69, 0x6f, 0x6d, 0x63, 0x61, 0x67, 0x65, 0x9b, - 0x99, 0x9f, 0x9d, 0x93, 0x91, 0x97, 0x95, 0x8b, 0x89, 0x8f, 0x8d, 0x83, 0x81, 0x87, 0x85, 0xbb, 0xb9, 0xbf, - 0xbd, 0xb3, 0xb1, 0xb7, 0xb5, 0xab, 0xa9, 0xaf, 0xad, 0xa3, 0xa1, 0xa7, 0xa5, 0xdb, 0xd9, 0xdf, 0xdd, 0xd3, - 0xd1, 0xd7, 0xd5, 0xcb, 0xc9, 0xcf, 0xcd, 0xc3, 0xc1, 0xc7, 0xc5, 0xfb, 0xf9, 0xff, 0xfd, 0xf3, 0xf1, 0xf7, - 0xf5, 0xeb, 0xe9, 0xef, 0xed, 0xe3, 0xe1, 0xe7, 0xe5 }; - - /** - * Precalculated lookup table for galois field multiplication by 3 used in the - * MixColums step during encryption. - */ - private static final int[] MULT3 = { 0x00, 0x03, 0x06, 0x05, 0x0c, 0x0f, 0x0a, 0x09, 0x18, 0x1b, 0x1e, 0x1d, 0x14, - 0x17, 0x12, 0x11, 0x30, 0x33, 0x36, 0x35, 0x3c, 0x3f, 0x3a, 0x39, 0x28, 0x2b, 0x2e, 0x2d, 0x24, 0x27, 0x22, - 0x21, 0x60, 0x63, 0x66, 0x65, 0x6c, 0x6f, 0x6a, 0x69, 0x78, 0x7b, 0x7e, 0x7d, 0x74, 0x77, 0x72, 0x71, 0x50, - 0x53, 0x56, 0x55, 0x5c, 0x5f, 0x5a, 0x59, 0x48, 0x4b, 0x4e, 0x4d, 0x44, 0x47, 0x42, 0x41, 0xc0, 0xc3, 0xc6, - 0xc5, 0xcc, 0xcf, 0xca, 0xc9, 0xd8, 0xdb, 0xde, 0xdd, 0xd4, 0xd7, 0xd2, 0xd1, 0xf0, 0xf3, 0xf6, 0xf5, 0xfc, - 0xff, 0xfa, 0xf9, 0xe8, 0xeb, 0xee, 0xed, 0xe4, 0xe7, 0xe2, 0xe1, 0xa0, 0xa3, 0xa6, 0xa5, 0xac, 0xaf, 0xaa, - 0xa9, 0xb8, 0xbb, 0xbe, 0xbd, 0xb4, 0xb7, 0xb2, 0xb1, 0x90, 0x93, 0x96, 0x95, 0x9c, 0x9f, 0x9a, 0x99, 0x88, - 0x8b, 0x8e, 0x8d, 0x84, 0x87, 0x82, 0x81, 0x9b, 0x98, 0x9d, 0x9e, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, - 0x86, 0x8f, 0x8c, 0x89, 0x8a, 0xab, 0xa8, 0xad, 0xae, 0xa7, 0xa4, 0xa1, 0xa2, 0xb3, 0xb0, 0xb5, 0xb6, 0xbf, - 0xbc, 0xb9, 0xba, 0xfb, 0xf8, 0xfd, 0xfe, 0xf7, 0xf4, 0xf1, 0xf2, 0xe3, 0xe0, 0xe5, 0xe6, 0xef, 0xec, 0xe9, - 0xea, 0xcb, 0xc8, 0xcd, 0xce, 0xc7, 0xc4, 0xc1, 0xc2, 0xd3, 0xd0, 0xd5, 0xd6, 0xdf, 0xdc, 0xd9, 0xda, 0x5b, - 0x58, 0x5d, 0x5e, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46, 0x4f, 0x4c, 0x49, 0x4a, 0x6b, 0x68, 0x6d, - 0x6e, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76, 0x7f, 0x7c, 0x79, 0x7a, 0x3b, 0x38, 0x3d, 0x3e, 0x37, - 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26, 0x2f, 0x2c, 0x29, 0x2a, 0x0b, 0x08, 0x0d, 0x0e, 0x07, 0x04, 0x01, - 0x02, 0x13, 0x10, 0x15, 0x16, 0x1f, 0x1c, 0x19, 0x1a }; - - /** - * Precalculated lookup table for galois field multiplication by 9 used in the - * MixColums step during decryption. - */ - private static final int[] MULT9 = { 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, - 0x65, 0x7e, 0x77, 0x90, 0x99, 0x82, 0x8b, 0xb4, 0xbd, 0xa6, 0xaf, 0xd8, 0xd1, 0xca, 0xc3, 0xfc, 0xf5, 0xee, - 0xe7, 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0xab, - 0xa2, 0xb9, 0xb0, 0x8f, 0x86, 0x9d, 0x94, 0xe3, 0xea, 0xf1, 0xf8, 0xc7, 0xce, 0xd5, 0xdc, 0x76, 0x7f, 0x64, - 0x6d, 0x52, 0x5b, 0x40, 0x49, 0x3e, 0x37, 0x2c, 0x25, 0x1a, 0x13, 0x08, 0x01, 0xe6, 0xef, 0xf4, 0xfd, 0xc2, - 0xcb, 0xd0, 0xd9, 0xae, 0xa7, 0xbc, 0xb5, 0x8a, 0x83, 0x98, 0x91, 0x4d, 0x44, 0x5f, 0x56, 0x69, 0x60, 0x7b, - 0x72, 0x05, 0x0c, 0x17, 0x1e, 0x21, 0x28, 0x33, 0x3a, 0xdd, 0xd4, 0xcf, 0xc6, 0xf9, 0xf0, 0xeb, 0xe2, 0x95, - 0x9c, 0x87, 0x8e, 0xb1, 0xb8, 0xa3, 0xaa, 0xec, 0xe5, 0xfe, 0xf7, 0xc8, 0xc1, 0xda, 0xd3, 0xa4, 0xad, 0xb6, - 0xbf, 0x80, 0x89, 0x92, 0x9b, 0x7c, 0x75, 0x6e, 0x67, 0x58, 0x51, 0x4a, 0x43, 0x34, 0x3d, 0x26, 0x2f, 0x10, - 0x19, 0x02, 0x0b, 0xd7, 0xde, 0xc5, 0xcc, 0xf3, 0xfa, 0xe1, 0xe8, 0x9f, 0x96, 0x8d, 0x84, 0xbb, 0xb2, 0xa9, - 0xa0, 0x47, 0x4e, 0x55, 0x5c, 0x63, 0x6a, 0x71, 0x78, 0x0f, 0x06, 0x1d, 0x14, 0x2b, 0x22, 0x39, 0x30, 0x9a, - 0x93, 0x88, 0x81, 0xbe, 0xb7, 0xac, 0xa5, 0xd2, 0xdb, 0xc0, 0xc9, 0xf6, 0xff, 0xe4, 0xed, 0x0a, 0x03, 0x18, - 0x11, 0x2e, 0x27, 0x3c, 0x35, 0x42, 0x4b, 0x50, 0x59, 0x66, 0x6f, 0x74, 0x7d, 0xa1, 0xa8, 0xb3, 0xba, 0x85, - 0x8c, 0x97, 0x9e, 0xe9, 0xe0, 0xfb, 0xf2, 0xcd, 0xc4, 0xdf, 0xd6, 0x31, 0x38, 0x23, 0x2a, 0x15, 0x1c, 0x07, - 0x0e, 0x79, 0x70, 0x6b, 0x62, 0x5d, 0x54, 0x4f, 0x46 }; - - /** - * Precalculated lookup table for galois field multiplication by 11 used in the - * MixColums step during decryption. - */ - private static final int[] MULT11 = { 0x00, 0x0b, 0x16, 0x1d, 0x2c, 0x27, 0x3a, 0x31, 0x58, 0x53, 0x4e, 0x45, 0x74, - 0x7f, 0x62, 0x69, 0xb0, 0xbb, 0xa6, 0xad, 0x9c, 0x97, 0x8a, 0x81, 0xe8, 0xe3, 0xfe, 0xf5, 0xc4, 0xcf, 0xd2, - 0xd9, 0x7b, 0x70, 0x6d, 0x66, 0x57, 0x5c, 0x41, 0x4a, 0x23, 0x28, 0x35, 0x3e, 0x0f, 0x04, 0x19, 0x12, 0xcb, - 0xc0, 0xdd, 0xd6, 0xe7, 0xec, 0xf1, 0xfa, 0x93, 0x98, 0x85, 0x8e, 0xbf, 0xb4, 0xa9, 0xa2, 0xf6, 0xfd, 0xe0, - 0xeb, 0xda, 0xd1, 0xcc, 0xc7, 0xae, 0xa5, 0xb8, 0xb3, 0x82, 0x89, 0x94, 0x9f, 0x46, 0x4d, 0x50, 0x5b, 0x6a, - 0x61, 0x7c, 0x77, 0x1e, 0x15, 0x08, 0x03, 0x32, 0x39, 0x24, 0x2f, 0x8d, 0x86, 0x9b, 0x90, 0xa1, 0xaa, 0xb7, - 0xbc, 0xd5, 0xde, 0xc3, 0xc8, 0xf9, 0xf2, 0xef, 0xe4, 0x3d, 0x36, 0x2b, 0x20, 0x11, 0x1a, 0x07, 0x0c, 0x65, - 0x6e, 0x73, 0x78, 0x49, 0x42, 0x5f, 0x54, 0xf7, 0xfc, 0xe1, 0xea, 0xdb, 0xd0, 0xcd, 0xc6, 0xaf, 0xa4, 0xb9, - 0xb2, 0x83, 0x88, 0x95, 0x9e, 0x47, 0x4c, 0x51, 0x5a, 0x6b, 0x60, 0x7d, 0x76, 0x1f, 0x14, 0x09, 0x02, 0x33, - 0x38, 0x25, 0x2e, 0x8c, 0x87, 0x9a, 0x91, 0xa0, 0xab, 0xb6, 0xbd, 0xd4, 0xdf, 0xc2, 0xc9, 0xf8, 0xf3, 0xee, - 0xe5, 0x3c, 0x37, 0x2a, 0x21, 0x10, 0x1b, 0x06, 0x0d, 0x64, 0x6f, 0x72, 0x79, 0x48, 0x43, 0x5e, 0x55, 0x01, - 0x0a, 0x17, 0x1c, 0x2d, 0x26, 0x3b, 0x30, 0x59, 0x52, 0x4f, 0x44, 0x75, 0x7e, 0x63, 0x68, 0xb1, 0xba, 0xa7, - 0xac, 0x9d, 0x96, 0x8b, 0x80, 0xe9, 0xe2, 0xff, 0xf4, 0xc5, 0xce, 0xd3, 0xd8, 0x7a, 0x71, 0x6c, 0x67, 0x56, - 0x5d, 0x40, 0x4b, 0x22, 0x29, 0x34, 0x3f, 0x0e, 0x05, 0x18, 0x13, 0xca, 0xc1, 0xdc, 0xd7, 0xe6, 0xed, 0xf0, - 0xfb, 0x92, 0x99, 0x84, 0x8f, 0xbe, 0xb5, 0xa8, 0xa3 }; - - /** - * Precalculated lookup table for galois field multiplication by 13 used in the - * MixColums step during decryption. - */ - private static final int[] MULT13 = { 0x00, 0x0d, 0x1a, 0x17, 0x34, 0x39, 0x2e, 0x23, 0x68, 0x65, 0x72, 0x7f, 0x5c, - 0x51, 0x46, 0x4b, 0xd0, 0xdd, 0xca, 0xc7, 0xe4, 0xe9, 0xfe, 0xf3, 0xb8, 0xb5, 0xa2, 0xaf, 0x8c, 0x81, 0x96, - 0x9b, 0xbb, 0xb6, 0xa1, 0xac, 0x8f, 0x82, 0x95, 0x98, 0xd3, 0xde, 0xc9, 0xc4, 0xe7, 0xea, 0xfd, 0xf0, 0x6b, - 0x66, 0x71, 0x7c, 0x5f, 0x52, 0x45, 0x48, 0x03, 0x0e, 0x19, 0x14, 0x37, 0x3a, 0x2d, 0x20, 0x6d, 0x60, 0x77, - 0x7a, 0x59, 0x54, 0x43, 0x4e, 0x05, 0x08, 0x1f, 0x12, 0x31, 0x3c, 0x2b, 0x26, 0xbd, 0xb0, 0xa7, 0xaa, 0x89, - 0x84, 0x93, 0x9e, 0xd5, 0xd8, 0xcf, 0xc2, 0xe1, 0xec, 0xfb, 0xf6, 0xd6, 0xdb, 0xcc, 0xc1, 0xe2, 0xef, 0xf8, - 0xf5, 0xbe, 0xb3, 0xa4, 0xa9, 0x8a, 0x87, 0x90, 0x9d, 0x06, 0x0b, 0x1c, 0x11, 0x32, 0x3f, 0x28, 0x25, 0x6e, - 0x63, 0x74, 0x79, 0x5a, 0x57, 0x40, 0x4d, 0xda, 0xd7, 0xc0, 0xcd, 0xee, 0xe3, 0xf4, 0xf9, 0xb2, 0xbf, 0xa8, - 0xa5, 0x86, 0x8b, 0x9c, 0x91, 0x0a, 0x07, 0x10, 0x1d, 0x3e, 0x33, 0x24, 0x29, 0x62, 0x6f, 0x78, 0x75, 0x56, - 0x5b, 0x4c, 0x41, 0x61, 0x6c, 0x7b, 0x76, 0x55, 0x58, 0x4f, 0x42, 0x09, 0x04, 0x13, 0x1e, 0x3d, 0x30, 0x27, - 0x2a, 0xb1, 0xbc, 0xab, 0xa6, 0x85, 0x88, 0x9f, 0x92, 0xd9, 0xd4, 0xc3, 0xce, 0xed, 0xe0, 0xf7, 0xfa, 0xb7, - 0xba, 0xad, 0xa0, 0x83, 0x8e, 0x99, 0x94, 0xdf, 0xd2, 0xc5, 0xc8, 0xeb, 0xe6, 0xf1, 0xfc, 0x67, 0x6a, 0x7d, - 0x70, 0x53, 0x5e, 0x49, 0x44, 0x0f, 0x02, 0x15, 0x18, 0x3b, 0x36, 0x21, 0x2c, 0x0c, 0x01, 0x16, 0x1b, 0x38, - 0x35, 0x22, 0x2f, 0x64, 0x69, 0x7e, 0x73, 0x50, 0x5d, 0x4a, 0x47, 0xdc, 0xd1, 0xc6, 0xcb, 0xe8, 0xe5, 0xf2, - 0xff, 0xb4, 0xb9, 0xae, 0xa3, 0x80, 0x8d, 0x9a, 0x97 }; - - /** - * Precalculated lookup table for galois field multiplication by 14 used in the - * MixColums step during decryption. - */ - private static final int[] MULT14 = { 0x00, 0x0e, 0x1c, 0x12, 0x38, 0x36, 0x24, 0x2a, 0x70, 0x7e, 0x6c, 0x62, 0x48, - 0x46, 0x54, 0x5a, 0xe0, 0xee, 0xfc, 0xf2, 0xd8, 0xd6, 0xc4, 0xca, 0x90, 0x9e, 0x8c, 0x82, 0xa8, 0xa6, 0xb4, - 0xba, 0xdb, 0xd5, 0xc7, 0xc9, 0xe3, 0xed, 0xff, 0xf1, 0xab, 0xa5, 0xb7, 0xb9, 0x93, 0x9d, 0x8f, 0x81, 0x3b, - 0x35, 0x27, 0x29, 0x03, 0x0d, 0x1f, 0x11, 0x4b, 0x45, 0x57, 0x59, 0x73, 0x7d, 0x6f, 0x61, 0xad, 0xa3, 0xb1, - 0xbf, 0x95, 0x9b, 0x89, 0x87, 0xdd, 0xd3, 0xc1, 0xcf, 0xe5, 0xeb, 0xf9, 0xf7, 0x4d, 0x43, 0x51, 0x5f, 0x75, - 0x7b, 0x69, 0x67, 0x3d, 0x33, 0x21, 0x2f, 0x05, 0x0b, 0x19, 0x17, 0x76, 0x78, 0x6a, 0x64, 0x4e, 0x40, 0x52, - 0x5c, 0x06, 0x08, 0x1a, 0x14, 0x3e, 0x30, 0x22, 0x2c, 0x96, 0x98, 0x8a, 0x84, 0xae, 0xa0, 0xb2, 0xbc, 0xe6, - 0xe8, 0xfa, 0xf4, 0xde, 0xd0, 0xc2, 0xcc, 0x41, 0x4f, 0x5d, 0x53, 0x79, 0x77, 0x65, 0x6b, 0x31, 0x3f, 0x2d, - 0x23, 0x09, 0x07, 0x15, 0x1b, 0xa1, 0xaf, 0xbd, 0xb3, 0x99, 0x97, 0x85, 0x8b, 0xd1, 0xdf, 0xcd, 0xc3, 0xe9, - 0xe7, 0xf5, 0xfb, 0x9a, 0x94, 0x86, 0x88, 0xa2, 0xac, 0xbe, 0xb0, 0xea, 0xe4, 0xf6, 0xf8, 0xd2, 0xdc, 0xce, - 0xc0, 0x7a, 0x74, 0x66, 0x68, 0x42, 0x4c, 0x5e, 0x50, 0x0a, 0x04, 0x16, 0x18, 0x32, 0x3c, 0x2e, 0x20, 0xec, - 0xe2, 0xf0, 0xfe, 0xd4, 0xda, 0xc8, 0xc6, 0x9c, 0x92, 0x80, 0x8e, 0xa4, 0xaa, 0xb8, 0xb6, 0x0c, 0x02, 0x10, - 0x1e, 0x34, 0x3a, 0x28, 0x26, 0x7c, 0x72, 0x60, 0x6e, 0x44, 0x4a, 0x58, 0x56, 0x37, 0x39, 0x2b, 0x25, 0x0f, - 0x01, 0x13, 0x1d, 0x47, 0x49, 0x5b, 0x55, 0x7f, 0x71, 0x63, 0x6d, 0xd7, 0xd9, 0xcb, 0xc5, 0xef, 0xe1, 0xf3, - 0xfd, 0xa7, 0xa9, 0xbb, 0xb5, 0x9f, 0x91, 0x83, 0x8d }; - - /** - * Subroutine of the Rijndael key expansion. - * - * @param t - * @param rconCounter - * @return - */ - public static BigInteger scheduleCore(BigInteger t, int rconCounter) { - String rBytes = t.toString(16); - - // Add zero padding - int rBytesLength = rBytes.length(); - while (rBytesLength < 8) { - rBytes = "0" + rBytes; - } - - // rotate the first 16 bits to the back - String rotatingBytes = rBytes.substring(0, 2); - String fixedBytes = rBytes.substring(2); - - rBytes = fixedBytes + rotatingBytes; - - // apply S-Box to all 8-Bit Substrings - for (int i = 0; i < 4; i++) { - String currentByteBits = rBytes.substring(i * 2, (i + 1) * 2); - - int currentByte = Integer.parseInt(currentByteBits, 16); - currentByte = SBOX[currentByte]; - - // add the current RCON value to the first byte - if (i == 0) { - currentByte = currentByte ^ RCON[rconCounter]; - } - - currentByteBits = Integer.toHexString(currentByte); - - // Add zero padding - int currentByteBitsLength = currentByteBits.length(); - while (currentByteBitsLength < 2) { - currentByteBits = '0' + currentByteBits; - } - - // replace bytes in original string - rBytes = rBytes.substring(0, i * 2) + currentByteBits + rBytes.substring((i + 1) * 2); - } - - // t = new BigInteger(rBytes, 16); - // return t; - return new BigInteger(rBytes, 16); - } - - /** - * - * Returns an array of 10 + 1 round keys that are calculated by using Rijndael - * key schedule - * - * @param initialKey - * @return array of 10 + 1 round keys - */ - public static BigInteger[] keyExpansion(BigInteger initialKey) { - BigInteger[] roundKeys = { initialKey, new BigInteger("0"), new BigInteger("0"), new BigInteger("0"), - new BigInteger("0"), new BigInteger("0"), new BigInteger("0"), new BigInteger("0"), new BigInteger("0"), - new BigInteger("0"), new BigInteger("0"), }; - - // initialize rcon iteration - int rconCounter = 1; - - for (int i = 1; i < 11; i++) { - - // get the previous 32 bits the key - BigInteger t = roundKeys[i - 1].remainder(new BigInteger("100000000", 16)); - - // split previous key into 8-bit segments - BigInteger[] prevKey = { roundKeys[i - 1].remainder(new BigInteger("100000000", 16)), - roundKeys[i - 1].remainder(new BigInteger("10000000000000000", 16)) - .divide(new BigInteger("100000000", 16)), - roundKeys[i - 1].remainder(new BigInteger("1000000000000000000000000", 16)) - .divide(new BigInteger("10000000000000000", 16)), - roundKeys[i - 1].divide(new BigInteger("1000000000000000000000000", 16)), }; - - // run schedule core - t = scheduleCore(t, rconCounter); - rconCounter += 1; - - // Calculate partial round key - BigInteger t0 = t.xor(prevKey[3]); - BigInteger t1 = t0.xor(prevKey[2]); - BigInteger t2 = t1.xor(prevKey[1]); - BigInteger t3 = t2.xor(prevKey[0]); - - // Join round key segments - t2 = t2.multiply(new BigInteger("100000000", 16)); - t1 = t1.multiply(new BigInteger("10000000000000000", 16)); - t0 = t0.multiply(new BigInteger("1000000000000000000000000", 16)); - roundKeys[i] = t0.add(t1).add(t2).add(t3); - - } - return roundKeys; - } - - /** - * representation of the input 128-bit block as an array of 8-bit integers. - * - * @param block - * of 128-bit integers - * @return array of 8-bit integers - */ - public static int[] splitBlockIntoCells(BigInteger block) { - - int[] cells = new int[16]; - String blockBits = block.toString(2); - - // Append leading 0 for full "128-bit" string - int blockBitsLength = blockBits.length(); - while (blockBitsLength < 128) { - blockBits = '0' + blockBits; - } - - // split 128 to 8 bit cells - for (int i = 0; i < cells.length; i++) { - String cellBits = blockBits.substring(8 * i, 8 * (i + 1)); - cells[i] = Integer.parseInt(cellBits, 2); - } - - return cells; - } - - /** - * Returns the 128-bit BigInteger representation of the input of an array of - * 8-bit integers. - * - * @param cells - * that we need to merge - * @return block of merged cells - */ - public static BigInteger mergeCellsIntoBlock(int[] cells) { - - String blockBits = ""; - for (int i = 0; i < 16; i++) { - String cellBits = Integer.toBinaryString(cells[i]); - - // Append leading 0 for full "8-bit" strings - int cellBitsLength = cellBits.length(); - while (cellBitsLength < 8) { - cellBits = '0' + cellBits; - } - - blockBits += cellBits; - } - - return new BigInteger(blockBits, 2); - } - - /** - * - * @param ciphertext - * @param key - * @return ciphertext XOR key - */ - public static BigInteger addRoundKey(BigInteger ciphertext, BigInteger key) { - return ciphertext.xor(key); - } - - /** - * substitutes 8-Bit long substrings of the input using the S-Box and returns - * the result. - * - * @param ciphertext - * @return subtraction Output - */ - public static BigInteger subBytes(BigInteger ciphertext) { - - int[] cells = splitBlockIntoCells(ciphertext); - - for (int i = 0; i < 16; i++) { - cells[i] = SBOX[cells[i]]; - } - - return mergeCellsIntoBlock(cells); - } - - /** - * substitutes 8-Bit long substrings of the input using the inverse S-Box for - * decryption and returns the result. - * - * @param ciphertext - * @return subtraction Output - */ - public static BigInteger subBytesDec(BigInteger ciphertext) { - - int[] cells = splitBlockIntoCells(ciphertext); - - for (int i = 0; i < 16; i++) { - cells[i] = INVERSE_SBOX[cells[i]]; - } - - return mergeCellsIntoBlock(cells); - } - - /** - * Cell permutation step. Shifts cells within the rows of the input and returns - * the result. - * - * @param ciphertext - */ - public static BigInteger shiftRows(BigInteger ciphertext) { - int[] cells = splitBlockIntoCells(ciphertext); - int[] output = new int[16]; - - // do nothing in the first row - output[0] = cells[0]; - output[4] = cells[4]; - output[8] = cells[8]; - output[12] = cells[12]; - - // shift the second row backwards by one cell - output[1] = cells[5]; - output[5] = cells[9]; - output[9] = cells[13]; - output[13] = cells[1]; - - // shift the third row backwards by two cell - output[2] = cells[10]; - output[6] = cells[14]; - output[10] = cells[2]; - output[14] = cells[6]; - - // shift the forth row backwards by tree cell - output[3] = cells[15]; - output[7] = cells[3]; - output[11] = cells[7]; - output[15] = cells[11]; - - return mergeCellsIntoBlock(output); - } - - /** - * Cell permutation step for decryption . Shifts cells within the rows of the - * input and returns the result. - * - * @param ciphertext - */ - public static BigInteger shiftRowsDec(BigInteger ciphertext) { - int[] cells = splitBlockIntoCells(ciphertext); - int[] output = new int[16]; - - // do nothing in the first row - output[0] = cells[0]; - output[4] = cells[4]; - output[8] = cells[8]; - output[12] = cells[12]; - - // shift the second row forwards by one cell - output[1] = cells[13]; - output[5] = cells[1]; - output[9] = cells[5]; - output[13] = cells[9]; - - // shift the third row forwards by two cell - output[2] = cells[10]; - output[6] = cells[14]; - output[10] = cells[2]; - output[14] = cells[6]; - - // shift the forth row forwards by tree cell - output[3] = cells[7]; - output[7] = cells[11]; - output[11] = cells[15]; - output[15] = cells[3]; - - return mergeCellsIntoBlock(output); - } - - /** - * Applies the Rijndael MixColumns to the input and returns the result. - * - * @param ciphertext - */ - public static BigInteger mixColumns(BigInteger ciphertext) { - - int[] cells = splitBlockIntoCells(ciphertext); - int[] outputCells = new int[16]; - - for (int i = 0; i < 4; i++) { - int[] row = { cells[i * 4], cells[i * 4 + 1], cells[i * 4 + 2], cells[i * 4 + 3] }; - - outputCells[i * 4] = MULT2[row[0]] ^ MULT3[row[1]] ^ row[2] ^ row[3]; - outputCells[i * 4 + 1] = row[0] ^ MULT2[row[1]] ^ MULT3[row[2]] ^ row[3]; - outputCells[i * 4 + 2] = row[0] ^ row[1] ^ MULT2[row[2]] ^ MULT3[row[3]]; - outputCells[i * 4 + 3] = MULT3[row[0]] ^ row[1] ^ row[2] ^ MULT2[row[3]]; - } - return mergeCellsIntoBlock(outputCells); - } - - /** - * Applies the inverse Rijndael MixColumns for decryption to the input and - * returns the result. - * - * @param ciphertext - */ - public static BigInteger mixColumnsDec(BigInteger ciphertext) { - - int[] cells = splitBlockIntoCells(ciphertext); - int[] outputCells = new int[16]; - - for (int i = 0; i < 4; i++) { - int[] row = { cells[i * 4], cells[i * 4 + 1], cells[i * 4 + 2], cells[i * 4 + 3] }; - - outputCells[i * 4] = MULT14[row[0]] ^ MULT11[row[1]] ^ MULT13[row[2]] ^ MULT9[row[3]]; - outputCells[i * 4 + 1] = MULT9[row[0]] ^ MULT14[row[1]] ^ MULT11[row[2]] ^ MULT13[row[3]]; - outputCells[i * 4 + 2] = MULT13[row[0]] ^ MULT9[row[1]] ^ MULT14[row[2]] ^ MULT11[row[3]]; - outputCells[i * 4 + 3] = MULT11[row[0]] ^ MULT13[row[1]] ^ MULT9[row[2]] ^ MULT14[row[3]]; - } - return mergeCellsIntoBlock(outputCells); - } - - /** - * Encrypts the plaintext with the key and returns the result - * - * @param plainText - * which we want to encrypt - * @param key - * the key for encrypt - * @return EncryptedText - */ - public static BigInteger encrypt(BigInteger plainText, BigInteger key) { - BigInteger[] roundKeys = keyExpansion(key); - - // Initial round - plainText = addRoundKey(plainText, roundKeys[0]); - - // Main rounds - for (int i = 1; i < 10; i++) { - plainText = subBytes(plainText); - plainText = shiftRows(plainText); - plainText = mixColumns(plainText); - plainText = addRoundKey(plainText, roundKeys[i]); - } - - // Final round - plainText = subBytes(plainText); - plainText = shiftRows(plainText); - plainText = addRoundKey(plainText, roundKeys[10]); - - return plainText; - } - - /** - * Decrypts the ciphertext with the key and returns the result - * - * @param cipherText - * The Encrypted text which we want to decrypt - * @param key - * @return decryptedText - */ - public static BigInteger decrypt(BigInteger cipherText, BigInteger key) { - - BigInteger[] roundKeys = keyExpansion(key); - - // Invert final round - cipherText = addRoundKey(cipherText, roundKeys[10]); - cipherText = shiftRowsDec(cipherText); - cipherText = subBytesDec(cipherText); - - // Invert main rounds - for (int i = 9; i > 0; i--) { - cipherText = addRoundKey(cipherText, roundKeys[i]); - cipherText = mixColumnsDec(cipherText); - cipherText = shiftRowsDec(cipherText); - cipherText = subBytesDec(cipherText); - } - - // Invert initial round - cipherText = addRoundKey(cipherText, roundKeys[0]); - - return cipherText; - } - - public static void main(String[] args) { - - try (Scanner input = new Scanner(System.in)) { - System.out.println("Enter (e) letter for encrpyt or (d) letter for decrypt :"); - char choice = input.nextLine().charAt(0); - String in; - switch (choice) { - case 'E': - case 'e': - System.out.println("Choose a plaintext block (128-Bit Integer in base 16):"); - in = input.nextLine(); - BigInteger plaintext = new BigInteger(in, 16); - System.out.println("Choose a Key (128-Bit Integer in base 16):"); - in = input.nextLine(); - BigInteger encryptionKey = new BigInteger(in, 16); - System.out.println("The encrypted message is: \n" + encrypt(plaintext, encryptionKey).toString(16)); - break; - case 'D': - case 'd': - System.out.println("Enter your ciphertext block (128-Bit Integer in base 16):"); - in = input.nextLine(); - BigInteger ciphertext = new BigInteger(in, 16); - System.out.println("Choose a Key (128-Bit Integer in base 16):"); - in = input.nextLine(); - BigInteger decryptionKey = new BigInteger(in, 16); - System.out.println("The deciphered message is:\n" + decrypt(ciphertext, decryptionKey).toString(16)); - break; - default: - System.out.println("** End **"); - } - } - - } -} diff --git a/ciphers/AESEncryption.java b/ciphers/AESEncryption.java deleted file mode 100644 index 871bd52..0000000 --- a/ciphers/AESEncryption.java +++ /dev/null @@ -1,114 +0,0 @@ -package ciphers; - -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.KeyGenerator; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.SecretKey; -import javax.xml.bind.DatatypeConverter; - -/** - * This example program shows how AES encryption and decryption can be done in - * Java. Please note that secret key and encrypted text is unreadable binary and - * hence in the following program we display it in hexadecimal format of the - * underlying bytes. - * - */ -public class AESEncryption { - - /** - * 1. Generate a plain text for encryption 2. Get a secret key (printed in - * hexadecimal form). In actual use this must by encrypted and kept safe. The - * same key is required for decryption. - * - */ - public static void main(String[] args) throws Exception { - String plainText = "Hello World"; - SecretKey secKey = getSecretEncryptionKey(); - byte[] cipherText = encryptText(plainText, secKey); - String decryptedText = decryptText(cipherText, secKey); - - System.out.println("Original Text:" + plainText); - System.out.println("AES Key (Hex Form):" + bytesToHex(secKey.getEncoded())); - System.out.println("Encrypted Text (Hex Form):" + bytesToHex(cipherText)); - System.out.println("Descrypted Text:" + decryptedText); - - } - - /** - * gets the AES encryption key. In your actual programs, this should be safely - * stored. - * - * @return secKey (Secret key that we encrypt using it) - * @throws NoSuchAlgorithmException - * (from KeyGenrator) - * - */ - public static SecretKey getSecretEncryptionKey() throws NoSuchAlgorithmException { - KeyGenerator aesKeyGenerator = KeyGenerator.getInstance("AES"); - aesKeyGenerator.init(128); // The AES key size in number of bits - SecretKey secKey = aesKeyGenerator.generateKey(); - return secKey; - } - - /** - * Encrypts plainText in AES using the secret key - * - * @param plainText - * @param secKey - * @return byteCipherText (The encrypted text) - * @throws NoSuchPaddingException - * (from Cipher) - * @throws NoSuchAlgorithmException - * (from Cipher) - * @throws InvalidKeyException - * (from Cipher) - * @throws BadPaddingException - * (from Cipher) - * @throws IllegalBlockSizeException - * (from Cipher) - */ - public static byte[] encryptText(String plainText, SecretKey secKey) throws NoSuchAlgorithmException, - NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { - // AES defaults to AES/ECB/PKCS5Padding in Java 7 - Cipher aesCipher = Cipher.getInstance("AES"); - aesCipher.init(Cipher.ENCRYPT_MODE, secKey); - byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes()); - return byteCipherText; - } - - /** - * Decrypts encrypted byte array using the key used for encryption. - * - * @param byteCipherText - * @param secKey - * @return plainText - * @throws NoSuchPaddingException - * @throws NoSuchAlgorithmException - * @throws InvalidKeyException - * @throws BadPaddingException - * @throws IllegalBlockSizeException - */ - public static String decryptText(byte[] byteCipherText, SecretKey secKey) throws NoSuchAlgorithmException, - NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { - // AES defaults to AES/ECB/PKCS5Padding in Java 7 - Cipher aesCipher = Cipher.getInstance("AES"); - aesCipher.init(Cipher.DECRYPT_MODE, secKey); - byte[] bytePlainText = aesCipher.doFinal(byteCipherText); - return new String(bytePlainText); - } - - /** - * Convert a binary byte array into readable hex form - * - * @param hash - * (in binary) - * @return hexHash - */ - private static String bytesToHex(byte[] hash) { - return DatatypeConverter.printHexBinary(hash); - } -} diff --git a/ciphers/Caesar.java b/ciphers/Caesar.java deleted file mode 100644 index 77cd5b9..0000000 --- a/ciphers/Caesar.java +++ /dev/null @@ -1,131 +0,0 @@ -package ciphers; - -import java.util.Scanner; - -/** - * - * A Java implementation of Caesar Cipher. /It is a type of substitution cipher - * in which each letter in the plaintext is replaced by a letter some fixed - * number of positions down the alphabet. / - * - * @author FAHRI YARDIMCI - * @author khalil2535 - */ -public class Caesar { - - /** - * Encrypt text by shifting every Latin char by add number shift for ASCII - * Example : A + 1 -> B - * - * @param message - * @param shift - * @return Encrypted message - */ - public static String encode(String message, int shift) { - String encoded = ""; - - while (shift >= 26) { // 26 = number of latin letters - shift -= 26; - } - - final int length = message.length(); - for (int i = 0; i < length; i++) { - -// int current = message.charAt(i); //using char to shift characters because ascii is in-order latin alphabet - char current = message.charAt(i); // Java law : char + int = char - - if (IsCapitalLatinLetter(current)) { - - current += shift; - encoded += (char) (current > 'Z' ? current - 26 : current); // 26 = number of latin letters - - } else if (IsSmallLatinLetter(current)) { - - current += shift; - encoded += (char) (current > 'z' ? current - 26 : current); // 26 = number of latin letters - - } else { - encoded += current; - } - } - return encoded; - } - - /** - * Decrypt message by shifting back every Latin char to previous the ASCII - * Example : B - 1 -> A - * - * @param encryptedMessage - * @param shift - * @return message - */ - public static String decode(String encryptedMessage, int shift) { - String decoded = ""; - - while (shift >= 26) { // 26 = number of latin letters - shift -= 26; - } - - final int length = encryptedMessage.length(); - for (int i = 0; i < length; i++) { - char current = encryptedMessage.charAt(i); - if (IsCapitalLatinLetter(current)) { - - current -= shift; - decoded += (char) (current < 'A' ? current + 26 : current);// 26 = number of latin letters - - } else if (IsSmallLatinLetter(current)) { - - current -= shift; - decoded += (char) (current < 'a' ? current + 26 : current);// 26 = number of latin letters - - } else { - decoded += current; - } - } - return decoded; - } - - /** - * - * @param c - * @return true if character is capital Latin letter or false for others - */ - private static boolean IsCapitalLatinLetter(char c) { - return c >= 'A' && c <= 'Z'; - } - - /** - * - * @param c - * @return true if character is small Latin letter or false for others - */ - private static boolean IsSmallLatinLetter(char c) { - return c >= 'a' && c <= 'z'; - } - - /** - * - * @deprecated TODO remove main and make JUnit Testing - */ - public static void main(String[] args) { - Scanner input = new Scanner(System.in); - System.out.println("Please enter the message (Latin Alphabet)"); - String message = input.nextLine(); - System.out.println(message); - System.out.println("Please enter the shift number"); - int shift = input.nextInt() % 26; - System.out.println("(E)ncode or (D)ecode ?"); - char choice = input.next().charAt(0); - switch (choice) { - case 'E': - case 'e': - System.out.println("ENCODED MESSAGE IS \n" + encode(message, shift)); //send our function to handle - break; - case 'D': - case 'd': - System.out.println("DECODED MESSAGE IS \n" + decode(message, shift)); - } - } - -} diff --git a/ciphers/ColumnarTranspositionCipher.java b/ciphers/ColumnarTranspositionCipher.java deleted file mode 100644 index 26acc62..0000000 --- a/ciphers/ColumnarTranspositionCipher.java +++ /dev/null @@ -1,224 +0,0 @@ -package ciphers; - -/** - * Columnar Transposition Cipher Encryption and Decryption. - * - * @author freitzzz - */ -public class ColumnarTranspositionCipher { - - private static String keyword; - private static Object[][] table; - private static String abecedarium; - public static final String ABECEDARIUM = "abcdefghijklmnopqrstuvwxyzABCDEFG" - + "HIJKLMNOPQRSTUVWXYZ0123456789,.;:-@"; - private static final String ENCRYPTION_FIELD = "≈"; - private static final char ENCRYPTION_FIELD_CHAR = '≈'; - - /** - * Encrypts a certain String with the Columnar Transposition Cipher Rule - * - * @param word Word being encrypted - * @param keyword String with keyword being used - * @return a String with the word encrypted by the Columnar Transposition - * Cipher Rule - */ - public static String encrpyter(String word, String keyword) { - ColumnarTranspositionCipher.keyword = keyword; - abecedariumBuilder(500); - table = tableBuilder(word); - Object[][] sortedTable = sortTable(table); - String wordEncrypted = ""; - for (int i = 0; i < sortedTable[i].length; i++) { - for (int j = 1; j < sortedTable.length; j++) { - wordEncrypted += sortedTable[j][i]; - } - } - return wordEncrypted; - } - - /** - * Encrypts a certain String with the Columnar Transposition Cipher Rule - * - * @param word Word being encrypted - * @param keyword String with keyword being used - * @param abecedarium String with the abecedarium being used. null for - * default one - * @return a String with the word encrypted by the Columnar Transposition - * Cipher Rule - */ - public static String encrpyter(String word, String keyword, - String abecedarium) { - ColumnarTranspositionCipher.keyword = keyword; - if (abecedarium != null) { - ColumnarTranspositionCipher.abecedarium = abecedarium; - } else { - ColumnarTranspositionCipher.abecedarium = ABECEDARIUM; - } - table = tableBuilder(word); - Object[][] sortedTable = sortTable(table); - String wordEncrypted = ""; - for (int i = 0; i < sortedTable[0].length; i++) { - for (int j = 1; j < sortedTable.length; j++) { - wordEncrypted += sortedTable[j][i]; - } - } - return wordEncrypted; - } - - /** - * Decrypts a certain encrypted String with the Columnar Transposition - * Cipher Rule - * - * @return a String decrypted with the word encrypted by the Columnar - * Transposition Cipher Rule - */ - public static String decrypter() { - String wordDecrypted = ""; - for (int i = 1; i < table.length; i++) { - for (Object item : table[i]) { - wordDecrypted += item; - } - } - return wordDecrypted.replaceAll(ENCRYPTION_FIELD, ""); - } - - /** - * Builds a table with the word to be encrypted in rows by the Columnar - * Transposition Cipher Rule - * - * @return An Object[][] with the word to be encrypted filled in rows and - * columns - */ - private static Object[][] tableBuilder(String word) { - Object[][] table = new Object[numberOfRows(word) + 1][keyword.length()]; - char[] wordInChards = word.toCharArray(); - //Fils in the respective numbers - table[0] = findElements(); - int charElement = 0; - for (int i = 1; i < table.length; i++) { - for (int j = 0; j < table[i].length; j++) { - if (charElement < wordInChards.length) { - table[i][j] = wordInChards[charElement]; - charElement++; - } else { - table[i][j] = ENCRYPTION_FIELD_CHAR; - } - } - } - return table; - } - - /** - * Determines the number of rows the table should have regarding the - * Columnar Transposition Cipher Rule - * - * @return an int with the number of rows that the table should have in - * order to respect the Columnar Transposition Cipher Rule. - */ - private static int numberOfRows(String word) { - if ((double) word.length() / keyword.length() > word.length() / keyword.length()) { - return (word.length() / keyword.length()) + 1; - } else { - return word.length() / keyword.length(); - } - } - - /** - * - * @return charValues - */ - private static Object[] findElements() { - Object[] charValues = new Object[keyword.length()]; - for (int i = 0; i < charValues.length; i++) { - int charValueIndex = abecedarium.indexOf(keyword.charAt(i)); - charValues[i] = charValueIndex > -1 ? charValueIndex : null; - } - return charValues; - } - - /** - * - * @param table - * @return tableSorted - */ - private static Object[][] sortTable(Object[][] table) { - Object[][] tableSorted = new Object[table.length][table[0].length]; - for (int i = 0; i < tableSorted.length; i++) { - System.arraycopy(table[i], 0, tableSorted[i], 0, tableSorted[i].length); - } - for (int i = 0; i < tableSorted[0].length; i++) { - for (int j = i + 1; j < tableSorted[0].length; j++) { - if ((int) tableSorted[0][i] > (int) table[0][j]) { - Object[] column = getColumn(tableSorted, tableSorted.length, i); - switchColumns(tableSorted, j, i, column); - } - } - } - return tableSorted; - } - - /** - * - * @param table - * @param rows - * @param column - * @return columnArray - */ - private static Object[] getColumn(Object[][] table, int rows, int column) { - Object[] columnArray = new Object[rows]; - for (int i = 0; i < rows; i++) { - columnArray[i] = table[i][column]; - } - return columnArray; - } - - /** - * - * @param table - * @param firstColumnIndex - * @param secondColumnIndex - * @param columnToSwitch - */ - private static void switchColumns(Object[][] table, int firstColumnIndex, - int secondColumnIndex, Object[] columnToSwitch) { - for (int i = 0; i < table.length; i++) { - table[i][secondColumnIndex] = table[i][firstColumnIndex]; - table[i][firstColumnIndex] = columnToSwitch[i]; - } - } - - /** - * Creates an abecedarium with a specified ascii inded - * - * @param value Number of characters being used based on the ASCII Table - */ - private static void abecedariumBuilder(int value) { - abecedarium = ""; - for (int i = 0; i < value; i++) { - abecedarium += (char) i; - } - } - - private static void showTable() { - for (Object[] table1 : table) { - for (Object item : table1) { - System.out.print(item + " "); - } - System.out.println(); - } - } - - public static void main(String[] args) { - String keywordForExample = "asd215"; - String wordBeingEncrypted = "This is a test of the Columnar Transposition Cipher"; - System.out.println("### Example of Columnar Transposition Cipher ###\n"); - System.out.println("Word being encryped ->>> " + wordBeingEncrypted); - System.out.println("Word encrypted ->>> " + ColumnarTranspositionCipher - .encrpyter(wordBeingEncrypted, keywordForExample)); - System.out.println("Word decryped ->>> " + ColumnarTranspositionCipher - .decrypter()); - System.out.println("\n### Encrypted Table ###"); - showTable(); - } -} diff --git a/ciphers/RSA.java b/ciphers/RSA.java deleted file mode 100644 index acb99f0..0000000 --- a/ciphers/RSA.java +++ /dev/null @@ -1,98 +0,0 @@ -package ciphers; - -import java.math.BigInteger; -import java.security.SecureRandom; -import javax.swing.JOptionPane; - -/** - * @author Nguyen Duy Tiep on 23-Oct-17. - */ -public final class RSA { - - /** - * Trivial test program. - * - * @param args - * @deprecated TODO remove main and make JUnit Testing or any other - * methodology - */ - public static void main(String[] args) { - - RSA rsa = new RSA(1024); - String text1 = JOptionPane.showInputDialog("Enter a message to encrypt :"); - - String ciphertext = rsa.encrypt(text1); - JOptionPane.showMessageDialog(null, "Your encrypted message : " + ciphertext); - - JOptionPane.showMessageDialog(null, "Your message after decrypt : " + rsa.decrypt(ciphertext)); - } - - private BigInteger modulus, privateKey, publicKey; - - /** - * - * @param bits - */ - public RSA(int bits) { - generateKeys(bits); - } - - /** - * - * @param message - * @return encrypted message - */ - public synchronized String encrypt(String message) { - return (new BigInteger(message.getBytes())).modPow(publicKey, modulus).toString(); - } - - /** - * - * @param message - * @return encrypted message as big integer - */ - public synchronized BigInteger encrypt(BigInteger message) { - return message.modPow(publicKey, modulus); - } - - /** - * - * @param encryptedMessage - * @return plain message - */ - public synchronized String decrypt(String encryptedMessage) { - return new String((new BigInteger(encryptedMessage)).modPow(privateKey, modulus).toByteArray()); - } - - /** - * - * @param encryptedMessage - * @return plain message as big integer - */ - public synchronized BigInteger decrypt(BigInteger encryptedMessage) { - return encryptedMessage.modPow(privateKey, modulus); - } - - /** - * Generate a new public and private key set. - * - * @param bits - */ - public synchronized void generateKeys(int bits) { - SecureRandom r = new SecureRandom(); - BigInteger p = new BigInteger(bits / 2, 100, r); - BigInteger q = new BigInteger(bits / 2, 100, r); - modulus = p.multiply(q); - - BigInteger m = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE)); - - publicKey = new BigInteger("3"); - - while (m.gcd(publicKey).intValue() > 1) { - publicKey = publicKey.add(new BigInteger("2")); - } - - privateKey = publicKey.modInverse(m); - } - -} diff --git a/ciphers/Vigenere.java b/ciphers/Vigenere.java deleted file mode 100644 index 48c5428..0000000 --- a/ciphers/Vigenere.java +++ /dev/null @@ -1,67 +0,0 @@ -package ciphers; - -/** - * A Java implementation of Vigenere Cipher. - * @author straiffix - */ - - -public class Vigenere { - - public static String encrypt(final String message, final String key) - { - - String result = ""; - - for (int i = 0, j = 0; i < message.length(); i++) { - char c = message.charAt(i); - if (Character.isLetter(c)){ - if(Character.isUpperCase(c)) { - result += (char) ((c + key.toUpperCase().charAt(j) - 2 * 'A') % 26 + 'A'); - - } else { - result += (char) ((c + key.toLowerCase().charAt(j) - 2 * 'a') % 26 + 'a'); - - } - } else { - result+=c; - } - j = ++j % key.length(); - } - return result; - } - - public static String decrypt( final String message, final String key) - { - String result =""; - - for(int i = 0, j = 0; i < message.length(); i++){ - - char c = message.charAt(i); - if (Character.isLetter(c)){ - if(Character.isUpperCase(c)) { - result += ((char)('Z'-(25-(c-key.toUpperCase().charAt(j)))%26)); - - } else { - result += ((char)('z'-(25-(c-key.toLowerCase().charAt(j)))%26)); - - } - } else { - result+=c; - } - - j = ++j % key.length(); - - } - return result; - } - public static void main (String [] args){ - String text="Hello World!"; - String key="itsakey"; - System.out.println(text); - String ciphertext=encrypt(text, key); - System.out.println(ciphertext); - System.out.println(decrypt(ciphertext, key)); - - } -} diff --git a/myfile.txt b/myfile.txt deleted file mode 100644 index d1b1c0a..0000000 --- a/myfile.txt +++ /dev/null @@ -1 +0,0 @@ -~ \ No newline at end of file diff --git a/Conversions/DecimalToAnyBase.java b/src/main/com/java/conversions/DecimalToAnyBase.java similarity index 50% rename from Conversions/DecimalToAnyBase.java rename to src/main/com/java/conversions/DecimalToAnyBase.java index d3927ff..7bf9eaf 100644 --- a/Conversions/DecimalToAnyBase.java +++ b/src/main/com/java/conversions/DecimalToAnyBase.java @@ -1,38 +1,16 @@ -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.ArrayList; +package main.com.java.conversions; -/** - * - * @author Varun Upadhyay (https://github.com/varunu28) - * - */ +import java.util.ArrayList; -// Driver Program public class DecimalToAnyBase { - public static void main (String[] args) throws Exception{ - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - System.out.println("Enter the decimal input below: "); - int decInput = Integer.parseInt(br.readLine()); - System.out.println(); - - System.out.println("Enter the base below: "); - int base = Integer.parseInt(br.readLine()); - System.out.println(); - - System.out.println("Decimal Input" + " is: " + decInput); - System.out.println("Value of " + decInput + " in base " + base + " is: " + convertToAnyBase(decInput, base)); - - br.close(); - } - /** * This method produces a String value of any given input decimal in any base * @param inp Decimal of which we need the value in base in String format + * @param base base in which we want the decimal value to be converted into * @return string format of the converted value in the given base */ - public static String convertToAnyBase(int inp, int base) { + public String convertToAnyBase(int inp, int base) { ArrayList charArr = new ArrayList<>(); while (inp > 0) { @@ -41,9 +19,7 @@ public static String convertToAnyBase(int inp, int base) { } StringBuilder str = new StringBuilder(charArr.size()); - - for(Character ch: charArr) - { + for(Character ch: charArr) { str.append(ch); } @@ -56,7 +32,7 @@ public static String convertToAnyBase(int inp, int base) { * @return character value of input integer */ - public static char reVal(int num) { + private char reVal(int num) { if (num >= 0 && num <= 9) return (char)(num + '0'); else diff --git a/src/test/com/java/conversions/DecimalToAnyBaseTest.java b/src/test/com/java/conversions/DecimalToAnyBaseTest.java new file mode 100644 index 0000000..da1d0fe --- /dev/null +++ b/src/test/com/java/conversions/DecimalToAnyBaseTest.java @@ -0,0 +1,16 @@ +package test.com.java.conversions; + +import main.com.java.conversions.DecimalToAnyBase; +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +public class DecimalToAnyBaseTest { + + @Test + public void testDecimalToAnyBase() { + DecimalToAnyBase decimalToAnyBase = new DecimalToAnyBase(); + assertEquals("Incorrect Conversion", "100", decimalToAnyBase.convertToAnyBase(4, 2)); + assertEquals("Incorrect Conversion", "11", decimalToAnyBase.convertToAnyBase(4, 3)); + } +} From 90a38205a1fd9d32d29a971b7cc73701b7faee1b Mon Sep 17 00:00:00 2001 From: Varun Upadhyay Date: Fri, 24 Aug 2018 10:08:32 -0700 Subject: [PATCH 002/120] Delete .classpath --- .classpath | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .classpath diff --git a/.classpath b/.classpath deleted file mode 100644 index 67d5f6d..0000000 --- a/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - From da58e6bd0f565fd31078da15ea4a17c1a8044d61 Mon Sep 17 00:00:00 2001 From: Varun Upadhyay Date: Fri, 24 Aug 2018 10:08:43 -0700 Subject: [PATCH 003/120] Delete .project --- .project | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .project diff --git a/.project b/.project deleted file mode 100644 index ea54703..0000000 --- a/.project +++ /dev/null @@ -1,17 +0,0 @@ - - - Java - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - From 39fb7902cf6d5fbc7cdb1d045af7be1c7ffcd4d6 Mon Sep 17 00:00:00 2001 From: Varun Upadhyay Date: Fri, 24 Aug 2018 10:30:28 -0700 Subject: [PATCH 004/120] Update README.md --- README.md | 214 +++++------------------------------------------------- 1 file changed, 20 insertions(+), 194 deletions(-) diff --git a/README.md b/README.md index 2bf7432..718d92d 100644 --- a/README.md +++ b/README.md @@ -1,194 +1,20 @@ -# The Algorithms - Java - -### All algorithms implemented in Java (for education) - -These are for demonstration purposes only. There are many implementations of sorts in the Java standard library that are much better for performance reasons. - -## Sort Algorithms - - -### Bubble -![alt text][bubble-image] - -From [Wikipedia][bubble-wiki]: Bubble sort, sometimes referred to as sinking sort, is a simple sorting algorithm that repeatedly steps through the list to be sorted, compares each pair of adjacent items and swaps them if they are in the wrong order. The pass through the list is repeated until no swaps are needed, which indicates that the list is sorted. - -__Properties__ -* Worst case performance O(n^2) -* Best case performance O(n) -* Average case performance O(n^2) - -###### View the algorithm in [action][bubble-toptal] - - - -### Insertion -![alt text][insertion-image] - -From [Wikipedia][insertion-wiki]: Insertion sort is a simple sorting algorithm that builds the final sorted array (or list) one item at a time. It is much less efficient on large lists than more advanced algorithms such as quicksort, heapsort, or merge sort. -In the figure, each bar represents an element of an array that needs to be sorted. What happens at the first intersection of the top most and second top most bars is to swap these elements, represented by bars, because the second element has a higher precedence than the first element does. By repeating this method, insertion sort completes sorting. - -__Properties__ -* Worst case performance O(n^2) -* Best case performance O(n) -* Average case performance O(n^2) - -###### View the algorithm in [action][insertion-toptal] - - -### Merge -![alt text][merge-image] - -From [Wikipedia][merge-wiki]: In computer science, merge sort (also commonly spelt mergesort) is an efficient, general-purpose, comparison-based sorting algorithm. Most implementations produce a stable sort, which means that the implementation preserves the input order of equal elements in the sorted output. Mergesort is a divide and conquer algorithm that was invented by John von Neumann in 1945. - -__Properties__ -* Worst case performance O(n log n) (typical) -* Best case performance O(n log n) -* Average case performance O(n log n) - - -###### View the algorithm in [action][merge-toptal] - -### Quick -![alt text][quick-image] - -From [Wikipedia][quick-wiki]: Quicksort (sometimes called partition-exchange sort) is an efficient sorting algorithm, serving as a systematic method for placing the elements of an array in order. - -__Properties__ -* Worst case performance O(n^2) -* Best case performance O(n log n) or O(n) with three-way partition -* Average case performance O(n^2) - -###### View the algorithm in [action][quick-toptal] - -### Selection -![alt text][selection-image] - -From [Wikipedia][selection-wiki]: The algorithm divides the input list into two parts: the sublist of items already sorted, which is built up from left to right at the front (left) of the list, and the sublist of items remaining to be sorted that occupy the rest of the list. Initially, the sorted sublist is empty and the unsorted sublist is the entire input list. The algorithm proceeds by finding the smallest (or largest, depending on sorting order) element in the unsorted sublist, exchanging (swapping) it with the leftmost unsorted element (putting it in sorted order), and moving the sublist boundaries one element to the right. - -__Properties__ -* Worst case performance O(n^2) -* Best case performance O(n^2) -* Average case performance O(n^2) - -###### View the algorithm in [action][selection-toptal] - -### Shell -![alt text][shell-image] - -From [Wikipedia][shell-wiki]: Shellsort is a generalization of insertion sort that allows the exchange of items that are far apart. The idea is to arrange the list of elements so that, starting anywhere, considering every nth element gives a sorted list. Such a list is said to be h-sorted. Equivalently, it can be thought of as h interleaved lists, each individually sorted. - -__Properties__ -* Worst case performance O(nlog2 2n) -* Best case performance O(n log n) -* Average case performance depends on gap sequence - -###### View the algorithm in [action][shell-toptal] - -### Time-Compexity Graphs - -Comparing the complexity of sorting algorithms (Bubble Sort, Insertion Sort, Selection Sort) - -[Complexity Graphs](https://github.com/prateekiiest/Python/blob/master/sorts/sortinggraphs.png) - ----------------------------------------------------------------------------------- - -## Search Algorithms - -### Linear -![alt text][linear-image] - -From [Wikipedia][linear-wiki]: linear search or sequential search is a method for finding a target value within a list. It sequentially checks each element of the list for the target value until a match is found or until all the elements have been searched. - The linear search runs in at the worst linear time and makes at most n comparisons, where n is the length of the list. - -__Properties__ -* Worst case performance O(n) -* Best case performance O(1) -* Average case performance O(n) -* Worst case space complexity O(1) iterative - -### Binary -![alt text][binary-image] - -From [Wikipedia][binary-wiki]: Binary search, also known as half-interval search or logarithmic search, is a search algorithm that finds the position of a target value within a sorted array. It compares the target value to the middle element of the array; if they are unequal, the half in which the target cannot lie is eliminated and the search continues on the remaining half until it is successful. - -__Properties__ -* Worst case performance O(log n) -* Best case performance O(1) -* Average case performance O(log n) -* Worst case space complexity O(1) - -From [Wikipedia][shell-wiki]: Shellsort is a generalization of insertion sort that allows the exchange of items that are far apart. The idea is to arrange the list of elements so that, starting anywhere, considering every nth element gives a sorted list. Such a list is said to be h-sorted. Equivalently, it can be thought of as h interleaved lists, each individually sorted. - -__Properties__ -* Worst case performance O(nlog2 2n) -* Best case performance O(n log n) -* Average case performance depends on gap sequence - -###### View the algorithm in [action][shell-toptal] - -[bubble-toptal]: https://www.toptal.com/developers/sorting-algorithms/bubble-sort -[bubble-wiki]: https://en.wikipedia.org/wiki/Bubble_sort -[bubble-image]: https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Bubblesort-edited-color.svg/220px-Bubblesort-edited-color.svg.png "Bubble Sort" - -[insertion-toptal]: https://www.toptal.com/developers/sorting-algorithms/insertion-sort -[insertion-wiki]: https://en.wikipedia.org/wiki/Insertion_sort -[insertion-image]: https://upload.wikimedia.org/wikipedia/commons/7/7e/Insertionsort-edited.png "Insertion Sort" - -[quick-toptal]: https://www.toptal.com/developers/sorting-algorithms/quick-sort -[quick-wiki]: https://en.wikipedia.org/wiki/Quicksort -[quick-image]: https://upload.wikimedia.org/wikipedia/commons/6/6a/Sorting_quicksort_anim.gif "Quick Sort" - -[merge-toptal]: https://www.toptal.com/developers/sorting-algorithms/merge-sort -[merge-wiki]: https://en.wikipedia.org/wiki/Merge_sort -[merge-image]: https://upload.wikimedia.org/wikipedia/commons/c/cc/Merge-sort-example-300px.gif "Merge Sort" - -[selection-toptal]: https://www.toptal.com/developers/sorting-algorithms/selection-sort -[selection-wiki]: https://en.wikipedia.org/wiki/Selection_sort -[selection-image]: https://upload.wikimedia.org/wikipedia/commons/thumb/b/b0/Selection_sort_animation.gif/250px-Selection_sort_animation.gif "Selection Sort Sort" - -[shell-toptal]: https://www.toptal.com/developers/sorting-algorithms/shell-sort -[shell-wiki]: https://en.wikipedia.org/wiki/Shellsort -[shell-image]: https://upload.wikimedia.org/wikipedia/commons/d/d8/Sorting_shellsort_anim.gif "Shell Sort" - -[linear-wiki]: https://en.wikipedia.org/wiki/Linear_search -[linear-image]: http://www.tutorialspoint.com/data_structures_algorithms/images/linear_search.gif - -[binary-wiki]: https://en.wikipedia.org/wiki/Binary_search_algorithm -[binary-image]: https://upload.wikimedia.org/wikipedia/commons/f/f7/Binary_search_into_array.png - - --------------------------------------------------------------------- -## Links to the rest of the algorithms - -Conversions | Dynamic Programming |Ciphers|Miscellaneous| ------------ |----------------------------------------------------------------|-------|-------------| -[Any Base to Any Base](Conversions/AnyBaseToAnyBase.java)| [Coin Change](Dynamic%20Programming/CoinChange.java)|[Caesar](ciphers/Caesar.java)|[Heap Sort](misc/heap_sort.java)| -[Any Base to Decimal](Conversions/AnyBaseToDecimal.java)|[Egg Dropping](Dynamic%20Programming/EggDropping.java)|[Columnar Transposition Cipher](ciphers/ColumnarTranspositionCipher.java)|[Palindromic Prime Checker](misc/PalindromicPrime.java)| -[Binary to Decimal](Conversions/BinaryToDecimal.java)|[Fibonacci](Dynamic%20Programming/Fibonacci.java)|[RSA](ciphers/RSA.java)|More soon...| -[Binary to HexaDecimal](Conversions/BinaryToHexadecimal.java)|[Kadane Algorithm](Dynamic%20Programming/KadaneAlgorithm.java)|more coming soon...| -[Binary to Octal](Conversions/BinaryToOctal.java)|[Knapsack](Dynamic%20Programming/Knapsack.java)| -[Decimal To Any Base](Conversions/DecimalToAnyBase.java)|[Longest Common Subsequence](Dynamic%20Programming/LongestCommonSubsequence.java)| -[Decimal To Binary](Conversions/DecimalToBinary.java)|[Longest Increasing Subsequence](Dynamic%20Programming/LongestIncreasingSubsequence.java)| -[Decimal To Hexadecimal](Conversions/DecimalToHexaDecimal.java)|[Rod Cutting](Dynamic%20Programming/RodCutting.java)| -and much more...| and more...| - -### Data Structures -Graphs|Heaps|Lists|Queues| -------|-----|-----|------| -[BFS](Data%20Structures/Graphs/BFS.java)|[Empty Heap Exception](Data%20Structures/Heaps/EmptyHeapException.java)|[Circle Linked List](Data%20Structures/Lists/CircleLinkedList.java)|[Generic Array List Queue](Data%20Structures/Queues/GenericArrayListQueue.java)| -[DFS](Data%20Structures/Graphs/DFS.java)|[Heap](Data%20Structures/Heaps/Heap.java)|[Doubly Linked List](Data%20Structures/Lists/DoublyLinkedList.java)|[Queues](Data%20Structures/Queues/Queues.java)| -[Graphs](Data%20Structures/Graphs/Graphs.java)|[Heap Element](Data%20Structures/Heaps/HeapElement.java)|[Singly Linked List](Data%20Structures/Lists/SinglyLinkedList.java)| -[Kruskals Algorithm](Data%20Structures/Graphs/KruskalsAlgorithm.java)|[Max Heap](Data%Structures/Heaps/MaxHeap.java)| -[Matrix Graphs](Data%20Structures/Graphs/MatrixGraphs.java)|[Min Heap](Data%20Structures/Heaps/MinHeap.java)| -[PrimMST](Data%20Structures/Graphs/PrimMST.java)| - -Stacks|Trees| -------|-----| -[Node Stack](Data%20Structures/Stacks/NodeStack.java)|[AVL Tree](Data%20Structures/Trees/AVLTree.java)| -[Stack of Linked List](Data%20Structures/Stacks/StackOfLinkedList.java)|[Binary Tree](Data%20Structures/Trees/BinaryTree.java)| -[Stacks](Data%20Structures/Stacks/Stacks.java)|And much more...| - -* [Bags](Data%20Structures/Bags/Bag.java) -* [Buffer](Data%20Structures/Buffers/CircularBuffer.java) -* [HashMap](Data%20Structures/HashMap/HashMap.java) -* [Matrix](Data%20Structures/Matrix/Matrix.java) +# The Algorithms - Java (WORK IN PROGRESS) + +## Goal +Make it a working Java project with full fledged test cases for each algorithm and correct package structures. Once we have enough test coverage, we would merge it with master + +## Contribution Guidelines + - If you add an algorithm then you have to add a test along with it. In absence of a test the PR would not be approved + - Follow the correct coding guidelines. Refer [DecimalToAnyBase.java](https://github.com/TheAlgorithms/Java/blob/Development/src/main/com/java/conversions/DecimalToAnyBase.java) for algorithm and [DecimalToAnyBaseTest.java](https://github.com/TheAlgorithms/Java/blob/Development/src/test/com/java/conversions/DecimalToAnyBaseTest.java) for the test coding standards. + - Please do not add a signature inside the code. The commit history is sufficient enough to determine who has added the code to the repo. + - Make sure the algorithm which is getting added comes under a certain domain of Algorithms. Please don't create a package with name such as Misc, Others etc. + - While making a PR make sure you are commiting the Java files only and not any project specific files. If you feel that your IDE is generating some extra files then either don't add them to git or add the extensions to ```.gitignore``` + - Please don't add solutions to problems from online judge such as Hackerrank, Leetcode etc + +## Steps to raise a PR +- Fork to [Java Repo](https://github.com/TheAlgorithms/Java) +- Open the forked repo on your local machine +- Switch to ```Development``` branch by using the command ```git checkout Development``` +- Make the changes on your local machine +- Push the changes to the forked repository +- Raise a PR against the Development branch From ee0940d654b2acb27c825104ac9b1889d99a1850 Mon Sep 17 00:00:00 2001 From: Varun Upadhyay Date: Fri, 24 Aug 2018 10:34:20 -0700 Subject: [PATCH 005/120] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 718d92d..bfa9215 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ Make it a working Java project with full fledged test cases for each algorithm a ## Contribution Guidelines - If you add an algorithm then you have to add a test along with it. In absence of a test the PR would not be approved - - Follow the correct coding guidelines. Refer [DecimalToAnyBase.java](https://github.com/TheAlgorithms/Java/blob/Development/src/main/com/java/conversions/DecimalToAnyBase.java) for algorithm and [DecimalToAnyBaseTest.java](https://github.com/TheAlgorithms/Java/blob/Development/src/test/com/java/conversions/DecimalToAnyBaseTest.java) for the test coding standards. + - Follow the correct coding guidelines with proper description for the methods. Refer [DecimalToAnyBase.java](https://github.com/TheAlgorithms/Java/blob/Development/src/main/com/java/conversions/DecimalToAnyBase.java) for algorithm and [DecimalToAnyBaseTest.java](https://github.com/TheAlgorithms/Java/blob/Development/src/test/com/java/conversions/DecimalToAnyBaseTest.java) for the test coding standards. + - Do not add a main method as we just need the actual algorithm in a method for the class which we are going to test in the test cases - Please do not add a signature inside the code. The commit history is sufficient enough to determine who has added the code to the repo. - Make sure the algorithm which is getting added comes under a certain domain of Algorithms. Please don't create a package with name such as Misc, Others etc. - While making a PR make sure you are commiting the Java files only and not any project specific files. If you feel that your IDE is generating some extra files then either don't add them to git or add the extensions to ```.gitignore``` From db9e4bbbe771821650eed3ccd7a2c3def68e08c9 Mon Sep 17 00:00:00 2001 From: Varun Upadhyay Date: Fri, 24 Aug 2018 23:02:01 -0700 Subject: [PATCH 006/120] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bfa9215..48f442a 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ Make it a working Java project with full fledged test cases for each algorithm a - Fork to [Java Repo](https://github.com/TheAlgorithms/Java) - Open the forked repo on your local machine - Switch to ```Development``` branch by using the command ```git checkout Development``` +- Add the JAR for JUnit to your build path. Here is a link for the [JUnit JAR](http://www.java2s.com/Code/Jar/j/Downloadjunit410jar.htm) - Make the changes on your local machine - Push the changes to the forked repository - Raise a PR against the Development branch From bcf4b617bb77d2801a1a6217df47832fa12754af Mon Sep 17 00:00:00 2001 From: lq Date: Sat, 25 Aug 2018 14:21:01 +0800 Subject: [PATCH 007/120] add a Test --- .../java/conversions/AnyBaseToDecimal.java | 39 +++++++++++++++++++ .../conversions/AnyBaseToDecimalTest.java | 39 +++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 src/main/com/java/conversions/AnyBaseToDecimal.java create mode 100644 src/test/com/java/conversions/AnyBaseToDecimalTest.java diff --git a/src/main/com/java/conversions/AnyBaseToDecimal.java b/src/main/com/java/conversions/AnyBaseToDecimal.java new file mode 100644 index 0000000..dc78bf8 --- /dev/null +++ b/src/main/com/java/conversions/AnyBaseToDecimal.java @@ -0,0 +1,39 @@ +package src.main.com.java.conversions; + +public class AnyBaseToDecimal { + /** + * This method produces a decimal value of any given input number of any base + * @param inpNum String of which we need the decimal value and base in integer format + * @return string format of the decimal value + */ + + public String convertToDecimal(String inpNum, int base) { + int len = inpNum.length(); + int num = 0; + int pow = 1; + + for (int i=len-1; i>=0; i--) { + if (valOfChar(inpNum.charAt(i)) >= base) { + return "Invalid Number"; + } + num += valOfChar(inpNum.charAt(i))*pow; + pow *= base; + } + return String.valueOf(num); + } + + /** + * This method produces integer value of the input character and returns it + * @param c Char of which we need the integer value of + * @return integer value of input char + */ + + private static int valOfChar(char c) { + if (c >= '0' && c <= '9') { + return (int)c - '0'; + } + else { + return (int)c - 'A' + 10; + } + } +} \ No newline at end of file diff --git a/src/test/com/java/conversions/AnyBaseToDecimalTest.java b/src/test/com/java/conversions/AnyBaseToDecimalTest.java new file mode 100644 index 0000000..12ff76b --- /dev/null +++ b/src/test/com/java/conversions/AnyBaseToDecimalTest.java @@ -0,0 +1,39 @@ +package src.test.com.java.conversions; + +import org.junit.Assert; +import org.junit.Test; +import src.main.com.java.conversions.AnyBaseToDecimal; + +public class AnyBaseToDecimalTest { + + @Test + public void testAnyBaseToDecimal() { + AnyBaseToDecimal anyBaseToDecimal = new AnyBaseToDecimal(); + Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("2", 2)); + Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("3", 2)); + Assert.assertEquals("3", anyBaseToDecimal.convertToDecimal("11", 2)); + Assert.assertEquals("4", anyBaseToDecimal.convertToDecimal("100", 2)); + Assert.assertEquals("5", anyBaseToDecimal.convertToDecimal("101", 2)); + Assert.assertEquals("10", anyBaseToDecimal.convertToDecimal("1010", 2)); + Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("10000000000", 2)); + + Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("8", 8)); + Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("9", 8)); + Assert.assertEquals("7", anyBaseToDecimal.convertToDecimal("7", 8)); + Assert.assertEquals("8", anyBaseToDecimal.convertToDecimal("10", 8)); + Assert.assertEquals("9", anyBaseToDecimal.convertToDecimal("11", 8)); + Assert.assertEquals("10", anyBaseToDecimal.convertToDecimal("12", 8)); + Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("2000", 8)); + + Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("A", 10)); + Assert.assertEquals("10", anyBaseToDecimal.convertToDecimal("10", 10)); + Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("1024", 10)); + + Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("G", 16)); + Assert.assertEquals("16", anyBaseToDecimal.convertToDecimal("10", 16)); + Assert.assertEquals("17", anyBaseToDecimal.convertToDecimal("11", 16)); + Assert.assertEquals("100", anyBaseToDecimal.convertToDecimal("64", 16)); + Assert.assertEquals("225", anyBaseToDecimal.convertToDecimal("e1", 16)); + Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("400", 16)); + } +} From d9c46396d8637974ba5cf1bf9d9b3d74477f1396 Mon Sep 17 00:00:00 2001 From: lq Date: Sat, 25 Aug 2018 14:37:07 +0800 Subject: [PATCH 008/120] add a Test --- src/test/com/java/conversions/AnyBaseToDecimalTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/com/java/conversions/AnyBaseToDecimalTest.java b/src/test/com/java/conversions/AnyBaseToDecimalTest.java index 12ff76b..54d98fc 100644 --- a/src/test/com/java/conversions/AnyBaseToDecimalTest.java +++ b/src/test/com/java/conversions/AnyBaseToDecimalTest.java @@ -33,7 +33,7 @@ public void testAnyBaseToDecimal() { Assert.assertEquals("16", anyBaseToDecimal.convertToDecimal("10", 16)); Assert.assertEquals("17", anyBaseToDecimal.convertToDecimal("11", 16)); Assert.assertEquals("100", anyBaseToDecimal.convertToDecimal("64", 16)); - Assert.assertEquals("225", anyBaseToDecimal.convertToDecimal("e1", 16)); + Assert.assertEquals("225", anyBaseToDecimal.convertToDecimal("E1", 16)); Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("400", 16)); } } From 90a4c366188133e337ec79d87a5b8de8f14352c7 Mon Sep 17 00:00:00 2001 From: varunu28 Date: Sat, 25 Aug 2018 08:39:01 -0700 Subject: [PATCH 009/120] Added binary search and test --- .gitignore | 2 + src/main/com/java/search/BinarySearch.java | 49 +++++++++++++++++++ .../com/java/search/BinarySearchTest.java | 24 +++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/main/com/java/search/BinarySearch.java create mode 100644 src/test/com/java/search/BinarySearchTest.java diff --git a/.gitignore b/.gitignore index 729ef78..a19e87b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ Java.iml +.idea/* out/ +Downloads.iml diff --git a/src/main/com/java/search/BinarySearch.java b/src/main/com/java/search/BinarySearch.java new file mode 100644 index 0000000..6026753 --- /dev/null +++ b/src/main/com/java/search/BinarySearch.java @@ -0,0 +1,49 @@ +package src.main.com.java.search; + +/** + * Binary search is an algorithm which finds the position of a target value within a sorted array + * + * Worst-case performance O(log n) + * Best-case performance O(1) + * Average performance O(log n) + * Worst-case space complexity O(1) + */ +public class BinarySearch { + + /** + * @param array is an array where the element should be found + * @param key is an element which should be found + * @param is any comparable type + * @return index of the element + */ + public > int findIndex(T array[], T key) { + return search(array, key, 0, array.length-1); + } + + /** + * @param array The array to make the binary search + * @param key The number you are looking for + * @param left The lower bound + * @param right The upper bound + * @return the location of the key + **/ + private > int search(T array[], T key, int left, int right){ + if (left > right) { + return -1; // Key not found + } + + // Find median + int median = (left + right)/2; + int comp = key.compareTo(array[median]); + + if (comp < 0) { + return search(array, key, left, median - 1); + } + + if (comp > 0) { + return search(array, key, median + 1, right); + } + + return median; + } +} diff --git a/src/test/com/java/search/BinarySearchTest.java b/src/test/com/java/search/BinarySearchTest.java new file mode 100644 index 0000000..05c05ea --- /dev/null +++ b/src/test/com/java/search/BinarySearchTest.java @@ -0,0 +1,24 @@ +package src.test.com.java.search; + +import org.junit.Assert; +import org.junit.Test; +import src.main.com.java.search.BinarySearch; + +public class BinarySearchTest { + + @Test + public void testBinarySearch() { + BinarySearch binarySearch = new BinarySearch(); + + Integer[] arr1 = {1,2,3,4,5}; + Assert.assertEquals("Incorrect index", 2, binarySearch.findIndex(arr1,3)); + Assert.assertEquals("Incorrect index", 0, binarySearch.findIndex(arr1,1)); + Assert.assertEquals("Incorrect index", -1, binarySearch.findIndex(arr1,8)); + Assert.assertEquals("Incorrect index", -1, binarySearch.findIndex(arr1,-2)); + + String[] arr2 = {"A", "B", "C", "D"}; + Assert.assertEquals("Incorrect index", 2, binarySearch.findIndex(arr2,"C")); + Assert.assertEquals("Incorrect index", 1, binarySearch.findIndex(arr2,"B")); + Assert.assertEquals("Incorrect index", -1, binarySearch.findIndex(arr2,"F")); + } +} From 89f1c3750293553ca9a1511fd57b5b19e83e7e65 Mon Sep 17 00:00:00 2001 From: lq Date: Sun, 26 Aug 2018 22:56:02 +0800 Subject: [PATCH 010/120] add some tests for Sort --- src/main/com/java/sorts/BubbleSort.java | 28 +++++ src/main/com/java/sorts/HeapSort.java | 115 ++++++++++++++++++ src/main/com/java/sorts/QuickSort.java | 65 ++++++++++ src/main/com/java/sorts/SelectionSort.java | 32 +++++ src/main/com/java/sorts/ShellSort.java | 32 +++++ src/main/com/java/sorts/SortUtils.java | 45 +++++++ src/test/com/java/sorts/BubbleSortTest.java | 29 +++++ src/test/com/java/sorts/HeapSortTest.java | 27 ++++ src/test/com/java/sorts/QuickSortTest.java | 27 ++++ .../com/java/sorts/SelectionSortTest.java | 26 ++++ src/test/com/java/sorts/ShellSortTest.java | 26 ++++ 11 files changed, 452 insertions(+) create mode 100644 src/main/com/java/sorts/BubbleSort.java create mode 100644 src/main/com/java/sorts/HeapSort.java create mode 100644 src/main/com/java/sorts/QuickSort.java create mode 100644 src/main/com/java/sorts/SelectionSort.java create mode 100644 src/main/com/java/sorts/ShellSort.java create mode 100644 src/main/com/java/sorts/SortUtils.java create mode 100644 src/test/com/java/sorts/BubbleSortTest.java create mode 100644 src/test/com/java/sorts/HeapSortTest.java create mode 100644 src/test/com/java/sorts/QuickSortTest.java create mode 100644 src/test/com/java/sorts/SelectionSortTest.java create mode 100644 src/test/com/java/sorts/ShellSortTest.java diff --git a/src/main/com/java/sorts/BubbleSort.java b/src/main/com/java/sorts/BubbleSort.java new file mode 100644 index 0000000..24ff548 --- /dev/null +++ b/src/main/com/java/sorts/BubbleSort.java @@ -0,0 +1,28 @@ +package src.main.com.java.sorts; + +import static src.main.com.java.sorts.SortUtils.less; +import static src.main.com.java.sorts.SortUtils.swap; + +public class BubbleSort { + /** + * This method implements the Generic Bubble Sort + * + * @param array The array to be sorted + * Sorts the array in increasing order + **/ + public > T[] sort(T[] array) { + int last = array.length; + //Sorting + boolean swap; + do { + swap = false; + for (int count = 0; count < last - 1; count++) { + if (less(array[count + 1], array[count])) { + swap = swap(array, count, count + 1); + } + } + last--; + } while (swap); + return array; + } +} \ No newline at end of file diff --git a/src/main/com/java/sorts/HeapSort.java b/src/main/com/java/sorts/HeapSort.java new file mode 100644 index 0000000..267331d --- /dev/null +++ b/src/main/com/java/sorts/HeapSort.java @@ -0,0 +1,115 @@ +package src.main.com.java.sorts; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static src.main.com.java.sorts.SortUtils.less; +import static src.main.com.java.sorts.SortUtils.swap; + +public class HeapSort { + + + private static class Heap> { + /** + * Array to store heap + */ + private T[] heap; + + /** + * Constructor + * + * @param heap array of unordered integers + */ + Heap(T[] heap) { + this.heap = heap; + } + + /** + * Heapifies subtree from top as root to last as last child + * + * @param rootIndex index of root + * @param lastChild index of last child + */ + private void heapSubtree(int rootIndex, int lastChild) { + int leftIndex = rootIndex * 2 + 1; + int rightIndex = rootIndex * 2 + 2; + T root = heap[rootIndex]; + if (rightIndex <= lastChild) { + // if has right and left children + T left = heap[leftIndex]; + T right = heap[rightIndex]; + if (less(left, right) && less(left, root)) { + swap(heap, leftIndex, rootIndex); + heapSubtree(leftIndex, lastChild); + } else if (less(right, root)) { + swap(heap, rightIndex, rootIndex); + heapSubtree(rightIndex, lastChild); + } + } else if (leftIndex <= lastChild) { + // if no right child, but has left child + T left = heap[leftIndex]; + if (less(left, root)) { + swap(heap, leftIndex, rootIndex); + heapSubtree(leftIndex, lastChild); + } + } + } + + + /** + * Makes heap with root as root + * + * @param root index of root of heap + */ + private void makeMinHeap(int root) { + int leftIndex = root * 2 + 1; + int rightIndex = root * 2 + 2; + boolean hasLeftChild = leftIndex < heap.length; + boolean hasRightChild = rightIndex < heap.length; + if (hasRightChild) { + //if has left and right + makeMinHeap(leftIndex); + makeMinHeap(rightIndex); + heapSubtree(root, heap.length - 1); + } else if (hasLeftChild) { + heapSubtree(root, heap.length - 1); + } + } + + /** + * Gets the root of heap + * + * @return root of heap + */ + private T getRoot(int size) { + swap(heap, 0, size); + heapSubtree(0, size - 1); + // return old root + return heap[size]; + } + + + } + + public > T[] sort(T[] unsorted) { + return sort(Arrays.asList(unsorted)).toArray(unsorted); + } + + private > List sort(List unsorted) { + int size = unsorted.size(); + + @SuppressWarnings("unchecked") + Heap heap = new Heap<>(unsorted.toArray((T[]) new Comparable[unsorted.size()])); + + // make min heap using index 0 as root. + heap.makeMinHeap(0); + List sorted = new ArrayList<>(size); + while (size > 0) { + T min = heap.getRoot(--size); + sorted.add(min); + } + + return sorted; + } +} \ No newline at end of file diff --git a/src/main/com/java/sorts/QuickSort.java b/src/main/com/java/sorts/QuickSort.java new file mode 100644 index 0000000..902e767 --- /dev/null +++ b/src/main/com/java/sorts/QuickSort.java @@ -0,0 +1,65 @@ +package src.main.com.java.sorts; + +import static src.main.com.java.sorts.SortUtils.less; +import static src.main.com.java.sorts.SortUtils.swap; + +public class QuickSort { + + + /** + * This method implements the Generic Quick Sort + * + * @param array The array to be sorted + * Sorts the array in increasing order + **/ + public > T[] sort(T[] array) { + doSort(array, 0, array.length - 1); + return array; + } + + + /** + * The sorting process + * + * @param left The first index of an array + * @param right The last index of an array + * @param array The array to be sorted + **/ + + private static > void doSort(T[] array, int left, int right) { + if (left < right) { + int pivot = partition(array, left, right); + doSort(array, left, pivot - 1); + doSort(array, pivot, right); + } + } + + /** + * This method finds the partition index for an array + * + * @param array The array to be sorted + * @param left The first index of an array + * @param right The last index of an array + * Finds the partition index of an array + **/ + + private static > int partition(T[] array, int left, int right) { + int mid = (left + right) / 2; + T pivot = array[mid]; + + while (left <= right) { + while (less(array[left], pivot)) { + ++left; + } + while (less(pivot, array[right])) { + --right; + } + if (left <= right) { + swap(array, left, right); + ++left; + --right; + } + } + return left; + } +} \ No newline at end of file diff --git a/src/main/com/java/sorts/SelectionSort.java b/src/main/com/java/sorts/SelectionSort.java new file mode 100644 index 0000000..28483e5 --- /dev/null +++ b/src/main/com/java/sorts/SelectionSort.java @@ -0,0 +1,32 @@ +package src.main.com.java.sorts; + +import static src.main.com.java.sorts.SortUtils.less; +import static src.main.com.java.sorts.SortUtils.swap; + +public class SelectionSort { + + /** + * This method implements the Generic Selection Sort + * + * @param arr The array to be sorted + * Sorts the array in increasing order + **/ + public > T[] sort(T[] arr) { + int n = arr.length; + for (int i = 0; i < n - 1; i++) { + // Initial index of min + int min = i; + for (int j = i + 1; j < n; j++) { + if (less(arr[j], arr[min])) { + min = j; + } + } + // Swapping if index of min is changed + if (min != i) { + swap(arr, i, min); + } + } + + return arr; + } +} \ No newline at end of file diff --git a/src/main/com/java/sorts/ShellSort.java b/src/main/com/java/sorts/ShellSort.java new file mode 100644 index 0000000..3767984 --- /dev/null +++ b/src/main/com/java/sorts/ShellSort.java @@ -0,0 +1,32 @@ +package src.main.com.java.sorts; + +import static src.main.com.java.sorts.SortUtils.less; +import static src.main.com.java.sorts.SortUtils.swap; + +public class ShellSort { + + /** + * This method implements Generic Shell Sort. + * + * @param array The array to be sorted + */ + public > T[] sort(T[] array) { + int length = array.length; + int n = 1; + + while (n < length / 3) { + n = 3 * n + 1; + } + + while (n >= 1) { + for (int i = n; i < length; i++) { + for (int j = i; j >= n && less(array[j], array[j - n]); j -= n) { + swap(array, j, j - n); + } + } + n /= 3; + } + + return array; + } +} \ No newline at end of file diff --git a/src/main/com/java/sorts/SortUtils.java b/src/main/com/java/sorts/SortUtils.java new file mode 100644 index 0000000..73c5694 --- /dev/null +++ b/src/main/com/java/sorts/SortUtils.java @@ -0,0 +1,45 @@ +package src.main.com.java.sorts; + +final class SortUtils { + + + /** + * Helper method for swapping places in array + * + * @param array The array which elements we want to swap + * @param idx index of the first element + * @param idy index of the second element + */ + static boolean swap(T[] array, int idx, int idy) { + T swap = array[idx]; + array[idx] = array[idy]; + array[idy] = swap; + return true; + } + + + /** + * This method checks if first element is less then the other element + * + * @param v first element + * @param w second element + * @return true if the first element is less then the second element + */ + static > boolean less(T v, T w) { + return v.compareTo(w) < 0; + } + + + /** + * Swaps all position from {@param left} to @{@param right} for {@param array} + * + * @param array is an array + * @param left is a left flip border of the array + * @param right is a right flip border of the array + */ + static > void flip(T[] array, int left, int right) { + while (left <= right) { + swap(array, left++, right--); + } + } +} \ No newline at end of file diff --git a/src/test/com/java/sorts/BubbleSortTest.java b/src/test/com/java/sorts/BubbleSortTest.java new file mode 100644 index 0000000..42a1216 --- /dev/null +++ b/src/test/com/java/sorts/BubbleSortTest.java @@ -0,0 +1,29 @@ +package src.test.com.java.sorts; + + +import org.junit.Assert; +import org.junit.Test; +import src.main.com.java.sorts.BubbleSort; + +import java.util.Arrays; + +public class BubbleSortTest { + + @Test + public void bubbleSortTest() { + BubbleSort bubbleSort = new BubbleSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + System.out.println(Arrays.toString(bubbleSort.sort(unsortedInt))); + + Assert.assertArrayEquals(sortedInt, bubbleSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + System.out.println(Arrays.toString(bubbleSort.sort(unsortedChar))); + + Assert.assertArrayEquals(sortedChar, bubbleSort.sort(unsortedChar)); + + } + +} diff --git a/src/test/com/java/sorts/HeapSortTest.java b/src/test/com/java/sorts/HeapSortTest.java new file mode 100644 index 0000000..a110579 --- /dev/null +++ b/src/test/com/java/sorts/HeapSortTest.java @@ -0,0 +1,27 @@ +package src.test.com.java.sorts; + + +import org.junit.Assert; +import org.junit.Test; +import src.main.com.java.sorts.HeapSort; + +import java.util.Arrays; + +public class HeapSortTest { + + @Test + public void heapSortTest() { + HeapSort heapSort = new HeapSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + System.out.println(Arrays.toString(heapSort.sort(unsortedInt))); + + Assert.assertArrayEquals(sortedInt, heapSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + System.out.println(Arrays.toString(heapSort.sort(unsortedChar))); + + Assert.assertArrayEquals(sortedChar, heapSort.sort(unsortedChar)); + } +} diff --git a/src/test/com/java/sorts/QuickSortTest.java b/src/test/com/java/sorts/QuickSortTest.java new file mode 100644 index 0000000..6eb21c2 --- /dev/null +++ b/src/test/com/java/sorts/QuickSortTest.java @@ -0,0 +1,27 @@ +package src.test.com.java.sorts; + + +import org.junit.Assert; +import org.junit.Test; +import src.main.com.java.sorts.QuickSort; + +import java.util.Arrays; + +public class QuickSortTest { + + @Test + public void quickSortTest() { + QuickSort quickSort = new QuickSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + System.out.println(Arrays.toString(quickSort.sort(unsortedInt))); + + Assert.assertArrayEquals(sortedInt, quickSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + System.out.println(Arrays.toString(quickSort.sort(unsortedChar))); + + Assert.assertArrayEquals(sortedChar, quickSort.sort(unsortedChar)); + } +} diff --git a/src/test/com/java/sorts/SelectionSortTest.java b/src/test/com/java/sorts/SelectionSortTest.java new file mode 100644 index 0000000..622c6bd --- /dev/null +++ b/src/test/com/java/sorts/SelectionSortTest.java @@ -0,0 +1,26 @@ +package src.test.com.java.sorts; + +import org.junit.Assert; +import org.junit.Test; +import src.main.com.java.sorts.SelectionSort; + +import java.util.Arrays; + +public class SelectionSortTest { + + @Test + public void selectionSortTest() { + SelectionSort selectionSort = new SelectionSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + System.out.println(Arrays.toString(selectionSort.sort(unsortedInt))); + + Assert.assertArrayEquals(sortedInt, selectionSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + System.out.println(Arrays.toString(selectionSort.sort(unsortedChar))); + + Assert.assertArrayEquals(sortedChar, selectionSort.sort(unsortedChar)); + } +} diff --git a/src/test/com/java/sorts/ShellSortTest.java b/src/test/com/java/sorts/ShellSortTest.java new file mode 100644 index 0000000..b6c28f2 --- /dev/null +++ b/src/test/com/java/sorts/ShellSortTest.java @@ -0,0 +1,26 @@ +package src.test.com.java.sorts; + +import org.junit.Assert; +import org.junit.Test; +import src.main.com.java.sorts.ShellSort; + +import java.util.Arrays; + +public class ShellSortTest { + + @Test + public void shellSortTest() { + ShellSort shellSort = new ShellSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + System.out.println(Arrays.toString(shellSort.sort(unsortedInt))); + + Assert.assertArrayEquals(sortedInt, shellSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + System.out.println(Arrays.toString(shellSort.sort(unsortedChar))); + + Assert.assertArrayEquals(sortedChar, shellSort.sort(unsortedChar)); + } +} From 0adfcaca7a7037ac7c3e72a48650aab8a1db2d12 Mon Sep 17 00:00:00 2001 From: varunu28 Date: Tue, 28 Aug 2018 13:16:45 -0700 Subject: [PATCH 011/120] Corrected project structure --- .../java => java/com}/conversions/AnyBaseToDecimal.java | 2 +- .../java => java/com}/conversions/DecimalToAnyBase.java | 2 +- src/main/{com/java => java/com}/search/BinarySearch.java | 2 +- src/main/{com/java => java/com}/sorts/BubbleSort.java | 9 +++------ src/main/{com/java => java/com}/sorts/HeapSort.java | 6 +++--- src/main/{com/java => java/com}/sorts/QuickSort.java | 6 +++--- src/main/{com/java => java/com}/sorts/SelectionSort.java | 6 +++--- src/main/{com/java => java/com}/sorts/ShellSort.java | 6 +++--- src/main/{com/java => java/com}/sorts/SortUtils.java | 2 +- .../com}/conversions/AnyBaseToDecimalTest.java | 4 ++-- .../com}/conversions/DecimalToAnyBaseTest.java | 4 ++-- .../{com/java => java/com}/search/BinarySearchTest.java | 4 ++-- .../{com/java => java/com}/sorts/BubbleSortTest.java | 4 ++-- src/test/{com/java => java/com}/sorts/HeapSortTest.java | 4 ++-- src/test/{com/java => java/com}/sorts/QuickSortTest.java | 4 ++-- .../{com/java => java/com}/sorts/SelectionSortTest.java | 4 ++-- src/test/{com/java => java/com}/sorts/ShellSortTest.java | 4 ++-- 17 files changed, 35 insertions(+), 38 deletions(-) rename src/main/{com/java => java/com}/conversions/AnyBaseToDecimal.java (96%) rename src/main/{com/java => java/com}/conversions/DecimalToAnyBase.java (96%) rename src/main/{com/java => java/com}/search/BinarySearch.java (97%) rename src/main/{com/java => java/com}/sorts/BubbleSort.java (65%) rename src/main/{com/java => java/com}/sorts/HeapSort.java (95%) rename src/main/{com/java => java/com}/sorts/QuickSort.java (91%) rename src/main/{com/java => java/com}/sorts/SelectionSort.java (81%) rename src/main/{com/java => java/com}/sorts/ShellSort.java (78%) rename src/main/{com/java => java/com}/sorts/SortUtils.java (97%) rename src/test/{com/java => java/com}/conversions/AnyBaseToDecimalTest.java (95%) rename src/test/{com/java => java/com}/conversions/DecimalToAnyBaseTest.java (81%) rename src/test/{com/java => java/com}/search/BinarySearchTest.java (91%) rename src/test/{com/java => java/com}/sorts/BubbleSortTest.java (91%) rename src/test/{com/java => java/com}/sorts/HeapSortTest.java (91%) rename src/test/{com/java => java/com}/sorts/QuickSortTest.java (91%) rename src/test/{com/java => java/com}/sorts/SelectionSortTest.java (91%) rename src/test/{com/java => java/com}/sorts/ShellSortTest.java (91%) diff --git a/src/main/com/java/conversions/AnyBaseToDecimal.java b/src/main/java/com/conversions/AnyBaseToDecimal.java similarity index 96% rename from src/main/com/java/conversions/AnyBaseToDecimal.java rename to src/main/java/com/conversions/AnyBaseToDecimal.java index dc78bf8..4267e66 100644 --- a/src/main/com/java/conversions/AnyBaseToDecimal.java +++ b/src/main/java/com/conversions/AnyBaseToDecimal.java @@ -1,4 +1,4 @@ -package src.main.com.java.conversions; +package src.main.java.com.conversions; public class AnyBaseToDecimal { /** diff --git a/src/main/com/java/conversions/DecimalToAnyBase.java b/src/main/java/com/conversions/DecimalToAnyBase.java similarity index 96% rename from src/main/com/java/conversions/DecimalToAnyBase.java rename to src/main/java/com/conversions/DecimalToAnyBase.java index 7bf9eaf..ae675f2 100644 --- a/src/main/com/java/conversions/DecimalToAnyBase.java +++ b/src/main/java/com/conversions/DecimalToAnyBase.java @@ -1,4 +1,4 @@ -package main.com.java.conversions; +package src.main.java.com.conversions; import java.util.ArrayList; diff --git a/src/main/com/java/search/BinarySearch.java b/src/main/java/com/search/BinarySearch.java similarity index 97% rename from src/main/com/java/search/BinarySearch.java rename to src/main/java/com/search/BinarySearch.java index 6026753..20f7433 100644 --- a/src/main/com/java/search/BinarySearch.java +++ b/src/main/java/com/search/BinarySearch.java @@ -1,4 +1,4 @@ -package src.main.com.java.search; +package src.main.java.com.search; /** * Binary search is an algorithm which finds the position of a target value within a sorted array diff --git a/src/main/com/java/sorts/BubbleSort.java b/src/main/java/com/sorts/BubbleSort.java similarity index 65% rename from src/main/com/java/sorts/BubbleSort.java rename to src/main/java/com/sorts/BubbleSort.java index 24ff548..8179355 100644 --- a/src/main/com/java/sorts/BubbleSort.java +++ b/src/main/java/com/sorts/BubbleSort.java @@ -1,7 +1,4 @@ -package src.main.com.java.sorts; - -import static src.main.com.java.sorts.SortUtils.less; -import static src.main.com.java.sorts.SortUtils.swap; +package src.main.java.com.sorts; public class BubbleSort { /** @@ -17,8 +14,8 @@ public > T[] sort(T[] array) { do { swap = false; for (int count = 0; count < last - 1; count++) { - if (less(array[count + 1], array[count])) { - swap = swap(array, count, count + 1); + if (SortUtils.less(array[count + 1], array[count])) { + swap = SortUtils.swap(array, count, count + 1); } } last--; diff --git a/src/main/com/java/sorts/HeapSort.java b/src/main/java/com/sorts/HeapSort.java similarity index 95% rename from src/main/com/java/sorts/HeapSort.java rename to src/main/java/com/sorts/HeapSort.java index 267331d..a1cefd0 100644 --- a/src/main/com/java/sorts/HeapSort.java +++ b/src/main/java/com/sorts/HeapSort.java @@ -1,11 +1,11 @@ -package src.main.com.java.sorts; +package src.main.java.com.sorts; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static src.main.com.java.sorts.SortUtils.less; -import static src.main.com.java.sorts.SortUtils.swap; +import static src.main.java.com.sorts.SortUtils.less; +import static src.main.java.com.sorts.SortUtils.swap; public class HeapSort { diff --git a/src/main/com/java/sorts/QuickSort.java b/src/main/java/com/sorts/QuickSort.java similarity index 91% rename from src/main/com/java/sorts/QuickSort.java rename to src/main/java/com/sorts/QuickSort.java index 902e767..31d6a0f 100644 --- a/src/main/com/java/sorts/QuickSort.java +++ b/src/main/java/com/sorts/QuickSort.java @@ -1,7 +1,7 @@ -package src.main.com.java.sorts; +package src.main.java.com.sorts; -import static src.main.com.java.sorts.SortUtils.less; -import static src.main.com.java.sorts.SortUtils.swap; +import static src.main.java.com.sorts.SortUtils.less; +import static src.main.java.com.sorts.SortUtils.swap; public class QuickSort { diff --git a/src/main/com/java/sorts/SelectionSort.java b/src/main/java/com/sorts/SelectionSort.java similarity index 81% rename from src/main/com/java/sorts/SelectionSort.java rename to src/main/java/com/sorts/SelectionSort.java index 28483e5..1038bec 100644 --- a/src/main/com/java/sorts/SelectionSort.java +++ b/src/main/java/com/sorts/SelectionSort.java @@ -1,7 +1,7 @@ -package src.main.com.java.sorts; +package src.main.java.com.sorts; -import static src.main.com.java.sorts.SortUtils.less; -import static src.main.com.java.sorts.SortUtils.swap; +import static src.main.java.com.sorts.SortUtils.less; +import static src.main.java.com.sorts.SortUtils.swap; public class SelectionSort { diff --git a/src/main/com/java/sorts/ShellSort.java b/src/main/java/com/sorts/ShellSort.java similarity index 78% rename from src/main/com/java/sorts/ShellSort.java rename to src/main/java/com/sorts/ShellSort.java index 3767984..d300cfc 100644 --- a/src/main/com/java/sorts/ShellSort.java +++ b/src/main/java/com/sorts/ShellSort.java @@ -1,7 +1,7 @@ -package src.main.com.java.sorts; +package src.main.java.com.sorts; -import static src.main.com.java.sorts.SortUtils.less; -import static src.main.com.java.sorts.SortUtils.swap; +import static src.main.java.com.sorts.SortUtils.less; +import static src.main.java.com.sorts.SortUtils.swap; public class ShellSort { diff --git a/src/main/com/java/sorts/SortUtils.java b/src/main/java/com/sorts/SortUtils.java similarity index 97% rename from src/main/com/java/sorts/SortUtils.java rename to src/main/java/com/sorts/SortUtils.java index 73c5694..26fc683 100644 --- a/src/main/com/java/sorts/SortUtils.java +++ b/src/main/java/com/sorts/SortUtils.java @@ -1,4 +1,4 @@ -package src.main.com.java.sorts; +package src.main.java.com.sorts; final class SortUtils { diff --git a/src/test/com/java/conversions/AnyBaseToDecimalTest.java b/src/test/java/com/conversions/AnyBaseToDecimalTest.java similarity index 95% rename from src/test/com/java/conversions/AnyBaseToDecimalTest.java rename to src/test/java/com/conversions/AnyBaseToDecimalTest.java index 54d98fc..2659234 100644 --- a/src/test/com/java/conversions/AnyBaseToDecimalTest.java +++ b/src/test/java/com/conversions/AnyBaseToDecimalTest.java @@ -1,8 +1,8 @@ -package src.test.com.java.conversions; +package src.test.java.com.conversions; import org.junit.Assert; import org.junit.Test; -import src.main.com.java.conversions.AnyBaseToDecimal; +import src.main.java.com.conversions.AnyBaseToDecimal; public class AnyBaseToDecimalTest { diff --git a/src/test/com/java/conversions/DecimalToAnyBaseTest.java b/src/test/java/com/conversions/DecimalToAnyBaseTest.java similarity index 81% rename from src/test/com/java/conversions/DecimalToAnyBaseTest.java rename to src/test/java/com/conversions/DecimalToAnyBaseTest.java index da1d0fe..f6166a6 100644 --- a/src/test/com/java/conversions/DecimalToAnyBaseTest.java +++ b/src/test/java/com/conversions/DecimalToAnyBaseTest.java @@ -1,6 +1,6 @@ -package test.com.java.conversions; +package src.test.java.com.conversions; -import main.com.java.conversions.DecimalToAnyBase; +import src.main.java.com.conversions.DecimalToAnyBase; import org.junit.Test; import static junit.framework.Assert.assertEquals; diff --git a/src/test/com/java/search/BinarySearchTest.java b/src/test/java/com/search/BinarySearchTest.java similarity index 91% rename from src/test/com/java/search/BinarySearchTest.java rename to src/test/java/com/search/BinarySearchTest.java index 05c05ea..83b2b97 100644 --- a/src/test/com/java/search/BinarySearchTest.java +++ b/src/test/java/com/search/BinarySearchTest.java @@ -1,8 +1,8 @@ -package src.test.com.java.search; +package src.test.java.com.search; import org.junit.Assert; import org.junit.Test; -import src.main.com.java.search.BinarySearch; +import src.main.java.com.search.BinarySearch; public class BinarySearchTest { diff --git a/src/test/com/java/sorts/BubbleSortTest.java b/src/test/java/com/sorts/BubbleSortTest.java similarity index 91% rename from src/test/com/java/sorts/BubbleSortTest.java rename to src/test/java/com/sorts/BubbleSortTest.java index 42a1216..d30e58f 100644 --- a/src/test/com/java/sorts/BubbleSortTest.java +++ b/src/test/java/com/sorts/BubbleSortTest.java @@ -1,9 +1,9 @@ -package src.test.com.java.sorts; +package src.test.java.com.sorts; import org.junit.Assert; import org.junit.Test; -import src.main.com.java.sorts.BubbleSort; +import src.main.java.com.sorts.BubbleSort; import java.util.Arrays; diff --git a/src/test/com/java/sorts/HeapSortTest.java b/src/test/java/com/sorts/HeapSortTest.java similarity index 91% rename from src/test/com/java/sorts/HeapSortTest.java rename to src/test/java/com/sorts/HeapSortTest.java index a110579..6044efb 100644 --- a/src/test/com/java/sorts/HeapSortTest.java +++ b/src/test/java/com/sorts/HeapSortTest.java @@ -1,9 +1,9 @@ -package src.test.com.java.sorts; +package src.test.java.com.sorts; import org.junit.Assert; import org.junit.Test; -import src.main.com.java.sorts.HeapSort; +import src.main.java.com.sorts.HeapSort; import java.util.Arrays; diff --git a/src/test/com/java/sorts/QuickSortTest.java b/src/test/java/com/sorts/QuickSortTest.java similarity index 91% rename from src/test/com/java/sorts/QuickSortTest.java rename to src/test/java/com/sorts/QuickSortTest.java index 6eb21c2..c61b924 100644 --- a/src/test/com/java/sorts/QuickSortTest.java +++ b/src/test/java/com/sorts/QuickSortTest.java @@ -1,9 +1,9 @@ -package src.test.com.java.sorts; +package src.test.java.com.sorts; import org.junit.Assert; import org.junit.Test; -import src.main.com.java.sorts.QuickSort; +import src.main.java.com.sorts.QuickSort; import java.util.Arrays; diff --git a/src/test/com/java/sorts/SelectionSortTest.java b/src/test/java/com/sorts/SelectionSortTest.java similarity index 91% rename from src/test/com/java/sorts/SelectionSortTest.java rename to src/test/java/com/sorts/SelectionSortTest.java index 622c6bd..7bfbe63 100644 --- a/src/test/com/java/sorts/SelectionSortTest.java +++ b/src/test/java/com/sorts/SelectionSortTest.java @@ -1,8 +1,8 @@ -package src.test.com.java.sorts; +package src.test.java.com.sorts; import org.junit.Assert; import org.junit.Test; -import src.main.com.java.sorts.SelectionSort; +import src.main.java.com.sorts.SelectionSort; import java.util.Arrays; diff --git a/src/test/com/java/sorts/ShellSortTest.java b/src/test/java/com/sorts/ShellSortTest.java similarity index 91% rename from src/test/com/java/sorts/ShellSortTest.java rename to src/test/java/com/sorts/ShellSortTest.java index b6c28f2..e057e34 100644 --- a/src/test/com/java/sorts/ShellSortTest.java +++ b/src/test/java/com/sorts/ShellSortTest.java @@ -1,8 +1,8 @@ -package src.test.com.java.sorts; +package src.test.java.com.sorts; import org.junit.Assert; import org.junit.Test; -import src.main.com.java.sorts.ShellSort; +import src.main.java.com.sorts.ShellSort; import java.util.Arrays; From 47093451ac4e08c25198529fa152d282cf5093ff Mon Sep 17 00:00:00 2001 From: lq Date: Thu, 30 Aug 2018 01:34:59 +0800 Subject: [PATCH 012/120] add Test for InsertionSort --- src/main/java/com/sorts/InsertionSort.java | 27 +++++++++++++++++++ .../java/com/sorts/InsertionSortTest.java | 27 +++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 src/main/java/com/sorts/InsertionSort.java create mode 100644 src/test/java/com/sorts/InsertionSortTest.java diff --git a/src/main/java/com/sorts/InsertionSort.java b/src/main/java/com/sorts/InsertionSort.java new file mode 100644 index 0000000..e7deb89 --- /dev/null +++ b/src/main/java/com/sorts/InsertionSort.java @@ -0,0 +1,27 @@ +package src.main.java.com.sorts; + +public class InsertionSort { + + /** + * This method implements the Generic Insertion Sort + * Sorts the array in increasing order + * + * @param array The array to be sorted + **/ + public > T[] sort(T[] array) { + for (int j = 1; j < array.length; j++) { + + // Picking up the key(Card) + T key = array[j]; + int i = j - 1; + + while (i >= 0 && SortUtils.less(key, array[i])) { + array[i + 1] = array[i]; + i--; + } + // Placing the key (Card) at its correct position in the sorted subarray + array[i + 1] = key; + } + return array; + } +} diff --git a/src/test/java/com/sorts/InsertionSortTest.java b/src/test/java/com/sorts/InsertionSortTest.java new file mode 100644 index 0000000..e579c66 --- /dev/null +++ b/src/test/java/com/sorts/InsertionSortTest.java @@ -0,0 +1,27 @@ +package src.test.java.com.sorts; + + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.sorts.InsertionSort; + +import java.util.Arrays; + +public class InsertionSortTest { + + @Test + public void insertionSortTest() { + InsertionSort insertionSort = new InsertionSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + System.out.println(Arrays.toString(insertionSort.sort(unsortedInt))); + + Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + System.out.println(Arrays.toString(insertionSort.sort(unsortedChar))); + + Assert.assertArrayEquals(sortedChar, insertionSort.sort(unsortedChar)); + } +} From 6de87051fd4f86713d931710f5f7afe0fd296843 Mon Sep 17 00:00:00 2001 From: lq Date: Thu, 30 Aug 2018 07:37:23 +0800 Subject: [PATCH 013/120] add Test for InsertionSort; delete print statements from Test files. --- src/test/java/com/sorts/BubbleSortTest.java | 7 +------ src/test/java/com/sorts/HeapSortTest.java | 7 +------ src/test/java/com/sorts/InsertionSortTest.java | 7 +------ src/test/java/com/sorts/QuickSortTest.java | 7 +------ src/test/java/com/sorts/SelectionSortTest.java | 7 +------ src/test/java/com/sorts/ShellSortTest.java | 7 +------ 6 files changed, 6 insertions(+), 36 deletions(-) diff --git a/src/test/java/com/sorts/BubbleSortTest.java b/src/test/java/com/sorts/BubbleSortTest.java index d30e58f..e58d086 100644 --- a/src/test/java/com/sorts/BubbleSortTest.java +++ b/src/test/java/com/sorts/BubbleSortTest.java @@ -5,23 +5,18 @@ import org.junit.Test; import src.main.java.com.sorts.BubbleSort; -import java.util.Arrays; - public class BubbleSortTest { @Test public void bubbleSortTest() { BubbleSort bubbleSort = new BubbleSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - System.out.println(Arrays.toString(bubbleSort.sort(unsortedInt))); - Assert.assertArrayEquals(sortedInt, bubbleSort.sort(unsortedInt)); Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - System.out.println(Arrays.toString(bubbleSort.sort(unsortedChar))); - Assert.assertArrayEquals(sortedChar, bubbleSort.sort(unsortedChar)); } diff --git a/src/test/java/com/sorts/HeapSortTest.java b/src/test/java/com/sorts/HeapSortTest.java index 6044efb..9d7cd93 100644 --- a/src/test/java/com/sorts/HeapSortTest.java +++ b/src/test/java/com/sorts/HeapSortTest.java @@ -5,23 +5,18 @@ import org.junit.Test; import src.main.java.com.sorts.HeapSort; -import java.util.Arrays; - public class HeapSortTest { @Test public void heapSortTest() { HeapSort heapSort = new HeapSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - System.out.println(Arrays.toString(heapSort.sort(unsortedInt))); - Assert.assertArrayEquals(sortedInt, heapSort.sort(unsortedInt)); Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - System.out.println(Arrays.toString(heapSort.sort(unsortedChar))); - Assert.assertArrayEquals(sortedChar, heapSort.sort(unsortedChar)); } } diff --git a/src/test/java/com/sorts/InsertionSortTest.java b/src/test/java/com/sorts/InsertionSortTest.java index e579c66..0344c2b 100644 --- a/src/test/java/com/sorts/InsertionSortTest.java +++ b/src/test/java/com/sorts/InsertionSortTest.java @@ -5,23 +5,18 @@ import org.junit.Test; import src.main.java.com.sorts.InsertionSort; -import java.util.Arrays; - public class InsertionSortTest { @Test public void insertionSortTest() { InsertionSort insertionSort = new InsertionSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - System.out.println(Arrays.toString(insertionSort.sort(unsortedInt))); - Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - System.out.println(Arrays.toString(insertionSort.sort(unsortedChar))); - Assert.assertArrayEquals(sortedChar, insertionSort.sort(unsortedChar)); } } diff --git a/src/test/java/com/sorts/QuickSortTest.java b/src/test/java/com/sorts/QuickSortTest.java index c61b924..00154c1 100644 --- a/src/test/java/com/sorts/QuickSortTest.java +++ b/src/test/java/com/sorts/QuickSortTest.java @@ -5,23 +5,18 @@ import org.junit.Test; import src.main.java.com.sorts.QuickSort; -import java.util.Arrays; - public class QuickSortTest { @Test public void quickSortTest() { QuickSort quickSort = new QuickSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - System.out.println(Arrays.toString(quickSort.sort(unsortedInt))); - Assert.assertArrayEquals(sortedInt, quickSort.sort(unsortedInt)); Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - System.out.println(Arrays.toString(quickSort.sort(unsortedChar))); - Assert.assertArrayEquals(sortedChar, quickSort.sort(unsortedChar)); } } diff --git a/src/test/java/com/sorts/SelectionSortTest.java b/src/test/java/com/sorts/SelectionSortTest.java index 7bfbe63..cb9411c 100644 --- a/src/test/java/com/sorts/SelectionSortTest.java +++ b/src/test/java/com/sorts/SelectionSortTest.java @@ -4,23 +4,18 @@ import org.junit.Test; import src.main.java.com.sorts.SelectionSort; -import java.util.Arrays; - public class SelectionSortTest { @Test public void selectionSortTest() { SelectionSort selectionSort = new SelectionSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - System.out.println(Arrays.toString(selectionSort.sort(unsortedInt))); - Assert.assertArrayEquals(sortedInt, selectionSort.sort(unsortedInt)); Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - System.out.println(Arrays.toString(selectionSort.sort(unsortedChar))); - Assert.assertArrayEquals(sortedChar, selectionSort.sort(unsortedChar)); } } diff --git a/src/test/java/com/sorts/ShellSortTest.java b/src/test/java/com/sorts/ShellSortTest.java index e057e34..a473de6 100644 --- a/src/test/java/com/sorts/ShellSortTest.java +++ b/src/test/java/com/sorts/ShellSortTest.java @@ -4,23 +4,18 @@ import org.junit.Test; import src.main.java.com.sorts.ShellSort; -import java.util.Arrays; - public class ShellSortTest { @Test public void shellSortTest() { ShellSort shellSort = new ShellSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - System.out.println(Arrays.toString(shellSort.sort(unsortedInt))); - Assert.assertArrayEquals(sortedInt, shellSort.sort(unsortedInt)); Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - System.out.println(Arrays.toString(shellSort.sort(unsortedChar))); - Assert.assertArrayEquals(sortedChar, shellSort.sort(unsortedChar)); } } From 6d2fa795f73c52648fad0ee733d2b79c6600d75c Mon Sep 17 00:00:00 2001 From: Ralph Niemitz Date: Mon, 3 Sep 2018 10:42:21 +0200 Subject: [PATCH 014/120] Added SimplexNoise Signed-off-by: Ralph Niemitz --- .../java/com/generation/SimplexNoise.java | 135 ++++++ .../com/generation/SimplexNoiseOctave.java | 392 ++++++++++++++++++ .../java/com/generation/SimplexNoiseTest.java | 50 +++ .../java/com/generation/expected-result.png | Bin 0 -> 61425 bytes 4 files changed, 577 insertions(+) create mode 100644 src/main/java/com/generation/SimplexNoise.java create mode 100644 src/main/java/com/generation/SimplexNoiseOctave.java create mode 100644 src/test/java/com/generation/SimplexNoiseTest.java create mode 100644 src/test/java/com/generation/expected-result.png diff --git a/src/main/java/com/generation/SimplexNoise.java b/src/main/java/com/generation/SimplexNoise.java new file mode 100644 index 0000000..a63534d --- /dev/null +++ b/src/main/java/com/generation/SimplexNoise.java @@ -0,0 +1,135 @@ +package src.main.java.com.generation; + +import java.util.Random; + +/** + * Implementation of the simplex noise algorithm. + * @see Wikipedia + */ +public class SimplexNoise { + + private SimplexNoiseOctave[] octaves; + private double[] frequencys; + private double[] amplitudes; + private int largestFeature; + private double persistance; + private long seed; + + /** + * @param largestFeature size of the largest possible feature + * @param persistence the persistence + * @param seed the seed + */ + public SimplexNoise(int largestFeature, double persistence, long seed) { + + this.largestFeature = largestFeature; + this.persistance = persistence; + this.seed = seed; + + int octaveCount = (int)Math.ceil(Math.log10(largestFeature) / Math.log10(2.0D)); + this.octaves = new SimplexNoiseOctave[octaveCount]; + this.frequencys = new double[octaveCount]; + this.amplitudes = new double[octaveCount]; + + Random random = new Random(seed); + + for(int index = 0; index < octaveCount; index++) { + + this.octaves[index] = new SimplexNoiseOctave(random.nextInt()); + this.frequencys[index] = Math.pow(2, index); + this.amplitudes[index] = Math.pow(persistence, octaveCount - index); + } + } + + /** + * Generates a height map. + * @param x X coordinate + * @param y Y coordinate + * @param width width + * @param height height + * @return the generated height map + */ + public float[][] generateHeightMap(int x, int y, int width, int height) { + + int xEnd = x + width; + int yEnd = y + height; + + float[][] result = new float[width][height]; + + for(int i = 0; i < width; i++) { + + for(int j = 0; j < height; j++) { + + int posX = x + i * ((xEnd - x) / width); + int posY = y + j * ((yEnd - y) / height); + result[i][j] = Math.min(1.0F, Math.max(0.0F, (float)(0.5D * (1 + this.getNoise(posX, posY))))); + } + } + + return result; + } + + /** + * Generates a two dimensional noise. + * @param x X coordinate + * @param y Y coordinate + * @return the generated noise + */ + public double getNoise(int x, int y) { + + double result = 0; + + for(int index = 0; index < this.octaves.length; index++) { + + result += this.octaves[index].noise(x / this.frequencys[index], y / this.frequencys[index]) * this.amplitudes[index]; + } + + return result; + } + + /** + * Generates a three dimensional noise. + * @param x X coordinate + * @param y Y coordinate + * @param z Z coordinate + * @return the generated noise + */ + public double getNoise(int x, int y, int z) { + + double result = 0; + + for(int index = 0; index < this.octaves.length; index++) { + + double frequency = Math.pow(2, index); + double amplitude = Math.pow(this.persistance, this.octaves.length - index); + + result += this.octaves[index].noise(x / frequency, y / frequency, z / frequency) * amplitude; + } + + return result; + } + + /** + * @return the largest possible feature + */ + public int getLargestFeature() { + + return this.largestFeature; + } + + /** + * @return the persistence + */ + public double getPersistance() { + + return this.persistance; + } + + /** + * @return the seed + */ + public long getSeed() { + + return this.seed; + } +} diff --git a/src/main/java/com/generation/SimplexNoiseOctave.java b/src/main/java/com/generation/SimplexNoiseOctave.java new file mode 100644 index 0000000..7ea25f9 --- /dev/null +++ b/src/main/java/com/generation/SimplexNoiseOctave.java @@ -0,0 +1,392 @@ +package src.main.java.com.generation; + +import java.util.Random; + +/** + * Implementation of a simplex noise octave. + */ +public class SimplexNoiseOctave { + + private static final Gradient[] GRADIENTS = { + + new Gradient( 1, 1, 0), new Gradient(-1, 1, 0), new Gradient( 1, -1, 0), + new Gradient(-1, -1, 0), new Gradient( 1, 0, 1), new Gradient(-1, 0, 1), + new Gradient( 1, 0, -1), new Gradient(-1, 0, -1), new Gradient( 0, 1, 1), + new Gradient( 0, -1, 1), new Gradient( 0, 1, -1), new Gradient( 0, -1, -1) + }; + private static final short P_SUPPLY[] = { + + 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, + 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, + 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, + 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, + 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, + 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, + 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, + 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, + 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, + 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, + 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, + 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, + 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, + 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, + 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, + 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 + }; + private static final int LENGTH = P_SUPPLY.length * 2; + private static final int SWAP_COUNT = 20; + private static final double F2 = 0.5D * (Math.sqrt(3.0D) - 1.0D); + private static final double G2 = (3.0D - Math.sqrt(3.0D)) / 6.0D; + private static final double F3 = 1.0D / 3.0D; + private static final double G3 = 1.0D / 6.0D; + + private final short[] p = P_SUPPLY.clone(); + private final short[] perm = new short[LENGTH]; + private final short[] permMod12 = new short[LENGTH]; + + /** + * @param seed the seed for this octave + */ + public SimplexNoiseOctave(long seed) { + + Random random = new Random(seed); + + for(int index = 0; index < SWAP_COUNT; index++) { + + int swapFrom = random.nextInt(this.p.length); + int swapTo = random.nextInt(this.p.length); + + short temp = this.p[swapFrom]; + this.p[swapFrom] = this.p[swapTo]; + this.p[swapTo] = temp; + } + + for(int index = 0; index < LENGTH; index++) { + + this.perm[index] = this.p[index & 255]; + this.permMod12[index] = (short)(this.perm[index] % 12); + } + } + + /** + * A method with the functionality of {@link Math#floor(double)} but it is faster. + * @param x the value + * @return the result + * @see Math#floor(double) + */ + private static final int fastfloor(double x) { + + int xAsInt = (int)x; + return x < xAsInt ? xAsInt - 1 : xAsInt; + } + + /** + * Dot function for a gradient. + * @param gradient the gradient + * @param x X + * @param y Y + * @return the dot value + */ + private static final double dot(Gradient gradient, double x, double y) { + + return gradient.x * x + gradient.y * y; + } + + /** + * Dot function for a gradient. + * @param gradient the gradient + * @param x X + * @param y Y + * @param z Z + * @return the dot value + */ + private static final double dot(Gradient gradient, double x, double y, double z) { + + return gradient.x * x + gradient.y * y + gradient.z * z; + } + + /** + * Makes a two dimensional noise. + * @param x X + * @param y Y + * @return the noise + */ + public double noise(double x, double y) { + + double n0; + double n1; + double n2; + + double s = (x + y) * F2; + + int i = fastfloor(x + s); + int j = fastfloor(y + s); + + double t = (i + j) * G2; + + double X0 = i - t; + double Y0 = j - t; + + double x0 = x - X0; + double y0 = y - Y0; + + int i1; + int j1; + + if(x0 > y0) { + + i1 = 1; + j1 = 0; + + } else { + + i1 = 0; + j1 = 1; + } + + double x1 = x0 - i1 + G2; + double y1 = y0 - j1 + G2; + double x2 = x0 - 1.0D + 2.0D * G2; + double y2 = y0 - 1.0D + 2.0D * G2; + + int ii = i & 0xFF; + int jj = j & 0xFF; + + int gi0 = this.permMod12[ii + this.perm[jj]]; + int gi1 = this.permMod12[ii + i1 + this.perm[jj + j1]]; + int gi2 = this.permMod12[ii + 1 + this.perm[jj + 1]]; + + double t0 = 0.5D - x0 * x0 - y0 * y0; + + if(t0 < 0) { + + n0 = 0.0; + + } else { + + t0 *= t0; + n0 = t0 * t0 * dot(GRADIENTS[gi0], x0, y0); + } + + double t1 = 0.5D - x1 * x1 - y1 * y1; + + if(t1 < 0.0D) { + + n1 = 0.0; + + } else { + + t1 *= t1; + n1 = t1 * t1 * dot(GRADIENTS[gi1], x1, y1); + } + + double t2 = 0.5D - x2 * x2 - y2 * y2; + + if(t2 < 0.0D) { + + n2 = 0.0D; + + } else { + + t2 *= t2; + n2 = t2 * t2 * dot(GRADIENTS[gi2], x2, y2); + } + + return 70.0D * (n0 + n1 + n2); + } + + /** + * Makes a three dimensional noise. + * @param x X + * @param y Y + * @param z Z + * @return the noise + * @since 21.08.2018/0.2.0 + */ + public double noise(double x, double y, double z) { + + double n0; + double n1; + double n2; + double n3; + + double s = (x + y + z) * F3; + + int i = fastfloor(x + s); + int j = fastfloor(y + s); + int k = fastfloor(z + s); + + double t = (i + j + k) * G3; + + double X0 = i - t; + double Y0 = j - t; + double Z0 = k - t; + + double x0 = x - X0; + double y0 = y - Y0; + double z0 = z - Z0; + + int i1; + int j1; + int k1; + int i2; + int j2; + int k2; + + if(x0 >= y0) { + + if(y0 >= z0) { + + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + + } else if(x0 >= z0) { + + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 0; + k2 = 1; + + } else { + + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 1; + j2 = 0; + k2 = 1; + } + + } else { + + if(y0 < z0) { + + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 0; + j2 = 1; + k2 = 1; + + } else if(x0 < z0) { + + i1 = 0; + j1 = 1; + k1 = 0; + i2 = 0; + j2 = 1; + k2 = 1; + + } else { + + i1 = 0; + j1 = 1; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + } + } + + double x1 = x0 - i1 + G3; + double y1 = y0 - j1 + G3; + double z1 = z0 - k1 + G3; + + double x2 = x0 - i2 + 2.0D * G3; + double y2 = y0 - j2 + 2.0D * G3; + double z2 = z0 - k2 + 2.0D * G3; + + double x3 = x0 - 1.0D + 3.0D * G3; + double y3 = y0 - 1.0D + 3.0D * G3; + double z3 = z0 - 1.0D + 3.0D * G3; + + int ii = i & 0xFF; + int jj = j & 0xFF; + int kk = k & 0xFF; + + int gi0 = this.permMod12[ii + this.perm[jj + this.perm[kk]]]; + int gi1 = this.permMod12[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]]; + int gi2 = this.permMod12[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]]; + int gi3 = this.permMod12[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]]; + + double t0 = 0.6D - x0 * x0 - y0 * y0 - z0 * z0; + + if(t0 < 0) { + + n0 = 0.0D; + + } else { + + t0 *= t0; + n0 = t0 * t0 * dot(GRADIENTS[gi0], x0, y0, z0); + } + + double t1 = 0.6D - x1 * x1 - y1 * y1 - z1 * z1; + + if(t1 < 0) { + + n1 = 0.0D; + + } else { + + t1 *= t1; + n1 = t1 * t1 * dot(GRADIENTS[gi1], x1, y1, z1); + } + + double t2 = 0.6D - x2 * x2 - y2 * y2 - z2 * z2; + + if(t2 < 0) { + + n2 = 0.0D; + + } else { + + t2 *= t2; + n2 = t2 * t2 * dot(GRADIENTS[gi2], x2, y2, z2); + } + + double t3 = 0.6D - x3 * x3 - y3 * y3 - z3 * z3; + + if(t3 < 0) { + + n3 = 0.0D; + + } else { + + t3 *= t3; + n3 = t3 * t3 * dot(GRADIENTS[gi3], x3, y3, z3); + } + + return 32.0D * (n0 + n1 + n2 + n3); + } + + /** + * Represents a gradient. + * Inner classes are faster than arrays. + */ + private static final class Gradient { + + private final double x; + private final double y; + private final double z; + + /** + * @param x X + * @param y Y + * @param z Z + * @since 21.08.2018/0.2.0 + */ + private Gradient(double x, double y, double z) { + + this.x = x; + this.y = y; + this.z = z; + } + } +} diff --git a/src/test/java/com/generation/SimplexNoiseTest.java b/src/test/java/com/generation/SimplexNoiseTest.java new file mode 100644 index 0000000..a977e8e --- /dev/null +++ b/src/test/java/com/generation/SimplexNoiseTest.java @@ -0,0 +1,50 @@ +package src.test.java.com.generation; + +import static org.junit.jupiter.api.Assertions.*; + +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.InputStream; + +import javax.imageio.ImageIO; + +import org.junit.jupiter.api.Test; + +import src.main.java.com.generation.SimplexNoise; + +public class SimplexNoiseTest { + + @Test + public void testGenerateHeightMap() { + + final int WIDTH = 256; + final int HEIGHT = 256; + final int X = 0; + final int Y = 0; + final String RESOURCE_NAME = "src/test/java/com/generation/expected-result.png"; + + float[][] heightmap = new SimplexNoise(50, 0.3F, 1111111111111111L).generateHeightMap(X, Y, WIDTH, HEIGHT); + BufferedImage image = null; + + try(InputStream in = this.getClass().getClassLoader().getResourceAsStream(RESOURCE_NAME)) { + + image = ImageIO.read(in); + + assertEquals(WIDTH, image.getWidth()); + assertEquals(HEIGHT, image.getHeight()); + + } catch(IOException | IllegalArgumentException exception) { + + fail(exception); + } + + for(int x = 0; x < WIDTH; x++) { + + for(int y = 0; y < HEIGHT; y++) { + + assertEquals(new Color(image.getRGB(x, y)).getRed(), (int)(heightmap[x][y] * 255)); + } + } + } +} diff --git a/src/test/java/com/generation/expected-result.png b/src/test/java/com/generation/expected-result.png new file mode 100644 index 0000000000000000000000000000000000000000..df2eb2a3db96fc3fa25aa5add98f472d41b35aa3 GIT binary patch literal 61425 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 m=KJnUmKUJm?gFP!y8i-;7LHW~^6P~F0000 Date: Tue, 4 Sep 2018 06:38:43 +0200 Subject: [PATCH 015/120] Made the required changes for the PR --- src/main/java/com/generation/SimplexNoise.java | 7 +++---- src/main/java/com/generation/SimplexNoiseOctave.java | 4 +--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/generation/SimplexNoise.java b/src/main/java/com/generation/SimplexNoise.java index a63534d..699e0a2 100644 --- a/src/main/java/com/generation/SimplexNoise.java +++ b/src/main/java/com/generation/SimplexNoise.java @@ -4,7 +4,6 @@ /** * Implementation of the simplex noise algorithm. - * @see Wikipedia */ public class SimplexNoise { @@ -16,9 +15,9 @@ public class SimplexNoise { private long seed; /** - * @param largestFeature size of the largest possible feature - * @param persistence the persistence - * @param seed the seed + * @param largestFeature the diameter of the largest possible "cloud". + * @param persistence the persistence. a low persistence causes smoother transition between the features while a high one makes the transition hard. (range = {@code 0.0F} - {@code 1.0F}) + * @param seed the seed this algorithm will use to generate pseudo random numbers. The generation will always look the same if the seed and the other parameters have the same value as in a previous generation */ public SimplexNoise(int largestFeature, double persistence, long seed) { diff --git a/src/main/java/com/generation/SimplexNoiseOctave.java b/src/main/java/com/generation/SimplexNoiseOctave.java index 7ea25f9..d792e12 100644 --- a/src/main/java/com/generation/SimplexNoiseOctave.java +++ b/src/main/java/com/generation/SimplexNoiseOctave.java @@ -45,7 +45,7 @@ public class SimplexNoiseOctave { private final short[] permMod12 = new short[LENGTH]; /** - * @param seed the seed for this octave + * @param seed the seed that this octave uses to generate pseudo random numbers */ public SimplexNoiseOctave(long seed) { @@ -201,7 +201,6 @@ public double noise(double x, double y) { * @param y Y * @param z Z * @return the noise - * @since 21.08.2018/0.2.0 */ public double noise(double x, double y, double z) { @@ -380,7 +379,6 @@ private static final class Gradient { * @param x X * @param y Y * @param z Z - * @since 21.08.2018/0.2.0 */ private Gradient(double x, double y, double z) { From 7a8191f097e85c4e976e5704a9e4475dfaa314a9 Mon Sep 17 00:00:00 2001 From: Lakshay Sharma Date: Sat, 8 Sep 2018 01:57:32 +0530 Subject: [PATCH 016/120] Negative Integer, worst case array test added --- src/test/java/com/sorts/InsertionSortTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/com/sorts/InsertionSortTest.java b/src/test/java/com/sorts/InsertionSortTest.java index 0344c2b..0d35f57 100644 --- a/src/test/java/com/sorts/InsertionSortTest.java +++ b/src/test/java/com/sorts/InsertionSortTest.java @@ -15,6 +15,18 @@ public void insertionSortTest() { Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + Integer[] unsortedInt = new Integer[]{5,4,3,2,1,0}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; + Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + + Integer[] unsortedInt = new Integer[]{-1,-2,-3,-4,-5}; + Integer[] sortedInt = new Integer[]{-5,-4,-3,-2,-1}; + Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + + Integer[] unsortedInt = new Integer[]{-1,-5,-10,-990,990,1010}; + Integer[] sortedInt = new Integer[]{-990,-10,-5,-1,990,1010}; + Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; Assert.assertArrayEquals(sortedChar, insertionSort.sort(unsortedChar)); From 4e7843b80121798da6c5dc3438b0a1737c08ef6d Mon Sep 17 00:00:00 2001 From: varunu28 Date: Sat, 8 Sep 2018 08:21:27 -0700 Subject: [PATCH 017/120] Corrected the InsertionSort test --- .gitignore | 2 +- src/test/java/com/sorts/InsertionSortTest.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index a19e87b..c2e8de7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ Java.iml .idea/* out/ -Downloads.iml +*.iml diff --git a/src/test/java/com/sorts/InsertionSortTest.java b/src/test/java/com/sorts/InsertionSortTest.java index 0d35f57..1dcc6fe 100644 --- a/src/test/java/com/sorts/InsertionSortTest.java +++ b/src/test/java/com/sorts/InsertionSortTest.java @@ -15,16 +15,16 @@ public void insertionSortTest() { Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); - Integer[] unsortedInt = new Integer[]{5,4,3,2,1,0}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; + unsortedInt = new Integer[]{5,4,3,2,1,0}; + sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); - Integer[] unsortedInt = new Integer[]{-1,-2,-3,-4,-5}; - Integer[] sortedInt = new Integer[]{-5,-4,-3,-2,-1}; + unsortedInt = new Integer[]{-1,-2,-3,-4,-5}; + sortedInt = new Integer[]{-5,-4,-3,-2,-1}; Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); - Integer[] unsortedInt = new Integer[]{-1,-5,-10,-990,990,1010}; - Integer[] sortedInt = new Integer[]{-990,-10,-5,-1,990,1010}; + unsortedInt = new Integer[]{-1,-5,-10,-990,990,1010}; + sortedInt = new Integer[]{-990,-10,-5,-1,990,1010}; Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; From 999dc93f2397e954360043fe5be21b3442ca7a1c Mon Sep 17 00:00:00 2001 From: lq Date: Sun, 9 Sep 2018 20:14:32 +0800 Subject: [PATCH 018/120] add MergeSortTest for MergeSort. --- src/main/java/com/sorts/MergeSort.java | 75 ++++++++++++++++++++++ src/test/java/com/sorts/MergeSortTest.java | 34 ++++++++++ 2 files changed, 109 insertions(+) create mode 100644 src/main/java/com/sorts/MergeSort.java create mode 100644 src/test/java/com/sorts/MergeSortTest.java diff --git a/src/main/java/com/sorts/MergeSort.java b/src/main/java/com/sorts/MergeSort.java new file mode 100644 index 0000000..3582a08 --- /dev/null +++ b/src/main/java/com/sorts/MergeSort.java @@ -0,0 +1,75 @@ +package src.main.java.com.sorts; + +public class MergeSort { + + /** + * This method implements the Generic Merge Sort + * + * @param unsorted the array which should be sorted + * @param Comparable class + * @return sorted array + */ + @SuppressWarnings("unchecked") + public > T[] sort(T[] unsorted) { + T[] tmp = (T[]) new Comparable[unsorted.length]; + doSort(unsorted, tmp, 0, unsorted.length - 1); + return unsorted; + } + + /** + * @param arr The array to be sorted + * @param temp The copy of the actual array + * @param left The first index of the array + * @param right The last index of the array + * Recursively sorts the array in increasing order + **/ + private static > void doSort(T[] arr, T[] temp, int left, int right) { + if (left < right) { + int mid = left + (right - left) / 2; + doSort(arr, temp, left, mid); + doSort(arr, temp, mid + 1, right); + merge(arr, temp, left, mid, right); + } + } + + /** + * This method implements the merge step of the merge sort + * + * @param arr The array to be sorted + * @param temp The copy of the actual array + * @param left The first index of the array + * @param mid The middle index of the array + * @param right The last index of the array + * merges two parts of an array in increasing order + **/ + private static > void merge(T[] arr, T[] temp, int left, int mid, int right) { + System.arraycopy(arr, left, temp, left, right - left + 1); + + int i = left; + int j = mid + 1; + int k = left; + + while (i <= mid && j <= right) { + if (temp[i].compareTo(temp[j]) <= 0) { + arr[k] = temp[i]; + i++; + } else { + arr[k] = temp[j]; + j++; + } + k++; + } + + while (i <= mid) { + arr[k] = temp[i]; + i++; + k++; + } + + while (j <= right) { + arr[k] = temp[j]; + j++; + k++; + } + } +} diff --git a/src/test/java/com/sorts/MergeSortTest.java b/src/test/java/com/sorts/MergeSortTest.java new file mode 100644 index 0000000..2585152 --- /dev/null +++ b/src/test/java/com/sorts/MergeSortTest.java @@ -0,0 +1,34 @@ +package src.test.java.com.sorts; + + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.sorts.MergeSort; + +public class MergeSortTest { + + @Test + public void mergeSortTest() { + MergeSort mergeSort = new MergeSort(); + + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + + unsortedInt = new Integer[]{5, 4, 3, 2, 1, 0}; + sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; + Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + + unsortedInt = new Integer[]{-1, -2, -3, -4, -5}; + sortedInt = new Integer[]{-5, -4, -3, -2, -1}; + Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + + unsortedInt = new Integer[]{-1, -5, -10, -990, 990, 1010}; + sortedInt = new Integer[]{-990, -10, -5, -1, 990, 1010}; + Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assert.assertArrayEquals(sortedChar, mergeSort.sort(unsortedChar)); + } +} From c6ce36b19bc1d47465506b6a7b0ffd808f2b80a8 Mon Sep 17 00:00:00 2001 From: Panagiotis Karapas Date: Wed, 31 Oct 2018 18:21:04 +0000 Subject: [PATCH 019/120] Added Linear Search, changed Binary search -Linear Search was added. -Made Both searches final and static ( There is no reason to have to instantiate them). Also Changed the tests to include the new static methods. -Added a new test, searching an empty array. --- src/main/java/com/search/BinarySearch.java | 10 +++--- src/main/java/com/search/LinearSearch.java | 35 +++++++++++++++++++ .../java/com/search/BinarySearchTest.java | 19 +++++----- .../java/com/search/LinearSearchTest.java | 26 ++++++++++++++ 4 files changed, 76 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/search/LinearSearch.java create mode 100644 src/test/java/com/search/LinearSearchTest.java diff --git a/src/main/java/com/search/BinarySearch.java b/src/main/java/com/search/BinarySearch.java index 20f7433..231490a 100644 --- a/src/main/java/com/search/BinarySearch.java +++ b/src/main/java/com/search/BinarySearch.java @@ -8,7 +8,7 @@ * Average performance O(log n) * Worst-case space complexity O(1) */ -public class BinarySearch { +public final class BinarySearch{ /** * @param array is an array where the element should be found @@ -16,18 +16,18 @@ public class BinarySearch { * @param is any comparable type * @return index of the element */ - public > int findIndex(T array[], T key) { + public static > int findIndex(T array[], T key) { return search(array, key, 0, array.length-1); } /** - * @param array The array to make the binary search - * @param key The number you are looking for + * @param array The array to search + * @param key The element you are looking for * @param left The lower bound * @param right The upper bound * @return the location of the key **/ - private > int search(T array[], T key, int left, int right){ + private static > int search(T array[], T key, int left, int right){ if (left > right) { return -1; // Key not found } diff --git a/src/main/java/com/search/LinearSearch.java b/src/main/java/com/search/LinearSearch.java new file mode 100644 index 0000000..e8e8e3e --- /dev/null +++ b/src/main/java/com/search/LinearSearch.java @@ -0,0 +1,35 @@ +package src.main.java.com.search; + +/** + * Linear search is an algorithm which finds the position of a target value within an array (Usually unsorted) + * + * Worst-case performance O(n) + * Best-case performance O(1) + * Average performance O(n) + * Worst-case space complexity O(1) + */ +public final class LinearSearch { + /** + * @param array is an array where the element should be found + * @param key is an element which should be found + * @param is any comparable type + * @return index of the element + */ + public static > int findIndex(T array[], T key) { + return search(array, key); + } + + /** + * @param array The array to search + * @param key The element you are looking for + * @return the location of the key or -1 if the element is not found + **/ + private static > int search(T array[], T key){ + for(int i = 0; i < array.length;i++) { + if (array[i].compareTo(key) == 0){ + return i; + } + } + return -1; + } +} diff --git a/src/test/java/com/search/BinarySearchTest.java b/src/test/java/com/search/BinarySearchTest.java index 83b2b97..0d46287 100644 --- a/src/test/java/com/search/BinarySearchTest.java +++ b/src/test/java/com/search/BinarySearchTest.java @@ -8,17 +8,18 @@ public class BinarySearchTest { @Test public void testBinarySearch() { - BinarySearch binarySearch = new BinarySearch(); - Integer[] arr1 = {1,2,3,4,5}; - Assert.assertEquals("Incorrect index", 2, binarySearch.findIndex(arr1,3)); - Assert.assertEquals("Incorrect index", 0, binarySearch.findIndex(arr1,1)); - Assert.assertEquals("Incorrect index", -1, binarySearch.findIndex(arr1,8)); - Assert.assertEquals("Incorrect index", -1, binarySearch.findIndex(arr1,-2)); + Assert.assertEquals("Incorrect index", 2, BinarySearch.findIndex(arr1,3)); + Assert.assertEquals("Incorrect index", 0, BinarySearch.findIndex(arr1,1)); + Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr1,8)); + Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr1,-2)); String[] arr2 = {"A", "B", "C", "D"}; - Assert.assertEquals("Incorrect index", 2, binarySearch.findIndex(arr2,"C")); - Assert.assertEquals("Incorrect index", 1, binarySearch.findIndex(arr2,"B")); - Assert.assertEquals("Incorrect index", -1, binarySearch.findIndex(arr2,"F")); + Assert.assertEquals("Incorrect index", 2, BinarySearch.findIndex(arr2,"C")); + Assert.assertEquals("Incorrect index", 1, BinarySearch.findIndex(arr2,"B")); + Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr2,"F")); + + String[] arr3 = {}; + Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr3, "")); } } diff --git a/src/test/java/com/search/LinearSearchTest.java b/src/test/java/com/search/LinearSearchTest.java new file mode 100644 index 0000000..ff652b4 --- /dev/null +++ b/src/test/java/com/search/LinearSearchTest.java @@ -0,0 +1,26 @@ +package src.test.java.com.search; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.search.LinearSearch; + +public class LinearSearchTest { + @Test + public void testLinearSearch() { + + Integer[] arr1 = {1,2,3,4,5}; + Assert.assertEquals("Incorrect index", 2, LinearSearch.findIndex(arr1,3)); + Assert.assertEquals("Incorrect index", 0, LinearSearch.findIndex(arr1,1)); + Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr1,8)); + Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr1,-2)); + + String[] arr2 = {"A", "B", "C", "D"}; + Assert.assertEquals("Incorrect index", 2, LinearSearch.findIndex(arr2,"C")); + Assert.assertEquals("Incorrect index", 1, LinearSearch.findIndex(arr2,"B")); + Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr2,"F")); + + String[] arr3 = {}; + Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr3, "")); + + } +} From 7281281d3393ed5c3cc2083e33c54588ad202a0f Mon Sep 17 00:00:00 2001 From: LPinto <34793298+LesliePinto89@users.noreply.github.com> Date: Sun, 4 Nov 2018 17:51:27 +0000 Subject: [PATCH 020/120] Added StoogeSort algorithm and JUnit Test --- src/main/java/com/sorts/StoogeSort.java | 39 +++++++++++++++++++++ src/test/java/com/sorts/StoogeSortTest.java | 27 ++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 src/main/java/com/sorts/StoogeSort.java create mode 100644 src/test/java/com/sorts/StoogeSortTest.java diff --git a/src/main/java/com/sorts/StoogeSort.java b/src/main/java/com/sorts/StoogeSort.java new file mode 100644 index 0000000..fe81a6d --- /dev/null +++ b/src/main/java/com/sorts/StoogeSort.java @@ -0,0 +1,39 @@ +package src.main.java.com.sorts; + +import static src.main.java.com.sorts.SortUtils.swap; +import static src.main.java.com.sorts.SortUtils.less; + +public class StoogeSort { + + /** + * This method implements recursion StoogeSort + * + * @param int[] array to store number elements + * @param f first element in the array + * @param l last element in the array + */ + public > T[] sort(T[] arr, int f, int l) { + + // Ends recursion when met + if (f >= l) + return arr; + + if (less(arr[l], arr[f])) { + swap(arr, f, l); + } + + if (l - f + 1 > 2) { + int entry = (l - f + 1) / 3; + + // Does a recursive sort of the first two thirds elements + sort(arr, f, l - entry); + + // Does a recursive sort of the last two thirds elements + sort(arr, f + entry, l); + + // Another recursive sort first two thirds elements to confirm + sort(arr, f, l - entry); + } + return arr; + } +} \ No newline at end of file diff --git a/src/test/java/com/sorts/StoogeSortTest.java b/src/test/java/com/sorts/StoogeSortTest.java new file mode 100644 index 0000000..90ddbe6 --- /dev/null +++ b/src/test/java/com/sorts/StoogeSortTest.java @@ -0,0 +1,27 @@ +package src.test.java.com.sorts; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.sorts.StoogeSort; + +public class StoogeSortTest { + + @Test + public void stoogeSortTest() { + StoogeSort stoogesort = new StoogeSort(); + + Integer unsortedArr[] = { 2, 4, 5, 3, 1 }; + Integer n = unsortedArr.length; + Integer sortedArr[] = { 1, 2, 3, 4, 5 }; + Assert.assertArrayEquals(sortedArr, stoogesort.sort(unsortedArr, 0, n - 1)); + + unsortedArr = new Integer[] { -22, -34, -25, -53, -11 }; + sortedArr = new Integer[] { -53, -34, -25, -22, -11 }; + Assert.assertArrayEquals(sortedArr, stoogesort.sort(unsortedArr, 0, n - 1)); + + Character[] unsortedCharArr = new Character[] { 'a', 'r', 'd', 'k', 'p' }; + n = unsortedCharArr.length; + Character[] sortedCharArr = new Character[] { 'a', 'd', 'k', 'p', 'r' }; + Assert.assertArrayEquals(sortedCharArr, stoogesort.sort(unsortedCharArr, 0, n - 1)); + } +} \ No newline at end of file From c0ca53743a1bf30bc69ea31a3873285e921f4a64 Mon Sep 17 00:00:00 2001 From: LPinto <34793298+LesliePinto89@users.noreply.github.com> Date: Sat, 17 Nov 2018 23:25:33 +0000 Subject: [PATCH 021/120] Added Interpolation Search and JUnit test. --- .../java/com/search/InterpolationSearch.java | 60 +++++++++++++++++++ .../com/search/InterpolationSearchTest.java | 29 +++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/main/java/com/search/InterpolationSearch.java create mode 100644 src/test/java/com/search/InterpolationSearchTest.java diff --git a/src/main/java/com/search/InterpolationSearch.java b/src/main/java/com/search/InterpolationSearch.java new file mode 100644 index 0000000..4db1e3a --- /dev/null +++ b/src/main/java/com/search/InterpolationSearch.java @@ -0,0 +1,60 @@ +package src.main.java.com.search; + +public class InterpolationSearch { + + /** + * A linear interpolation search algorithm that finds the position of a + * target value in an sorted array using its lowest value and highest value. + * + * Average time-complexity O(log log n) - uniformly distributed. + * Worst-case time-complexity O(n) - non-uniformly distributed + * Worst-case space complexity O(1) + * + * @param This is any comparable type + * @param arr This is the array where the element should be found + * @param key This is the element to find in the array + * @return The index of the key in the array + */ + public > int findIndex(T arr[], T key) { + return checkCondition(arr, key, 0, arr.length - 1); + } + + /** + * @param lowIndex The first and smallest element in the sorted array + * @param highIndex The last and largest element in the sorted array + * @return The found key's index in the array through iteration + */ + private > int checkCondition(T arr[], T key, int lowIndex, int highIndex) { + boolean conditionOne = lowIndex <= highIndex && key.compareTo(arr[lowIndex]) >= 0; + boolean conditionTwo = key.compareTo(arr[lowIndex]) == 0 && key.compareTo(arr[highIndex]) <= 0; + while (conditionOne || conditionTwo) { + int position = getPostion(arr, key, lowIndex, highIndex); + if (arr[position].equals(key)) + return position; + + if (arr[position].compareTo(key) < 0) + lowIndex = position + 1; + else + highIndex = position - 1; + } + return -1; + } + + /** + * @return The array's current retrieved index position + */ + private int getPostion(T arr[], T key, int lowIndex, int highIndex) { + String startValueString = arr[lowIndex].toString(); //First convert array element to String + int startValueInt = Integer.parseInt(startValueString); //Convert String to int to computate later + String endValueString = arr[highIndex].toString(); + int endValueInt = Integer.parseInt(endValueString); + String keyValueString = key.toString(); //Repeat for key to later computate + int keyValueInt = Integer.parseInt(keyValueString); + + int arrayIndexRangeDiff = highIndex - lowIndex; + int arrayHighLowValuesDiff = endValueInt - startValueInt; + int keyMinusArrayLowValue = keyValueInt - startValueInt; + int position = lowIndex + (((arrayIndexRangeDiff) / (arrayHighLowValuesDiff) * (keyMinusArrayLowValue))); + return position; + } +} \ No newline at end of file diff --git a/src/test/java/com/search/InterpolationSearchTest.java b/src/test/java/com/search/InterpolationSearchTest.java new file mode 100644 index 0000000..c3a9831 --- /dev/null +++ b/src/test/java/com/search/InterpolationSearchTest.java @@ -0,0 +1,29 @@ +package src.test.java.com.search; + +import org.junit.Assert; +import org.junit.Test; + +import src.main.java.com.search.InterpolationSearch; + +public class InterpolationSearchTest { + + @Test + public void testInterpolationSearch() { + InterpolationSearch interpolationSearch = new InterpolationSearch(); + + Integer arr[] = {10, 12, 13, 16, 18, 19, 21}; + int x = 18; + int index = interpolationSearch.findIndex(arr, x); + Assert.assertEquals("Incorrect index", 4, index); + + Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100}; + x = -190; + index = interpolationSearch.findIndex(arrTwo, x); + Assert.assertEquals("Incorrect index", 1, index); + + String arrString[] = {"10", "12", "13", "16", "22", "25","29"}; + String stringX = "13"; + index = interpolationSearch.findIndex(arrString, stringX); + Assert.assertEquals("Incorrect index", 2, index); + } +} \ No newline at end of file From 6dcbaca7748fa09a00351ba156dffd5d0551aa46 Mon Sep 17 00:00:00 2001 From: LPinto <34793298+LesliePinto89@users.noreply.github.com> Date: Wed, 5 Dec 2018 00:11:08 +0000 Subject: [PATCH 022/120] Added Jump Search algorithm and JUnit test --- src/main/java/com/search/JumpSearch.java | 84 ++++++++++++++++++++ src/test/java/com/search/JumpSearchTest.java | 29 +++++++ 2 files changed, 113 insertions(+) create mode 100644 src/main/java/com/search/JumpSearch.java create mode 100644 src/test/java/com/search/JumpSearchTest.java diff --git a/src/main/java/com/search/JumpSearch.java b/src/main/java/com/search/JumpSearch.java new file mode 100644 index 0000000..949619e --- /dev/null +++ b/src/main/java/com/search/JumpSearch.java @@ -0,0 +1,84 @@ +package src.main.java.com.search; + +public class JumpSearch { + + /** + * A jump search algorithm that finds the position of a key by moving over + * fixed block ranges in a sorted array, and linear searches back on itself to + * find it. + * + * Worst case time complexity: O(N^(1/2)) - square root n + * Average case time complexity: O(N^(1/2)) - square root n + * Worst case Space complexity: O(1) + * + * @param This is any comparable type + * @param arr This is the array where the element should be found + * @param key This is the element to find in the array + * @return The index of the key in the array + */ + public > int findIndex(T arr[], T key) { + return checkCondition(arr, key, arr.length); + } + + /** + * @param arrLength The array's length + * @return The index position of the key in the array + */ + public > int checkCondition(T arr[], T key, int arrLength) { + int step = (int) Math.floor(Math.sqrt(arrLength)); // Find jump block + int previous = 0; // Find block where element is / or not present + + // Use ternary operator to find if step or array length is min value + // and then minus the min value by one + int minVal = (step < arrLength) ? step - 1 : arrLength - 1; + + String arrayMinValIndexString = arr[minVal].toString(); + int arrayMinValIndexInt = Integer.parseInt(arrayMinValIndexString); + String keyValueString = key.toString(); + int keyValueInt = Integer.parseInt(keyValueString); + + // Increment next step and previous step in block to find range block + while (arrayMinValIndexInt < keyValueInt) { + previous = step; + step += (int) Math.floor(Math.sqrt(arrLength)); + if (previous >= arrLength) + return -1; + minVal = (step < arrLength) ? step - 1 : arrLength - 1; + arrayMinValIndexString = arr[minVal].toString(); + arrayMinValIndexInt = Integer.parseInt(arrayMinValIndexString); + } + // Get key position in linear search + int position = linearSearchBlock(arr, key, step, previous, keyValueInt, arrLength, minVal); + return position; + } + + /** + * @param step The next block index in the array + * @param previous The previous block index in the array + * @param keyValueInt The key in the format of an integer + * @param minVal The minimum value of either next step or array length + * @return The index position of the key in the array + */ + public > int linearSearchBlock(T arr[], T key, int step, int previous, int keyValueInt, + int arrLength, int minVal) { + + // Linear search starting from previous block forwards. + String arrayPositionString = arr[previous].toString(); + int arrayPositionValue = Integer.parseInt(arrayPositionString); + while (arrayPositionValue < keyValueInt) { + // If in next block or end of array length, key not in array + if (previous == minVal) + return -1; + previous++; + // Update arrayPositionValue in iteration + minVal = (step < arrLength) ? step - 1 : arrLength - 1; + arrayPositionString = arr[previous].toString(); + arrayPositionValue = Integer.parseInt(arrayPositionString); + + } + // If the key is found + if (arrayPositionValue == keyValueInt) + return previous; + return -1; + } +} \ No newline at end of file diff --git a/src/test/java/com/search/JumpSearchTest.java b/src/test/java/com/search/JumpSearchTest.java new file mode 100644 index 0000000..6587107 --- /dev/null +++ b/src/test/java/com/search/JumpSearchTest.java @@ -0,0 +1,29 @@ +package src.test.java.com.search; + +import org.junit.Test; +import org.junit.Assert; + +import src.main.java.com.search.JumpSearch; + +public class JumpSearchTest { + + @Test + public void testJumpSearch() { + JumpSearch jumpSearch = new JumpSearch(); + + Integer arr[] = {11, 15, 16, 29, 36, 40, 42, 52}; + int x = 36; + int index = jumpSearch.findIndex(arr, x); + Assert.assertEquals("Incorrect index", 4, index); + + Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100}; + x = -120; + index = jumpSearch.findIndex(arrTwo, x); + Assert.assertEquals("Incorrect index", 5, index); + + String arrString[] = {"101", "122", "136", "165", "225", "251","291"}; + String stringX = "122"; + index = jumpSearch.findIndex(arrString, stringX); + Assert.assertEquals("Incorrect index", 1, index); + } +} \ No newline at end of file From e15d329c715fcd3ca67a921f9dca108aa126236b Mon Sep 17 00:00:00 2001 From: Anirudh Sharma Date: Wed, 2 Jan 2019 12:31:54 +0530 Subject: [PATCH 023/120] Added algorithm class CountingSort and its corresponding test class CountingSortTest --- .../src/main/java/com/sorts/CountingSort.java | 52 +++++++++++++++++++ .../test/java/com/sorts/CountingSortTest.java | 23 ++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/main/java/src/main/java/com/sorts/CountingSort.java create mode 100644 src/test/java/src/test/java/com/sorts/CountingSortTest.java diff --git a/src/main/java/src/main/java/com/sorts/CountingSort.java b/src/main/java/src/main/java/com/sorts/CountingSort.java new file mode 100644 index 0000000..e742b61 --- /dev/null +++ b/src/main/java/src/main/java/com/sorts/CountingSort.java @@ -0,0 +1,52 @@ +package src.main.java.com.sorts; + +public class CountingSort { + + /** + * This method sorts the array using counting sort technique + * + * @param arr The array to be sorted + * @return arr Sorted array + */ + public Integer[] sort(Integer[] arr) { + + // Finding the maximum element in the array + int max = arr[0]; + for (int i = 1; i < arr.length; i++) { + max = Math.max(max, arr[i]); + } + + // Creating the count array - This method will store the count of each element in the unsorted array + int[] count = new int[max + 1]; + + // This loop will store the count of each element in the array + for (int i = 0; i < max; i++) { + + count[arr[i]]++; + } + + // This loop will replace the ith index of the count array with the sum of values at the ith and (i-1) index + for (int i = 1; i < count.length; i++) { + + count[i] = count[i] + count[i - 1]; + } + + // This array will store the sorted array + Integer[] places = new Integer[arr.length]; + + // This loop will put the ith element at is correct position in the places array + for (int i = 0; i < places.length; i++) { + + // Getting the value of the index - the value at the oount array index will be replaced by the value + // in the original array + int index = arr[i]; + places[count[index] - 1] = index; + count[index]--; + } + + // Copy the places array back to the original array - which will be sorted + System.arraycopy(places, 0, arr, 0, arr.length); + + return arr; + } +} diff --git a/src/test/java/src/test/java/com/sorts/CountingSortTest.java b/src/test/java/src/test/java/com/sorts/CountingSortTest.java new file mode 100644 index 0000000..d852e58 --- /dev/null +++ b/src/test/java/src/test/java/com/sorts/CountingSortTest.java @@ -0,0 +1,23 @@ +package src.test.java.com.sorts; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.sorts.CountingSort; + +public class CountingSortTest { + + @Test + public void testCountingSort() { + + CountingSort countingSort = new CountingSort(); + + // Unsorted integer array + Integer[] unsorted = new Integer[]{1, 4, 1, 2, 7, 5, 2}; + + // Sorted integer array + Integer[] sorted = new Integer[]{1, 1, 2, 2, 4, 5, 7}; + + // Comparing the two integer arrays + Assert.assertArrayEquals(sorted, countingSort.sort(unsorted)); + } +} From 9763b6df89d061dd7db3a5eee50eae50828f2b06 Mon Sep 17 00:00:00 2001 From: Anirudh Sharma Date: Wed, 2 Jan 2019 12:55:40 +0530 Subject: [PATCH 024/120] Added algorithm class CycleSort and its corresponding test class CycleSortTest --- .../src/main/java/com/sorts/CycleSort.java | 87 +++++++++++++++++++ .../test/java/com/sorts/CycleSortTest.java | 35 ++++++++ 2 files changed, 122 insertions(+) create mode 100644 src/main/java/src/main/java/com/sorts/CycleSort.java create mode 100644 src/test/java/src/test/java/com/sorts/CycleSortTest.java diff --git a/src/main/java/src/main/java/com/sorts/CycleSort.java b/src/main/java/src/main/java/com/sorts/CycleSort.java new file mode 100644 index 0000000..5804a7b --- /dev/null +++ b/src/main/java/src/main/java/com/sorts/CycleSort.java @@ -0,0 +1,87 @@ +package src.main.java.com.sorts; + +public class CycleSort { + + /** + * @param arr Array to be sorted + * @param Generic type + * @return arr Sorted array + */ + public > T[] sort(T[] arr) { + + int n = arr.length; + + // Counter for the number of memory writes + int count = 0; + + // Traverse array and put the elements on their respective right places + for (int i = 0; i < n - 2; i++) { + + // Initialize item as the starting point + T item = arr[i]; + + // Find the position where we want to put the item + // Basically we count all the smaller elements to the right of the item + int position = i; + + for (int j = i + 1; j < n; j++) { + if (arr[j].compareTo(item) < 0) { + position++; + } + } + + // Check if the element is already at the correct position... + if (position == i) { + + // .. then we do not have to do anything + continue; + } + + // Ignore duplicate elements + while (item == arr[position]) { + position++; + } + + // Put the elements at its right position + if (position != i) { + + // Swap + T temp = item; + item = arr[position]; + arr[position] = temp; + + count++; + } + + // Rotate remaining cycle + while (position != i) { + position = i; + + // Find the position where we put the element + for (int j = i + 1; j < n; j++) { + if (arr[j].compareTo(item) < 0) { + position++; + } + } + + // Ignore duplicate elements + while (item == arr[position]) { + position++; + } + + // Put the element to its correct position + if (item != arr[position]) { + T temp = arr[position]; + arr[position] = item; + item = temp; + + count++; + } + } + } + + System.out.println("Number of memory writes :: " + count); + + return arr; + } +} diff --git a/src/test/java/src/test/java/com/sorts/CycleSortTest.java b/src/test/java/src/test/java/com/sorts/CycleSortTest.java new file mode 100644 index 0000000..4e12125 --- /dev/null +++ b/src/test/java/src/test/java/com/sorts/CycleSortTest.java @@ -0,0 +1,35 @@ +package src.test.java.com.sorts; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.sorts.CycleSort; + +public class CycleSortTest { + + @Test + public void cycleSortIntegerTest() { + + CycleSort cycleSort = new CycleSort(); + + // Test case for integers + Integer[] unsortedInt = new Integer[]{5, 1, 7, 0, 2, 9, 6, 3, 4, 8}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assert.assertArrayEquals(sortedInt, cycleSort.sort(unsortedInt)); + + // Test case for floating point numbers + Float[] unsortedFloat = new Float[]{6.7f, 21.1f, 0.9f, -3.2f, 5.9f, -21.3f}; + Float[] sortedFloat = new Float[]{-21.3f, -3.2f, 0.9f, 5.9f, 6.7f, 21.1f}; + Assert.assertArrayEquals(sortedFloat, cycleSort.sort(unsortedFloat)); + + // Test case for characters + Character[] unsortedChar = new Character[]{'c', 'a', 'b', 'A', 'C', 'B'}; + Character[] sortedChar = new Character[]{'A', 'B', 'C', 'a', 'b', 'c'}; + Assert.assertArrayEquals(sortedChar, cycleSort.sort(unsortedChar)); + + // Test case for Strings + String[] unsortedStr = new String[]{"Edward", "Linus", "David", "Alan", "Dennis", "Robert", "Ken"}; + String[] sortedStr = new String[]{"Alan", "David", "Dennis", "Edward", "Ken", "Linus", "Robert"}; + Assert.assertArrayEquals(sortedStr, cycleSort.sort(unsortedStr)); + + } +} From c22449acc5edc9b55f73158ea40c54002ea54363 Mon Sep 17 00:00:00 2001 From: Anirudh Sharma Date: Wed, 2 Jan 2019 19:37:43 +0530 Subject: [PATCH 025/120] Fixed the CountingSort to incorporate negative values by adding offset --- .../src/main/java/com/sorts/CountingSort.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/src/main/java/com/sorts/CountingSort.java b/src/main/java/src/main/java/com/sorts/CountingSort.java index e742b61..987700e 100644 --- a/src/main/java/src/main/java/com/sorts/CountingSort.java +++ b/src/main/java/src/main/java/com/sorts/CountingSort.java @@ -16,13 +16,18 @@ public Integer[] sort(Integer[] arr) { max = Math.max(max, arr[i]); } + // Finding the minimum element in the array + int min = arr[0]; + for (int i = 1; i < arr.length; i++) { + min = Math.min(min, arr[i]); + } + // Creating the count array - This method will store the count of each element in the unsorted array - int[] count = new int[max + 1]; + int[] count = new int[max - min + 1]; // This loop will store the count of each element in the array - for (int i = 0; i < max; i++) { - - count[arr[i]]++; + for (Integer integer : arr) { + count[integer - min]++; } // This loop will replace the ith index of the count array with the sum of values at the ith and (i-1) index @@ -40,8 +45,8 @@ public Integer[] sort(Integer[] arr) { // Getting the value of the index - the value at the oount array index will be replaced by the value // in the original array int index = arr[i]; - places[count[index] - 1] = index; - count[index]--; + places[count[index - min] - 1] = index; + count[index - min]--; } // Copy the places array back to the original array - which will be sorted From 005380f538e930bd8d45197f447ccfba0042a9e8 Mon Sep 17 00:00:00 2001 From: Anirudh Sharma Date: Fri, 4 Jan 2019 12:29:42 +0530 Subject: [PATCH 026/120] Added Pigeonhole Sort with its corresponding test cases --- .../main/java/com/sorts/PigeonholeSort.java | 61 +++++++++++++++++++ .../java/com/sorts/PigeonholeSortTest.java | 25 ++++++++ 2 files changed, 86 insertions(+) create mode 100644 src/main/java/src/main/java/com/sorts/PigeonholeSort.java create mode 100644 src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java diff --git a/src/main/java/src/main/java/com/sorts/PigeonholeSort.java b/src/main/java/src/main/java/com/sorts/PigeonholeSort.java new file mode 100644 index 0000000..2d11938 --- /dev/null +++ b/src/main/java/src/main/java/com/sorts/PigeonholeSort.java @@ -0,0 +1,61 @@ +package src.main.java.com.sorts; + +public class PigeonholeSort { + + /** + * This method sorts the array using Pigeonhole sort technique. + *

+ * Pigeonhole sorting is a sorting algorithms that is suitable for sorting lists of elements where the number + * of elements and the number of possible key values are approximately the same. + *

+ * It requires O(n + Range) time where n is number of elements in input array and ‘Range’ is number of possible + * values in array. + * + * @param arr The array to be sorted + * @return arr Sorted array + */ + public Integer[] sort(Integer[] arr) { + + // Find maximum and minimum elements in array + int min = arr[0]; + int max = arr[0]; + + for (Integer integer : arr) { + + // For minimum value + if (min > integer) { + min = integer; + } + + // For maximum value + if (max < integer) { + max = integer; + } + } + + // Range + int range = max - min + 1; + + // Pigeonhole array + int[] pigeonholes = new int[range]; + + // Put each element of arr in its pigeonhole + for (Integer integer : arr) { + pigeonholes[integer - min] = integer; + } + + // Index for the arr + int index = 0; + + // Loop over pigeonhole array + for (int pigeonhole : pigeonholes) { + + // Put non zero elements from the pigeonhole array to the current element of arr + if (pigeonhole != 0) { + arr[index++] = pigeonhole; + } + } + + return arr; + } +} diff --git a/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java b/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java new file mode 100644 index 0000000..cc16353 --- /dev/null +++ b/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java @@ -0,0 +1,25 @@ +package src.test.java.com.sorts; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.sorts.PigeonholeSort; + +public class PigeonholeSortTest { + + @Test + public void testPigeonholeSort() { + + PigeonholeSort pigeonholeSort = new PigeonholeSort(); + + // Test Case 1 + Integer[] unsorted1 = new Integer[]{5, 1, 7, 2, 9, 6, 3, 4, 8}; + Integer[] sorted1 = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assert.assertArrayEquals(sorted1, pigeonholeSort.sort(unsorted1)); + + // Test Case 2 + Integer[] unsorted2 = new Integer[]{-5, 1, 7, 2, -9, 6, -3, 4, 8}; + Integer[] sorted2 = new Integer[]{-9, -5, -3, 1, 2, 4, 6, 7, 8}; + Assert.assertArrayEquals(sorted2, pigeonholeSort.sort(unsorted2)); + + } +} From 9fe55c82d8aec9cbae37c7599c582aa88a43434b Mon Sep 17 00:00:00 2001 From: Anirudh Sharma Date: Fri, 4 Jan 2019 17:59:20 +0530 Subject: [PATCH 027/120] Added Pigeonhole Sort with its corresponding test cases --- .../src/main/java/com/sorts/PigeonholeSort.java | 17 ++++++++++------- .../test/java/com/sorts/PigeonholeSortTest.java | 5 +++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/src/main/java/com/sorts/PigeonholeSort.java b/src/main/java/src/main/java/com/sorts/PigeonholeSort.java index 2d11938..6b77050 100644 --- a/src/main/java/src/main/java/com/sorts/PigeonholeSort.java +++ b/src/main/java/src/main/java/com/sorts/PigeonholeSort.java @@ -41,18 +41,21 @@ public Integer[] sort(Integer[] arr) { // Put each element of arr in its pigeonhole for (Integer integer : arr) { - pigeonholes[integer - min] = integer; + // This increment operation will count for the duplicates elements, if present + pigeonholes[integer - min]++; } - // Index for the arr + // Index for the original array int index = 0; // Loop over pigeonhole array - for (int pigeonhole : pigeonholes) { - - // Put non zero elements from the pigeonhole array to the current element of arr - if (pigeonhole != 0) { - arr[index++] = pigeonhole; + for (int i = 0; i < range; i++) { + // This inner loop will execute only for those indexes in + // pigeonhole which are greater than zero i.e., only for those + // elements which are present in the original array. This also + // takes care of the duplicate elements + while (pigeonholes[i]-- > 0) { + arr[index++] = i + min; } } diff --git a/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java b/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java index cc16353..5195fc5 100644 --- a/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java +++ b/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java @@ -21,5 +21,10 @@ public void testPigeonholeSort() { Integer[] sorted2 = new Integer[]{-9, -5, -3, 1, 2, 4, 6, 7, 8}; Assert.assertArrayEquals(sorted2, pigeonholeSort.sort(unsorted2)); + // Test Case 3 + Integer[] unsorted3 = new Integer[]{-5, 1, 7, 2, -9, 6, -3, 4, 1, 8, 1, 1}; + Integer[] sorted3 = new Integer[]{-9, -5, -3, 1, 1, 1, 1, 2, 4, 6, 7, 8}; + Assert.assertArrayEquals(sorted3, pigeonholeSort.sort(unsorted3)); + } } From 1274140ea369fcf1a806bec99a495cb93220bf4a Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Fri, 4 Jan 2019 20:38:49 +0800 Subject: [PATCH 028/120] Update PigeonholeSort.java --- .../src/main/java/com/sorts/PigeonholeSort.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/src/main/java/com/sorts/PigeonholeSort.java b/src/main/java/src/main/java/com/sorts/PigeonholeSort.java index 6b77050..1f8b498 100644 --- a/src/main/java/src/main/java/com/sorts/PigeonholeSort.java +++ b/src/main/java/src/main/java/com/sorts/PigeonholeSort.java @@ -17,20 +17,12 @@ public class PigeonholeSort { public Integer[] sort(Integer[] arr) { // Find maximum and minimum elements in array - int min = arr[0]; - int max = arr[0]; + int min = Integer.MAX_VALUE; + int max = Integer.MIN_VALUE; for (Integer integer : arr) { - - // For minimum value - if (min > integer) { - min = integer; - } - - // For maximum value - if (max < integer) { - max = integer; - } + min = Math.min(min, integer); + max = Math.max(max, integer); } // Range From 2e618c86a0f3923c717625faaa5b4801db08d2d3 Mon Sep 17 00:00:00 2001 From: darius-welsch/ Date: Fri, 4 Jan 2019 22:48:29 +0100 Subject: [PATCH 029/120] Add the Secure Hash Algorithm 2 family, namely SHA-224, SHA-256, SHA-384 and SHA-512 --- src/main/java/com/crypto/hash/Sha2.java | 399 ++++++++++++++++++++ src/test/java/com/crypto/hash/Sha2Test.java | 191 ++++++++++ 2 files changed, 590 insertions(+) create mode 100644 src/main/java/com/crypto/hash/Sha2.java create mode 100644 src/test/java/com/crypto/hash/Sha2Test.java diff --git a/src/main/java/com/crypto/hash/Sha2.java b/src/main/java/com/crypto/hash/Sha2.java new file mode 100644 index 0000000..d6c717c --- /dev/null +++ b/src/main/java/com/crypto/hash/Sha2.java @@ -0,0 +1,399 @@ +package src.main.java.com.crypto.hash; + +import java.nio.ByteBuffer; + +/** + *

This class implements the Secure Hash Algorithm 2 family, namely SHA-224, + * SHA-256, SHA-384 and SHA-512. These algorithms produce a compressed + * representation with fixed length of any message provided by the user. + * The result is called a message digest. Any change to the message will + * result in a different message digest. + *

SHA-2 has many possible areas of application. For example, someone + * can determine if a file was manipulated, by comparing the message digest + * of the original file with the message digest of the file in question. + * Another example is the use of SHA-256 in the Proof-of-work algorithm of Bitcoin. + * + * This implementation is based on the RFC 6234 specification. The original + * specification of SHA-2 is defined in FIPS PUB 180-4. Due to the U.S. + * government shutdown by the end of 2018 the original specification was offline. + * + * @see RFC 6234 + * @see FIPS PUB 180-4 + */ +public final class Sha2 { + + /** + *

Returns a SHA-224 message digest with a fixed length of 224 bit (28 byte). + * By specification, the user-provided data can have a length of 0 <= L < 2^61 byte. + * The JVM, though, allows an array with a maximum length of approximately + * Integer.MAX_VALUE.

+ * @param data the data/message to be digested + * @return the message digest with a fixed length of 224 bit (28 byte) + */ + public static String SHA224(byte[] data) { + final int[] initialHash = { + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + }; + + int[] finalHash = digest(data, initialHash); + + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < finalHash.length-1; i++) { + builder.append(String.format("%1$08x", finalHash[i])); + } + + return builder.toString(); + } + + /** + *

Returns a SHA-256 message digest with a fixed length of 256 bit (32 byte).

+ * @param data the data/message to be digested + * @return the message digest with a fixed length of 256 bit (32 byte) + * @see src.main.java.com.crypto.hash.Sha2#SHA224(byte[]) SHA224() + */ + public static String SHA256(byte[] data) { + final int[] initialHash = { + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + }; + + int[] finalHash = digest(data, initialHash); + + StringBuilder builder = new StringBuilder(); + for (int aFinalHash : finalHash) { + builder.append(String.format("%1$08x", aFinalHash)); + } + + return builder.toString(); + } + + /** + *

Returns a SHA-384 message digest with a fixed length of 384 bit (48 byte). + * By specification, the user-provided data can have a length of 0 <= L < 2^125 byte. + * The JVM, though, allows an array with a maximum length of approximately + * Integer.MAX_VALUE.

+ * @param data the data/message to be digested + * @return the message digest with a fixed length of 384 bit (48 byte) + */ + public static String SHA384(byte[] data) { + final long[] initialHash = { + 0xcbbb9d5dc1059ed8L, 0x629a292a367cd507L, 0x9159015a3070dd17L, 0x152fecd8f70e5939L, + 0x67332667ffc00b31L, 0x8eb44a8768581511L, 0xdb0c2e0d64f98fa7L, 0x47b5481dbefa4fa4L + }; + + long[] finalHash = digest(data, initialHash); + + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < finalHash.length-2; i++) { + builder.append(String.format("%1$016x", finalHash[i])); + } + + return builder.toString(); + } + + /** + *

Returns a SHA-512 message digest with a fixed length of 512 bit (64 byte).

+ * @param data the data/message to be digested + * @return the message digest with a fixed length of 512 bit (64 byte) + * @see src.main.java.com.crypto.hash.Sha2#SHA384(byte[]) SHA384() + */ + public static String SHA512(byte[] data) { + final long[] initialHash = { + 0x6a09e667f3bcc908L, 0xbb67ae8584caa73bL, 0x3c6ef372fe94f82bL, 0xa54ff53a5f1d36f1L, + 0x510e527fade682d1L, 0x9b05688c2b3e6c1fL, 0x1f83d9abfb41bd6bL, 0x5be0cd19137e2179L + }; + + long[] finalHash = digest(data, initialHash); + + StringBuilder builder = new StringBuilder(); + for (long aFinalHash : finalHash) { + builder.append(String.format("%1$016x", aFinalHash)); + } + return builder.toString(); + } + + + /** + *

Returns an integer array, which holds the raw message digest.

+ *

This method is wrapped by SHA224() and SHA256(). Both algorithms differ + * only in two points: the initialization hashes are different and for SHA-224 + * the raw message digest is truncated by 1 byte.

+ * @param data the data/message to be digested + * @param hash the initial hash value, which in the process gets used + * for the intermediate hashes + * @return the raw message digest + */ + private static int[] digest(byte[] data, int[] hash) { + if (data == null) { + throw new IllegalArgumentException("data must not be null"); + } + + byte[] padding = pad(data, 64); + + ByteBuffer buffer = ByteBuffer.allocate(data.length + padding.length); + buffer.put(data).put(padding); + buffer.rewind(); + + while (buffer.hasRemaining()) { + int[] messageBlock = new int[16]; + for (int i = 0; i < 16; i++) { + messageBlock[i] = buffer.getInt(); + } + hashBlock(messageBlock, hash); + } + + return hash; + } + + /** + *

Returns an integer array, which holds the raw message digest.

+ *

This method is wrapped by SHA384() and SHA512(). Both algorithms differ + * only in two points: the initialization hashes are different and for SHA-384 + * the raw message digest is truncated by 2 byte.

+ * @param data the data/message to be digested + * @param hash the initial hash value, which in the process gets used + * for the intermediate hashes + * @return the raw message digest + */ + private static long[] digest(byte[] data, long[] hash) { + if (data == null) { + throw new IllegalArgumentException("data must not be null"); + } + + byte[] padding = pad(data, 128); + + ByteBuffer buffer = ByteBuffer.allocate(data.length + padding.length); + buffer.put(data).put(padding); + buffer.rewind(); + + while (buffer.hasRemaining()) { + long[] messageBlock = new long[16]; + for (int i = 0; i < 16; i++) { + messageBlock[i] = buffer.getLong(); + } + hashBlock(messageBlock, hash); + } + + return hash; + } + + /** + *

Pads the user-provided data.

+ * @param data the data/message to be digested + * @param blockSize the size of a data block (64 or 128 byte) + * @return the padding for the data + * @see RFC 6234 - Message padding + */ + private static byte[] pad(byte[] data, int blockSize) { + byte[] padding; + int lastBlockLength = data.length % blockSize; + if (lastBlockLength + 1 > (blockSize / 8) * 7) { + padding = new byte[blockSize*2 - lastBlockLength]; + } else { + padding = new byte[blockSize - lastBlockLength]; + } + + ByteBuffer buffer = ByteBuffer.wrap(padding); + buffer.put((byte) 0b1000_0000); + while (buffer.position() < buffer.capacity() - 8) { + buffer.put((byte) 0); + } + buffer.putLong((long) data.length * 8); + + return padding; + } + + /** + * Scrambles data blocks in a deterministic way. + * @param dataBlock the data blocks to be scrambled + * @param hash the resulting hash + * @see SHA-224 and SHA-256 Processing + */ + private static void hashBlock(int[] dataBlock, int[] hash) { + int[] W = new int[64]; + int[] reg = new int[8]; + int temp1; + int temp2; + + // Prepare the message schedule W + for (int i = 0; i < 16; i++) { + W[i] = dataBlock[i]; + } + for (int i = 16; i < 64; i++) { + W[i] = SSIG1(W[i-2]) + W[i-7] + SSIG0(W[i-15]) + W[i-16]; + } + + // Initialize the working variables + for (int i = 0; i < 8; i++) { + reg[i] = hash[i]; + } + + // Perform the main hash computation + for (int i = 0; i < 64; i++) { + temp1 = reg[7] + BSIG1(reg[4]) + CH(reg[4], reg[5], reg[6]) + K_int[i] + W[i]; + temp2 = BSIG0(reg[0]) + MAJ(reg[0], reg[1], reg[2]); + reg[7] = reg[6]; + reg[6] = reg[5]; + reg[5] = reg[4]; + reg[4] = reg[3] + temp1; + reg[3] = reg[2]; + reg[2] = reg[1]; + reg[1] = reg[0]; + reg[0] = temp1 + temp2; + } + + // Compute the intermediate hash value H(i) + for (int i = 0; i < 8; i++) { + hash[i] = reg[i] + hash[i]; + } + } + + /** + * Scrambles data blocks in a deterministic way. + * @param dataBlock the data blocks to be scrambled + * @param hash the resulting hash + * @see SHA-384 and SHA-512 Processing + */ + private static void hashBlock(long[] dataBlock, long[] hash) { + long[] W = new long[80]; + long[] reg = new long[8]; + long temp1; + long temp2; + + // Prepare the message schedule W + for (int i = 0; i < 16; i++) { + W[i] = dataBlock[i]; + } + for (int i = 16; i < 80; i++) { + W[i] = SSIG1(W[i-2]) + W[i-7] + SSIG0(W[i-15]) + W[i-16]; + } + + // Initialize the working variables + for (int i = 0; i < 8; i++) { + reg[i] = hash[i]; + } + + // Perform the main hash computation + for (int i = 0; i < 80; i++) { + temp1 = reg[7] + BSIG1(reg[4]) + CH(reg[4], reg[5], reg[6]) + K_long[i] + W[i]; + temp2 = BSIG0(reg[0]) + MAJ(reg[0], reg[1], reg[2]); + reg[7] = reg[6]; + reg[6] = reg[5]; + reg[5] = reg[4]; + reg[4] = reg[3] + temp1; + reg[3] = reg[2]; + reg[2] = reg[1]; + reg[1] = reg[0]; + reg[0] = temp1 + temp2; + } + + // Compute the intermediate hash value H(i) + for (int i = 0; i < 8; i++) { + hash[i] = reg[i] + hash[i]; + } + } + + /* + * Functions and Constants used + * https://tools.ietf.org/html/rfc6234#section-5 + */ + + private static final int[] K_int = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 + }; + + private static final long[] K_long = { + 0x428a2f98d728ae22L, 0x7137449123ef65cdL, 0xb5c0fbcfec4d3b2fL, 0xe9b5dba58189dbbcL, + 0x3956c25bf348b538L, 0x59f111f1b605d019L, 0x923f82a4af194f9bL, 0xab1c5ed5da6d8118L, + 0xd807aa98a3030242L, 0x12835b0145706fbeL, 0x243185be4ee4b28cL, 0x550c7dc3d5ffb4e2L, + 0x72be5d74f27b896fL, 0x80deb1fe3b1696b1L, 0x9bdc06a725c71235L, 0xc19bf174cf692694L, + 0xe49b69c19ef14ad2L, 0xefbe4786384f25e3L, 0x0fc19dc68b8cd5b5L, 0x240ca1cc77ac9c65L, + 0x2de92c6f592b0275L, 0x4a7484aa6ea6e483L, 0x5cb0a9dcbd41fbd4L, 0x76f988da831153b5L, + 0x983e5152ee66dfabL, 0xa831c66d2db43210L, 0xb00327c898fb213fL, 0xbf597fc7beef0ee4L, + 0xc6e00bf33da88fc2L, 0xd5a79147930aa725L, 0x06ca6351e003826fL, 0x142929670a0e6e70L, + 0x27b70a8546d22ffcL, 0x2e1b21385c26c926L, 0x4d2c6dfc5ac42aedL, 0x53380d139d95b3dfL, + 0x650a73548baf63deL, 0x766a0abb3c77b2a8L, 0x81c2c92e47edaee6L, 0x92722c851482353bL, + 0xa2bfe8a14cf10364L, 0xa81a664bbc423001L, 0xc24b8b70d0f89791L, 0xc76c51a30654be30L, + 0xd192e819d6ef5218L, 0xd69906245565a910L, 0xf40e35855771202aL, 0x106aa07032bbd1b8L, + 0x19a4c116b8d2d0c8L, 0x1e376c085141ab53L, 0x2748774cdf8eeb99L, 0x34b0bcb5e19b48a8L, + 0x391c0cb3c5c95a63L, 0x4ed8aa4ae3418acbL, 0x5b9cca4f7763e373L, 0x682e6ff3d6b2b8a3L, + 0x748f82ee5defb2fcL, 0x78a5636f43172f60L, 0x84c87814a1f0ab72L, 0x8cc702081a6439ecL, + 0x90befffa23631e28L, 0xa4506cebde82bde9L, 0xbef9a3f7b2c67915L, 0xc67178f2e372532bL, + 0xca273eceea26619cL, 0xd186b8c721c0c207L, 0xeada7dd6cde0eb1eL, 0xf57d4f7fee6ed178L, + 0x06f067aa72176fbaL, 0x0a637dc5a2c898a6L, 0x113f9804bef90daeL, 0x1b710b35131c471bL, + 0x28db77f523047d84L, 0x32caab7b40c72493L, 0x3c9ebe0a15c9bebcL, 0x431d67c49c100d4cL, + 0x4cc5d4becb3e42b6L, 0x597f299cfc657e2aL, 0x5fcb6fab3ad6faecL, 0x6c44198c4a475817L + }; + + private static int CH(int x, int y, int z) { + return (x & y) ^ ((~x) & z); + } + + private static long CH(long x, long y, long z) { + return (x & y) ^ ((~x) & z); + } + + private static int MAJ(int x, int y, int z) { + return (x & y) ^ (x & z) ^ (y & z); + } + + private static long MAJ(long x, long y, long z) { + return (x & y) ^ (x & z) ^ (y & z); + } + + private static int BSIG0(int x) { + return ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22); + } + + private static long BSIG0(long x) { + return ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39); + } + + private static int BSIG1(int x) { + return ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25); + } + + private static long BSIG1(long x) { + return ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41); + } + + private static int SSIG0(int x) { + return ROTR(x, 7) ^ ROTR(x, 18) ^ (x >>> 3); + } + + private static long SSIG0(long x) { + return ROTR(x, 1) ^ ROTR(x, 8) ^ (x >>> 7); + } + + private static int SSIG1(int x) { + return ROTR(x, 17) ^ ROTR(x, 19) ^ (x >>> 10); + } + + private static long SSIG1(long x) { + return ROTR(x, 19) ^ ROTR(x, 61) ^ (x >>> 6); + } + + private static int ROTR(int x, int n) { + return (x >>> n) | (x << (32 - n)); + } + + private static long ROTR(long x, long n) { + return (x >>> n) | (x << (64 - n)); + } +} \ No newline at end of file diff --git a/src/test/java/com/crypto/hash/Sha2Test.java b/src/test/java/com/crypto/hash/Sha2Test.java new file mode 100644 index 0000000..ee1d7aa --- /dev/null +++ b/src/test/java/com/crypto/hash/Sha2Test.java @@ -0,0 +1,191 @@ +package src.test.java.com.crypto.hash; + +import java.lang.StringBuilder; +import org.junit.Test; +import org.junit.BeforeClass; +import src.main.java.com.crypto.hash.Sha2; + +import static junit.framework.Assert.assertEquals; + + +public class Sha2Test { + /* + * The following test vectors for the SHA-2 family are taken from: + * https://www.di-mgt.com.au/sha_testvectors.html + */ + + private static byte[][] vector; + + @BeforeClass + public static void setUpClass() { + System.out.println("@BeforeClass setUpClass"); + + StringBuilder builder = new StringBuilder(); + vector = new byte[6][]; + + vector[0] = "abc".getBytes(); + vector[1] = "".getBytes(); + vector[2] = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq".getBytes(); + vector[3] = "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu".getBytes(); + for (int i = 0; i < 1000_000; i++) { + builder.append("a"); + } + vector[4] = builder.toString().getBytes(); + builder = new StringBuilder(); + for (int i = 0; i < 16_777_216; i++) { + builder.append("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno"); + } + vector[5] = builder.toString().getBytes(); + } + + @Test + public void TestSha224Vector1() { + String digest = "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7"; + assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[0])); + } + + @Test + public void TestSha224Vector2() { + String digest = "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"; + assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[1])); + } + + @Test + public void TestSha224Vector3() { + String digest = "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525"; + assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[2])); + } + + @Test + public void TestSha224Vector4() { + String digest = "c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3"; + assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[3])); + } + + @Test + public void TestSha224Vector5() { + String digest = "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67"; + assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[4])); + } + + @Test + public void TestSha224Vector6() { + String digest = "b5989713ca4fe47a009f8621980b34e6d63ed3063b2a0a2c867d8a85"; + assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[5])); + } + + @Test + public void TestSha256Vector1() { + String digest = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"; + assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[0])); + } + + @Test + public void TestSha256Vector2() { + String digest = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; + assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[1])); + } + + @Test + public void TestSha256Vector3() { + String digest = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; + assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[2])); + } + + @Test + public void TestSha256Vector4() { + String digest = "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1"; + assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[3])); + } + + @Test + public void TestSha256Vector5() { + String digest = "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"; + assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[4])); + } + + @Test + public void TestSha256Vector6() { + String digest = "50e72a0e26442fe2552dc3938ac58658228c0cbfb1d2ca872ae435266fcd055e"; + assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[5])); + } + + @Test + public void TestSha384Vector1() { + String digest = "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7"; + assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[0])); + } + + @Test + public void TestSha384Vector2() { + String digest = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"; + assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[1])); + } + + @Test + public void TestSha384Vector3() { + String digest = "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b"; + assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[2])); + } + + @Test + public void TestSha384Vector4() { + String digest = "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039"; + assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[3])); + } + + @Test + public void TestSha384Vector5() { + String digest = "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985"; + assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[4])); + } + + @Test + public void TestSha384Vector6() { + String digest = "5441235cc0235341ed806a64fb354742b5e5c02a3c5cb71b5f63fb793458d8fdae599c8cd8884943c04f11b31b89f023"; + assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[5])); + } + + @Test + public void TestSha512Vector1() { + String digest = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"; + assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[0])); + } + + @Test + public void TestSha512Vector2() { + String digest = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"; + assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[1])); + } + + @Test + public void TestSha512Vector3() { + String digest = "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445"; + assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[2])); + } + + @Test + public void TestSha512Vector4() { + String digest = "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909"; + assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[3])); + } + + @Test + public void TestSha512Vector5() { + String digest = "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"; + assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[4])); + } + + @Test + public void TestSha512Vector6() { + String digest = "b47c933421ea2db149ad6e10fce6c7f93d0752380180ffd7f4629a712134831d77be6091b819ed352c2967a2e2d4fa5050723c9630691f1a05a7281dbe6c1086"; + assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[5])); + } + + @Test + public void TestInputByteArrayNotAltered() { + byte[] array = vector[2]; + Sha2.SHA224(array); + assertEquals("user vector altered", array, vector[2]); + } +} From 604d5d36d8fe07ad3314f5ff3dfc6a20efe98601 Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Tue, 8 Jan 2019 16:51:32 +0800 Subject: [PATCH 030/120] Update Sha2.java --- src/main/java/com/crypto/hash/Sha2.java | 45 +++++++++++++++---------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/crypto/hash/Sha2.java b/src/main/java/com/crypto/hash/Sha2.java index d6c717c..d5d277c 100644 --- a/src/main/java/com/crypto/hash/Sha2.java +++ b/src/main/java/com/crypto/hash/Sha2.java @@ -12,7 +12,7 @@ * can determine if a file was manipulated, by comparing the message digest * of the original file with the message digest of the file in question. * Another example is the use of SHA-256 in the Proof-of-work algorithm of Bitcoin. - * + *

* This implementation is based on the RFC 6234 specification. The original * specification of SHA-2 is defined in FIPS PUB 180-4. Due to the U.S. * government shutdown by the end of 2018 the original specification was offline. @@ -27,19 +27,20 @@ public final class Sha2 { * By specification, the user-provided data can have a length of 0 <= L < 2^61 byte. * The JVM, though, allows an array with a maximum length of approximately * Integer.MAX_VALUE.

+ * * @param data the data/message to be digested * @return the message digest with a fixed length of 224 bit (28 byte) */ public static String SHA224(byte[] data) { final int[] initialHash = { - 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, - 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 }; int[] finalHash = digest(data, initialHash); StringBuilder builder = new StringBuilder(); - for (int i = 0; i < finalHash.length-1; i++) { + for (int i = 0; i < finalHash.length - 1; i++) { builder.append(String.format("%1$08x", finalHash[i])); } @@ -48,14 +49,15 @@ public static String SHA224(byte[] data) { /** *

Returns a SHA-256 message digest with a fixed length of 256 bit (32 byte).

+ * * @param data the data/message to be digested * @return the message digest with a fixed length of 256 bit (32 byte) * @see src.main.java.com.crypto.hash.Sha2#SHA224(byte[]) SHA224() */ public static String SHA256(byte[] data) { final int[] initialHash = { - 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, - 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 }; int[] finalHash = digest(data, initialHash); @@ -73,19 +75,20 @@ public static String SHA256(byte[] data) { * By specification, the user-provided data can have a length of 0 <= L < 2^125 byte. * The JVM, though, allows an array with a maximum length of approximately * Integer.MAX_VALUE.

+ * * @param data the data/message to be digested * @return the message digest with a fixed length of 384 bit (48 byte) */ public static String SHA384(byte[] data) { final long[] initialHash = { - 0xcbbb9d5dc1059ed8L, 0x629a292a367cd507L, 0x9159015a3070dd17L, 0x152fecd8f70e5939L, - 0x67332667ffc00b31L, 0x8eb44a8768581511L, 0xdb0c2e0d64f98fa7L, 0x47b5481dbefa4fa4L + 0xcbbb9d5dc1059ed8L, 0x629a292a367cd507L, 0x9159015a3070dd17L, 0x152fecd8f70e5939L, + 0x67332667ffc00b31L, 0x8eb44a8768581511L, 0xdb0c2e0d64f98fa7L, 0x47b5481dbefa4fa4L }; long[] finalHash = digest(data, initialHash); StringBuilder builder = new StringBuilder(); - for (int i = 0; i < finalHash.length-2; i++) { + for (int i = 0; i < finalHash.length - 2; i++) { builder.append(String.format("%1$016x", finalHash[i])); } @@ -94,14 +97,15 @@ public static String SHA384(byte[] data) { /** *

Returns a SHA-512 message digest with a fixed length of 512 bit (64 byte).

+ * * @param data the data/message to be digested * @return the message digest with a fixed length of 512 bit (64 byte) * @see src.main.java.com.crypto.hash.Sha2#SHA384(byte[]) SHA384() */ public static String SHA512(byte[] data) { final long[] initialHash = { - 0x6a09e667f3bcc908L, 0xbb67ae8584caa73bL, 0x3c6ef372fe94f82bL, 0xa54ff53a5f1d36f1L, - 0x510e527fade682d1L, 0x9b05688c2b3e6c1fL, 0x1f83d9abfb41bd6bL, 0x5be0cd19137e2179L + 0x6a09e667f3bcc908L, 0xbb67ae8584caa73bL, 0x3c6ef372fe94f82bL, 0xa54ff53a5f1d36f1L, + 0x510e527fade682d1L, 0x9b05688c2b3e6c1fL, 0x1f83d9abfb41bd6bL, 0x5be0cd19137e2179L }; long[] finalHash = digest(data, initialHash); @@ -119,6 +123,7 @@ public static String SHA512(byte[] data) { *

This method is wrapped by SHA224() and SHA256(). Both algorithms differ * only in two points: the initialization hashes are different and for SHA-224 * the raw message digest is truncated by 1 byte.

+ * * @param data the data/message to be digested * @param hash the initial hash value, which in the process gets used * for the intermediate hashes @@ -151,6 +156,7 @@ private static int[] digest(byte[] data, int[] hash) { *

This method is wrapped by SHA384() and SHA512(). Both algorithms differ * only in two points: the initialization hashes are different and for SHA-384 * the raw message digest is truncated by 2 byte.

+ * * @param data the data/message to be digested * @param hash the initial hash value, which in the process gets used * for the intermediate hashes @@ -180,7 +186,8 @@ private static long[] digest(byte[] data, long[] hash) { /** *

Pads the user-provided data.

- * @param data the data/message to be digested + * + * @param data the data/message to be digested * @param blockSize the size of a data block (64 or 128 byte) * @return the padding for the data * @see RFC 6234 - Message padding @@ -189,7 +196,7 @@ private static byte[] pad(byte[] data, int blockSize) { byte[] padding; int lastBlockLength = data.length % blockSize; if (lastBlockLength + 1 > (blockSize / 8) * 7) { - padding = new byte[blockSize*2 - lastBlockLength]; + padding = new byte[blockSize * 2 - lastBlockLength]; } else { padding = new byte[blockSize - lastBlockLength]; } @@ -206,8 +213,9 @@ private static byte[] pad(byte[] data, int blockSize) { /** * Scrambles data blocks in a deterministic way. + * * @param dataBlock the data blocks to be scrambled - * @param hash the resulting hash + * @param hash the resulting hash * @see SHA-224 and SHA-256 Processing */ private static void hashBlock(int[] dataBlock, int[] hash) { @@ -221,7 +229,7 @@ private static void hashBlock(int[] dataBlock, int[] hash) { W[i] = dataBlock[i]; } for (int i = 16; i < 64; i++) { - W[i] = SSIG1(W[i-2]) + W[i-7] + SSIG0(W[i-15]) + W[i-16]; + W[i] = SSIG1(W[i - 2]) + W[i - 7] + SSIG0(W[i - 15]) + W[i - 16]; } // Initialize the working variables @@ -251,8 +259,9 @@ private static void hashBlock(int[] dataBlock, int[] hash) { /** * Scrambles data blocks in a deterministic way. + * * @param dataBlock the data blocks to be scrambled - * @param hash the resulting hash + * @param hash the resulting hash * @see SHA-384 and SHA-512 Processing */ private static void hashBlock(long[] dataBlock, long[] hash) { @@ -266,7 +275,7 @@ private static void hashBlock(long[] dataBlock, long[] hash) { W[i] = dataBlock[i]; } for (int i = 16; i < 80; i++) { - W[i] = SSIG1(W[i-2]) + W[i-7] + SSIG0(W[i-15]) + W[i-16]; + W[i] = SSIG1(W[i - 2]) + W[i - 7] + SSIG0(W[i - 15]) + W[i - 16]; } // Initialize the working variables @@ -396,4 +405,4 @@ private static int ROTR(int x, int n) { private static long ROTR(long x, long n) { return (x >>> n) | (x << (64 - n)); } -} \ No newline at end of file +} From 87eec2d6fb83697d56402d74135cd7621516c362 Mon Sep 17 00:00:00 2001 From: darius-welsch Date: Wed, 16 Jan 2019 16:12:54 +0100 Subject: [PATCH 031/120] Add Base64 encoding and decoding --- src/main/java/com/crypto/codec/Base64.java | 233 ++++++++++++++++++ .../java/com/crypto/codec/Base64Test.java | 47 ++++ 2 files changed, 280 insertions(+) create mode 100644 src/main/java/com/crypto/codec/Base64.java create mode 100644 src/test/java/com/crypto/codec/Base64Test.java diff --git a/src/main/java/com/crypto/codec/Base64.java b/src/main/java/com/crypto/codec/Base64.java new file mode 100644 index 0000000..130c81a --- /dev/null +++ b/src/main/java/com/crypto/codec/Base64.java @@ -0,0 +1,233 @@ +package src.main.java.com.crypto.codec; + +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +/** + *

This class implements the Base64 codec as it is specified in the RFC 4648. + * Base64 represents binary data as a text string. It is used to store or transfer + * data in legacy systems that are restricted to 7 bit per character. There are + * many variations of Base64, e.g. MIME (RFC 2045) specifies Base64 slightly + * different. The RFC 4648 tries to solve this disambiguation. + * + * @see RFC 4648 + */ +public class Base64 { + private static final char pad = '='; + private static final char[] encodeAlphabet = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', + 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', + 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', + '4', '5', '6', '7', '8', '9', '+', '/' + }; + private static final byte[] decodeAlphabet = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, + -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 + }; + + /** + *

Encodes user-provided data with the Base64 encoding. For this, the data + * is split in to blocks of 3-byte length. The last block may be of a shorter + * length. The blocks are then encoded, and the last block is padded. + * + * @param data The data that is to be Base64-encoded + * @return Base64-encoded data + * @see RFC 4648 - Base64 encoding + */ + public static String encode(byte[] data) { + StringBuilder builder = new StringBuilder(); + int blockCount = data.length / 3; + + // if last block is shorter than 3 bytes, then it's not buffered + ByteBuffer buffer = ByteBuffer.wrap(data, 0, blockCount * 3); + + // encode buffered data + while (buffer.hasRemaining()) { + byte[] dataBlock = new byte[3]; + for (int i = 0; i < 3; i++) { + dataBlock[i] = buffer.get(); + } + builder.append(encodeBlock(dataBlock)); + } + + // encode (pad) last block, if it was shorter than 3 bytes + int remaining = data.length % 3; + if (remaining > 0) { + byte[] lastBlock = Arrays.copyOfRange(data, data.length - remaining, data.length); + char[] padding = padBlock(lastBlock); + builder.append(padding); + } + + return builder.toString(); + } + + /** + *

Encodes one block of data. + * + * @param block The block to be encoded with a length of 3 bytes + * @return The encoded block + */ + private static char[] encodeBlock(byte[] block) { + char[] encodedBlock = new char[4]; + + // split 3 bytes in to 4 6-bit blocks + encodedBlock[0] = encodeAlphabet[block[0] >>> 2]; + encodedBlock[1] = encodeAlphabet[(block[0] & 0b11) << 4 | block[1] >>> 4]; + encodedBlock[2] = encodeAlphabet[(block[1] & 0b1111) << 2 | block[2] >>> 6]; + encodedBlock[3] = encodeAlphabet[block[2] & 0b11_1111]; + + return encodedBlock; + } + + /** + *

Pads a block of data with a padding character ('='). A data block can + * have one or two elements. The resulting encoded block has always four + * characters. + *

There are two cases: + *

    + *
  • If data block has one element, then the encoded block has two + * characters and two padding characters
  • + *
  • If data block has two elements, the the encoded block has three + * characters and one padding character
  • + *
+ * + * @param block A block of data with a length of one or two + * @return The encoded and padded block + * @see RFC 4648 - Base64 encoding + */ + private static char[] padBlock(byte[] block) { + char[] paddedBlock = new char[4]; + + paddedBlock[0] = encodeAlphabet[block[0] >>> 2]; + if (block.length == 1) { + // pad with 2 padding characters + paddedBlock[1] = encodeAlphabet[(block[0] & 0b11) << 4]; + paddedBlock[2] = pad; + paddedBlock[3] = pad; + } else { // block.length == 2 + // pad with 1 padding character + paddedBlock[1] = encodeAlphabet[(block[0] & 0b11) << 4 | block[1] >>> 4]; + paddedBlock[2] = encodeAlphabet[(block[1] & 0b1111) << 2]; + paddedBlock[3] = pad; + } + + return paddedBlock; + } + + /** + *

Decodes original data from a Base64 string. The string has always + * a length of the multiple of four characters (empty string included). The + * last block of four characters can contain one or two padding characters ('='). + *

Each block is decoded in to 3 bytes of data. The last block is + * processed separately to reverse the padding. + * + * @param base64String Base64 encoded data + * @return original data + */ + public static byte[] decode(String base64String) { + if (base64String == null) { + throw new IllegalArgumentException("Base64 string must not be null!"); + } + + base64String = base64String.strip(); + if (!isValidBase64String(base64String)) { + throw new IllegalArgumentException("String is not a valid Base64 string!"); + } + + // an empty base64 string decodes in to an empty byte array + if (base64String.length() == 0) { + return new byte[0]; + } + + int blockCount = base64String.length() / 4; + ByteBuffer stringBuffer = ByteBuffer.wrap(base64String.getBytes(StandardCharsets.ISO_8859_1), + 0, base64String.length()); + // separate last block from data + ByteBuffer dataBuffer = ByteBuffer.allocate((blockCount - 1) * 3); + + byte[] encodedBlock = new byte[4]; + // decode bulk of data + for (int i = 0; i < blockCount - 1; ++i) { + for (int j = 0; j < 4; j++) { + encodedBlock[j] = stringBuffer.get(); + } + dataBuffer.put(decodeBlock(encodedBlock)); + } + // decode last block + for (int i = 0; i < 4; i++) { + encodedBlock[i] = stringBuffer.get(); + } + byte[] lastDataBlock = undoPadding(encodedBlock); + + // glue bulk of data and last block together + ByteBuffer decodedData = ByteBuffer.allocate(dataBuffer.capacity() + lastDataBlock.length); + decodedData.put(dataBuffer.array()); + decodedData.put(lastDataBlock); + return decodedData.array(); + } + + /** + *

Decodes an encoded block. + * + * @param block The encoded block with a length of 4 bytes + * @return The decoded block + */ + private static byte[] decodeBlock(byte[] block) { + byte[] decodedBlock = new byte[3]; + + decodedBlock[0] = (byte) (decodeAlphabet[block[0]] << 2 | decodeAlphabet[block[1]] >>> 4); + decodedBlock[1] = (byte) (decodeAlphabet[block[1]] << 4 | decodeAlphabet[block[2]] >>> 2); + decodedBlock[2] = (byte) (decodeAlphabet[block[2]] << 6 | decodeAlphabet[block[3]]); + + return decodedBlock; + } + + /** + *

Removes the padding from the last block. + * + * @param block + * @return The decoded last block of data + */ + private static byte[] undoPadding(byte[] block) { + int padCount = 0; + byte[] decodedBlock; + + // count padding characters + if (block[3] == (byte) pad) padCount++; + if (block[2] == (byte) pad) padCount++; + + if (padCount == 2) { + decodedBlock = new byte[1]; + decodedBlock[0] = (byte) (decodeAlphabet[block[0]] << 2 | decodeAlphabet[block[1]] >>> 4); + } else if (padCount == 1) { + decodedBlock = new byte[2]; + decodedBlock[0] = (byte) (decodeAlphabet[block[0]] << 2 | decodeAlphabet[block[1]] >>> 4); + decodedBlock[1] = (byte) (decodeAlphabet[block[1]] << 4 | decodeAlphabet[block[2]] >>> 2); + } else { + decodedBlock = decodeBlock(block); + } + return decodedBlock; + } + + /** + *

Check if the provided string is a valid Base64 string. + *

The specification (RFC 4648) says: "Implementations MUST reject the + * encoded data if it contains characters outside the base alphabet when + * interpreting base-encoded data, unless the specification referring to this + * document explicitly states otherwise." + * + * @param base64String + * @return true if the string is valid; + * false otherwise + */ + private static boolean isValidBase64String(String base64String) { + return base64String.matches("^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)?$"); + } +} diff --git a/src/test/java/com/crypto/codec/Base64Test.java b/src/test/java/com/crypto/codec/Base64Test.java new file mode 100644 index 0000000..dcda19a --- /dev/null +++ b/src/test/java/com/crypto/codec/Base64Test.java @@ -0,0 +1,47 @@ +package src.test.java.com.crypto.codec; + +import src.main.java.com.crypto.codec.Base64; +import org.junit.Test; + +import static junit.framework.Assert.*; +import static org.junit.Assert.assertArrayEquals; + +public class Base64Test { + + /* + * Test vectors are taken from: + * https://tools.ietf.org/html/rfc4648#section-10 + */ + + @Test + public void TestBase64Encode() { + assertEquals("", Base64.encode("".getBytes())); + assertEquals("Zg==", Base64.encode("f".getBytes())); + assertEquals("Zm8=", Base64.encode("fo".getBytes())); + assertEquals("Zm9v", Base64.encode("foo".getBytes())); + assertEquals("Zm9vYg==", Base64.encode("foob".getBytes())); + assertEquals("Zm9vYmE=", Base64.encode("fooba".getBytes())); + assertEquals("Zm9vYmFy", Base64.encode("foobar".getBytes())); + } + + @Test + public void TestBase64Decode() { + assertArrayEquals("".getBytes(), Base64.decode("")); + assertArrayEquals("f".getBytes(), Base64.decode("Zg==")); + assertArrayEquals("fo".getBytes(), Base64.decode("Zm8=")); + assertArrayEquals("foo".getBytes(), Base64.decode("Zm9v")); + assertArrayEquals("foob".getBytes(), Base64.decode("Zm9vYg==")); + assertArrayEquals("fooba".getBytes(), Base64.decode("Zm9vYmE=")); + assertArrayEquals("foobar".getBytes(), Base64.decode("Zm9vYmFy")); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidBase64String() { + Base64.decode("Z/+v&mF="); + } + + @Test(expected = IllegalArgumentException.class) + public void testInvalidLengthOfBase64String() { + Base64.decode("Zm9v" + "YmFy" + "d"); + } +} From 2b045887082c51194f409781597875bc566c29ac Mon Sep 17 00:00:00 2001 From: TimotheeChauvin Date: Wed, 16 Jan 2019 20:24:12 +0100 Subject: [PATCH 032/120] README.md: fix broken links + minor orthographic and syntactic corrections --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 48f442a..1987471 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,21 @@ # The Algorithms - Java (WORK IN PROGRESS) ## Goal -Make it a working Java project with full fledged test cases for each algorithm and correct package structures. Once we have enough test coverage, we would merge it with master +Make it a working Java project with full fledged test cases for each algorithm and correct package structures. Once we have enough test coverage, we would merge it with master. ## Contribution Guidelines - - If you add an algorithm then you have to add a test along with it. In absence of a test the PR would not be approved - - Follow the correct coding guidelines with proper description for the methods. Refer [DecimalToAnyBase.java](https://github.com/TheAlgorithms/Java/blob/Development/src/main/com/java/conversions/DecimalToAnyBase.java) for algorithm and [DecimalToAnyBaseTest.java](https://github.com/TheAlgorithms/Java/blob/Development/src/test/com/java/conversions/DecimalToAnyBaseTest.java) for the test coding standards. - - Do not add a main method as we just need the actual algorithm in a method for the class which we are going to test in the test cases - - Please do not add a signature inside the code. The commit history is sufficient enough to determine who has added the code to the repo. - - Make sure the algorithm which is getting added comes under a certain domain of Algorithms. Please don't create a package with name such as Misc, Others etc. - - While making a PR make sure you are commiting the Java files only and not any project specific files. If you feel that your IDE is generating some extra files then either don't add them to git or add the extensions to ```.gitignore``` - - Please don't add solutions to problems from online judge such as Hackerrank, Leetcode etc + - If you add an algorithm then you have to add a test along with it. In the absence of a test, the PR would not be approved. + - Follow the correct coding guidelines with proper description of the methods. Refer to [DecimalToAnyBase.java](https://github.com/TheAlgorithms/Java/blob/Development/src/main/java/com/conversions/DecimalToAnyBase.java) and [DecimalToAnyBaseTest.java](https://github.com/TheAlgorithms/Java/blob/Development/src/test/java/com/conversions/DecimalToAnyBaseTest.java) for the algorithms and tests coding standards, respectively. + - Do not add a main method as we just need the actual algorithm in a method for the class which we are going to test in the test cases. + - Please do not add a signature inside the code. The commit history is sufficient to determine who has added the code to the repo. + - Make sure the algorithm which is getting added comes under a certain domain of Algorithms. Please don't create a package with a name such as Misc, Others, etc. + - While making a PR, make sure you are committing the Java files only and not any project specific files. If you feel that your IDE is generating some extra files, then either don't add them to git, or add the extensions to ```.gitignore```. + - Please don't add solutions to problems from online judges such as Hackerrank, Leetcode, etc. ## Steps to raise a PR -- Fork to [Java Repo](https://github.com/TheAlgorithms/Java) +- Fork the [Java Repo](https://github.com/TheAlgorithms/Java) - Open the forked repo on your local machine -- Switch to ```Development``` branch by using the command ```git checkout Development``` +- Switch to the ```Development``` branch by using the command ```git checkout Development``` - Add the JAR for JUnit to your build path. Here is a link for the [JUnit JAR](http://www.java2s.com/Code/Jar/j/Downloadjunit410jar.htm) - Make the changes on your local machine - Push the changes to the forked repository From 4f102111473f3d42a97756505d711931a4b59441 Mon Sep 17 00:00:00 2001 From: AlienJimmey <46637077+AlienJimmey@users.noreply.github.com> Date: Wed, 16 Jan 2019 18:20:58 -0500 Subject: [PATCH 033/120] moving sort algorithms into right place --- src/main/java/{src/main/java => }/com/sorts/CountingSort.java | 0 src/main/java/{src/main/java => }/com/sorts/CycleSort.java | 0 src/main/java/{src/main/java => }/com/sorts/PigeonholeSort.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/{src/main/java => }/com/sorts/CountingSort.java (100%) rename src/main/java/{src/main/java => }/com/sorts/CycleSort.java (100%) rename src/main/java/{src/main/java => }/com/sorts/PigeonholeSort.java (100%) diff --git a/src/main/java/src/main/java/com/sorts/CountingSort.java b/src/main/java/com/sorts/CountingSort.java similarity index 100% rename from src/main/java/src/main/java/com/sorts/CountingSort.java rename to src/main/java/com/sorts/CountingSort.java diff --git a/src/main/java/src/main/java/com/sorts/CycleSort.java b/src/main/java/com/sorts/CycleSort.java similarity index 100% rename from src/main/java/src/main/java/com/sorts/CycleSort.java rename to src/main/java/com/sorts/CycleSort.java diff --git a/src/main/java/src/main/java/com/sorts/PigeonholeSort.java b/src/main/java/com/sorts/PigeonholeSort.java similarity index 100% rename from src/main/java/src/main/java/com/sorts/PigeonholeSort.java rename to src/main/java/com/sorts/PigeonholeSort.java From b61eb8cca3a5313963aa97e2afacb3f3d5f615f4 Mon Sep 17 00:00:00 2001 From: AlienJimmey <46637077+AlienJimmey@users.noreply.github.com> Date: Wed, 16 Jan 2019 18:49:13 -0500 Subject: [PATCH 034/120] moved sorts folder to fit with others test --- src/test/java/{src/test/java => }/com/sorts/CountingSortTest.java | 0 src/test/java/{src/test/java => }/com/sorts/CycleSortTest.java | 0 .../java/{src/test/java => }/com/sorts/PigeonholeSortTest.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/test/java/{src/test/java => }/com/sorts/CountingSortTest.java (100%) rename src/test/java/{src/test/java => }/com/sorts/CycleSortTest.java (100%) rename src/test/java/{src/test/java => }/com/sorts/PigeonholeSortTest.java (100%) diff --git a/src/test/java/src/test/java/com/sorts/CountingSortTest.java b/src/test/java/com/sorts/CountingSortTest.java similarity index 100% rename from src/test/java/src/test/java/com/sorts/CountingSortTest.java rename to src/test/java/com/sorts/CountingSortTest.java diff --git a/src/test/java/src/test/java/com/sorts/CycleSortTest.java b/src/test/java/com/sorts/CycleSortTest.java similarity index 100% rename from src/test/java/src/test/java/com/sorts/CycleSortTest.java rename to src/test/java/com/sorts/CycleSortTest.java diff --git a/src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java b/src/test/java/com/sorts/PigeonholeSortTest.java similarity index 100% rename from src/test/java/src/test/java/com/sorts/PigeonholeSortTest.java rename to src/test/java/com/sorts/PigeonholeSortTest.java From 9de5a024ec3a826f54814486ee19d0bca68fea19 Mon Sep 17 00:00:00 2001 From: TimotheeChauvin Date: Fri, 18 Jan 2019 20:27:44 +0100 Subject: [PATCH 035/120] add the Gale Shapley algorithm (with a test) --- .../matchings/stableMatching/GaleShapley.java | 103 +++++++++++++++ .../stableMatching/GaleShapleyTest.java | 125 ++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 src/main/java/com/matchings/stableMatching/GaleShapley.java create mode 100644 src/test/java/com/matchings/stableMatching/GaleShapleyTest.java diff --git a/src/main/java/com/matchings/stableMatching/GaleShapley.java b/src/main/java/com/matchings/stableMatching/GaleShapley.java new file mode 100644 index 0000000..3c60e83 --- /dev/null +++ b/src/main/java/com/matchings/stableMatching/GaleShapley.java @@ -0,0 +1,103 @@ +package src.main.java.com.matchings.stableMatching; + +public class GaleShapley { + + /** + * Return a stable matching between men and women according to their preferences, + * following the Gale-Shapley algorithm. + * + * @param menPrefs for each man, for each preference rank, the corresponding woman + * @param womenPrefs for each woman, for each preference rank, the corresponding man + * @return for each man, the associated woman (1-dimensional array) + */ + + public int[] GaleShapleyStableMarriage(int[][] menPrefs, int[][] womenPrefs) { + assert menPrefs.length == womenPrefs.length; // there are n individuals in each group + + int n = menPrefs.length; + if (n == 0) + return new int[0]; // handle empty initial conditions right away + + // Some implementation details: men, women and preference ranks are all labeled + // from 0 to n-1. + + // menMatching: for each man, the woman to whom he is engaged (or -1 if not engaged): + int[] menMatching = new int[n]; + // the same for women: + int[] womenMatching = new int[n]; + + // asked: for each man, highest rank asked (between 0 and n-1; + // -1 if hasn't asked anyone yet) + int[] asked = new int[n]; + + // Initialize all values of menMatching and womenMatching to -1, + // otherwise woman 0 will be considered engaged to all men and idem for man 0. + // Do the same for asked, otherwise each man will be considered as having + // already asked his first choice. + for (int i = 0; i < n; i++) { + menMatching[i] = -1; + womenMatching[i] = -1; + asked[i] = -1; + } + + // to quickly retrieve the rank of men for a given woman, we create womenRanks. + // For each woman, the array is: + // index: man; value: rank + // whereas in womenPrefs it was index: rank; value: man + // Retrieving a rank will be done be simply looking up womenRanks[woman][man] + int[][] womenRanks = new int[n][n]; + int man; + for (int w = 0; w < n; w++) { + for (int rank = 0; rank < n; rank++) { + man = womenPrefs[w][rank]; + womenRanks[w][man] = rank; + } + } + + int unengaged = 0; // at first all men are unengaged, we take the first one + int notAsked; // first rank not asked by unengaged + int prefWoman; // for the considered man, preferred woman among not asked ones + int currentManPartner; // for the considered woman, current partner (-1 if none) + while (unengaged != -1) { // while there is an unengaged man + // unengaged is our proposing man. + notAsked = asked[unengaged] + 1; + prefWoman = menPrefs[unengaged][notAsked]; + currentManPartner = womenMatching[prefWoman]; + // now unengaged asks prefWoman for engagement. + asked[unengaged] += 1; + if (currentManPartner == -1) { // prefWoman is not engaged: the two engage + menMatching[unengaged] = prefWoman; + womenMatching[prefWoman] = unengaged; + unengaged = getUnengaged(menMatching); // we need a new unengaged + } else { // prefWoman is engaged to currentManPartner (therefore >= 0) + if (womenRanks[prefWoman][unengaged] < womenRanks[prefWoman][currentManPartner]) { + // prefWoman prefers unengaged: split prefWoman and currentManPartner + menMatching[currentManPartner] = -1; + // and engage prefWoman and unengaged + menMatching[unengaged] = prefWoman; + womenMatching[prefWoman] = unengaged; + unengaged = getUnengaged(menMatching); // we need a new unengaged + } + // If prefWoman prefers currentManPartner over unengaged, nothing happens + // (except that asked[unengaged] has been incremented so unengaged won't ask + // prefWoman for engagement anymore). + } + } + return menMatching; + } + + /** + * Get a currently unengaged man, if there is one + * + * @param menMatching the current men matching array (being constructed) + * @return the first man that is not engaged, or -1 if all men are engaged + */ + + public int getUnengaged(int[] menMatching) { + for (int m = 0; m < menMatching.length; m++) { + if (menMatching[m] == -1) + return m; + } + return -1; + } +} \ No newline at end of file diff --git a/src/test/java/com/matchings/stableMatching/GaleShapleyTest.java b/src/test/java/com/matchings/stableMatching/GaleShapleyTest.java new file mode 100644 index 0000000..2e7d204 --- /dev/null +++ b/src/test/java/com/matchings/stableMatching/GaleShapleyTest.java @@ -0,0 +1,125 @@ +package src.test.java.com.matchings.stableMatching; + +import src.main.java.com.matchings.stableMatching.GaleShapley; +import org.junit.Test; + +import static junit.framework.Assert.assertEquals; + +import java.util.Random; +import java.util.Collections; // for shuffling +import java.util.ArrayList; // for shuffling +import java.util.List; // for shuffling + +public class GaleShapleyTest { + + /** + * Test a number of GaleShapley executions on pseudo-random instances of the + * stable marriage problem. + */ + + @Test + public void testGaleShapley() { + GaleShapley galeShapley = new GaleShapley(); + int N = 10; + int[][] menPrefs; + int[][] womenPrefs; + int[] GaleShapleyMenMatching; // the solution returned by GaleShapley.java + // for each n from 0 to N-1, create and test an instance of the problem. + for (int n = 0; n < N; n++) { + System.out.println("testing n = " + n); + menPrefs = new int[n][n]; + womenPrefs = new int[n][n]; + // set all other sex individuals in each individual's preference list, + // then shuffle + for (int i = 0; i < n; i++) { + for (int j = 0; j < n; j++) { + menPrefs[i][j] = j; + womenPrefs[i][j] = j; + } + shuffleArray(menPrefs[i], i); + shuffleArray(womenPrefs[i], n+i); + } + // Now we have pseudo-random preferences for each man and each woman. + GaleShapleyMenMatching = galeShapley.GaleShapleyStableMarriage(menPrefs, womenPrefs); + assertEquals("Unstable matching", true, isStable(GaleShapleyMenMatching, menPrefs, womenPrefs)); + } + } + + /** + * Determine if the proposed menMatching is stable, i.e. if there is no + * potential couple in which both members would strictly prefer being with each + * other than being with their current partner. + * + * @param menMatching + * @param menPrefs + * @param womenPrefs + * @return whether menMatching is stable according to menPrefs and womenPrefs + */ + + public boolean isStable(int[] menMatching, int[][] menPrefs, int[][] womenPrefs) { + int n = menMatching.length; + // reconstruct womenMatching (for each woman, the associated man): + int[] womenMatching = new int[n]; + int man; + int woman; + for (man = 0; man < n; man++) { + woman = menMatching[man]; + womenMatching[woman] = man; + } + + // construct menRanks and womenRanks to quickly compare preferences: + int[][] menRanks = new int[n][n]; + int[][] womenRanks = new int[n][n]; + int individualAtThisRank; + for (int i = 0; i < n; i++) { + for (int rank = 0; rank < n; rank++) { + // womenRanks + individualAtThisRank = womenPrefs[i][rank]; + womenRanks[i][individualAtThisRank] = rank; + + // menRanks + individualAtThisRank = menPrefs[i][rank]; + menRanks[i][individualAtThisRank] = rank; + } + } + + // Do the actual test by considering all potential n*n couples and verifying + // that at least one of them is happier now than they + // would be in the potential couple + + int currentEngagedMan; // man currently engaged to considered woman + int currentEngagedWoman; // woman currently engaged to considered man + for (man = 0; man < n; man++) { + for (woman = 0; woman < n; woman++) { + currentEngagedMan = womenMatching[woman]; + currentEngagedWoman = menMatching[man]; + if (womenRanks[woman][man] < womenRanks[woman][currentEngagedMan] + && menRanks[man][woman] < menRanks[man][currentEngagedWoman]) { + // man prefers woman over currentEngagedWoman, and + // woman prefers man over currentEngagedMan. + // The marriage therefore isn't stable. + return false; + } + } + } + return true; + } + + /** + * Shuffle an array using Collections.shuffle + * + * @param array array to be shuffled + * @param seed fixed seed, for reproducibility + */ + + public void shuffleArray(int[] array, long seed) { + List list = new ArrayList<>(); + for (int i : array) { + list.add(i); + } + Collections.shuffle(list, new Random(seed)); + for (int i = 0; i < list.size(); i++) { + array[i] = list.get(i); + } + } +} \ No newline at end of file From 6268d3925032ba3a5f2770d8e4a5fa9e044e5149 Mon Sep 17 00:00:00 2001 From: Adan Rodriguez Date: Sun, 27 Jan 2019 18:49:02 -0300 Subject: [PATCH 036/120] conversion binary to hexadecimal --- .../com/conversions/BinaryToHexadecimal.java | 42 +++++++++++++++++++ .../conversions/BinaryToHexadecimalTest.java | 15 +++++++ 2 files changed, 57 insertions(+) create mode 100644 src/main/java/com/conversions/BinaryToHexadecimal.java create mode 100644 src/test/java/com/conversions/BinaryToHexadecimalTest.java diff --git a/src/main/java/com/conversions/BinaryToHexadecimal.java b/src/main/java/com/conversions/BinaryToHexadecimal.java new file mode 100644 index 0000000..4a3b26b --- /dev/null +++ b/src/main/java/com/conversions/BinaryToHexadecimal.java @@ -0,0 +1,42 @@ +package src.main.java.com.conversions; + +import java.util.HashMap; + +public class BinaryToHexadecimal { + + /** + * This method converts a binary number to + * a hexadecimal number. + * + * @param binary The binary number + * @return The hexadecimal number + */ + + public String binToHex(int binary) { + //hm to store hexadecimal codes for binary numbers within the range: 0000 to 1111 i.e. for decimal numbers 0 to 15 + HashMap hmHexadecimal = new HashMap<>(); + + //String to store hexadecimal code + String hex=""; + int i; + for(i=0 ; i<10 ; i++) + hmHexadecimal.put(i, String.valueOf(i)); + + for(i=10 ; i<16 ; i++) + hmHexadecimal.put(i,String.valueOf((char)('A'+i-10))); + + int currentbit; + while(binary != 0) { + int code4 = 0; //to store decimal equivalent of number formed by 4 decimal digits + for(i=0 ; i<4 ; i++) + { + currentbit = binary % 10; + binary = binary / 10; + code4 += currentbit * Math.pow(2, i); + } + hex= hmHexadecimal.get(code4) + hex; + } + return hex; + + } +} \ No newline at end of file diff --git a/src/test/java/com/conversions/BinaryToHexadecimalTest.java b/src/test/java/com/conversions/BinaryToHexadecimalTest.java new file mode 100644 index 0000000..c496e30 --- /dev/null +++ b/src/test/java/com/conversions/BinaryToHexadecimalTest.java @@ -0,0 +1,15 @@ +package src.test.java.com.conversions; + +import org.junit.Test; +import src.main.java.com.conversions.BinaryToHexadecimal; +import org.junit.Assert; + +public class BinaryToHexadecimalTest { + + @Test + public void testBinaryToHexadecimal(){ + BinaryToHexadecimal binaryToHexadecimal = new BinaryToHexadecimal(); + Assert.assertEquals("Incorrect Conversion", "2A", binaryToHexadecimal.binToHex(101010)); + Assert.assertEquals("Incorrect Conversion", "24", binaryToHexadecimal.binToHex(100100)); + } +} \ No newline at end of file From 2bcc4c9640ccbda47ab28f6ea6a84edd633a6057 Mon Sep 17 00:00:00 2001 From: Adan Rodriguez Date: Mon, 28 Jan 2019 09:17:17 -0300 Subject: [PATCH 037/120] resolving comment --- src/main/java/com/conversions/BinaryToHexadecimal.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/conversions/BinaryToHexadecimal.java b/src/main/java/com/conversions/BinaryToHexadecimal.java index 4a3b26b..29a8f65 100644 --- a/src/main/java/com/conversions/BinaryToHexadecimal.java +++ b/src/main/java/com/conversions/BinaryToHexadecimal.java @@ -12,7 +12,7 @@ public class BinaryToHexadecimal { * @return The hexadecimal number */ - public String binToHex(int binary) { + public String binToHex(long binary) { //hm to store hexadecimal codes for binary numbers within the range: 0000 to 1111 i.e. for decimal numbers 0 to 15 HashMap hmHexadecimal = new HashMap<>(); @@ -25,7 +25,7 @@ public String binToHex(int binary) { for(i=10 ; i<16 ; i++) hmHexadecimal.put(i,String.valueOf((char)('A'+i-10))); - int currentbit; + long currentbit; while(binary != 0) { int code4 = 0; //to store decimal equivalent of number formed by 4 decimal digits for(i=0 ; i<4 ; i++) From 6312a1ee872d04c0d0a68e4dc1ee85b2743706fd Mon Sep 17 00:00:00 2001 From: Adan Rodriguez Date: Tue, 29 Jan 2019 19:09:17 -0300 Subject: [PATCH 038/120] binary number in 64 bits --- .../java/com/conversions/BinaryToHexadecimal.java | 14 ++++++++------ .../com/conversions/BinaryToHexadecimalTest.java | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/conversions/BinaryToHexadecimal.java b/src/main/java/com/conversions/BinaryToHexadecimal.java index 29a8f65..199a52d 100644 --- a/src/main/java/com/conversions/BinaryToHexadecimal.java +++ b/src/main/java/com/conversions/BinaryToHexadecimal.java @@ -1,5 +1,6 @@ package src.main.java.com.conversions; +import java.math.BigInteger; import java.util.HashMap; public class BinaryToHexadecimal { @@ -12,7 +13,7 @@ public class BinaryToHexadecimal { * @return The hexadecimal number */ - public String binToHex(long binary) { + public String binToHex(BigInteger binary) { //hm to store hexadecimal codes for binary numbers within the range: 0000 to 1111 i.e. for decimal numbers 0 to 15 HashMap hmHexadecimal = new HashMap<>(); @@ -25,14 +26,15 @@ public String binToHex(long binary) { for(i=10 ; i<16 ; i++) hmHexadecimal.put(i,String.valueOf((char)('A'+i-10))); - long currentbit; - while(binary != 0) { + int currentbit; + BigInteger tenValue = new BigInteger("10"); + while(binary.compareTo(BigInteger.ZERO) != 0) { int code4 = 0; //to store decimal equivalent of number formed by 4 decimal digits for(i=0 ; i<4 ; i++) { - currentbit = binary % 10; - binary = binary / 10; - code4 += currentbit * Math.pow(2, i); + currentbit = binary.mod(tenValue).intValueExact(); + binary = binary.divide(tenValue); + code4 += currentbit*Math.pow(2, i); } hex= hmHexadecimal.get(code4) + hex; } diff --git a/src/test/java/com/conversions/BinaryToHexadecimalTest.java b/src/test/java/com/conversions/BinaryToHexadecimalTest.java index c496e30..67d93b9 100644 --- a/src/test/java/com/conversions/BinaryToHexadecimalTest.java +++ b/src/test/java/com/conversions/BinaryToHexadecimalTest.java @@ -9,7 +9,8 @@ public class BinaryToHexadecimalTest { @Test public void testBinaryToHexadecimal(){ BinaryToHexadecimal binaryToHexadecimal = new BinaryToHexadecimal(); - Assert.assertEquals("Incorrect Conversion", "2A", binaryToHexadecimal.binToHex(101010)); - Assert.assertEquals("Incorrect Conversion", "24", binaryToHexadecimal.binToHex(100100)); + Assert.assertEquals("Incorrect Conversion", "2A", binaryToHexadecimal.binToHex(new BigInteger("101010"))); + Assert.assertEquals("Incorrect Conversion", "24", binaryToHexadecimal.binToHex(new BigInteger("100100"))); + Assert.assertEquals("Incorrect Conversion", "AAAAAAAAAAAAAAAAAA1", binaryToHexadecimal.binToHex(new BigInteger("1010101010101010101010101010101010101010101010101010101010101010101010100001"))); } } \ No newline at end of file From d082862fb461bdb06a5f9ce46b752765b5d12b75 Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Wed, 30 Jan 2019 17:05:40 +0800 Subject: [PATCH 039/120] Update BinaryToHexadecimal.java --- .../com/conversions/BinaryToHexadecimal.java | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/conversions/BinaryToHexadecimal.java b/src/main/java/com/conversions/BinaryToHexadecimal.java index 199a52d..8497fa2 100644 --- a/src/main/java/com/conversions/BinaryToHexadecimal.java +++ b/src/main/java/com/conversions/BinaryToHexadecimal.java @@ -2,43 +2,51 @@ import java.math.BigInteger; import java.util.HashMap; +import java.util.Map; + public class BinaryToHexadecimal { + /** + * hm to store hexadecimal codes for binary numbers + * within the range: 0000 to 1111 i.e. for decimal numbers 0 to 15 + */ + private static Map hmHexadecimal = new HashMap<>(16); + + static { + int i; + for (i = 0; i < 10; i++) + hmHexadecimal.put(i, String.valueOf(i)); + + for (i = 10; i < 16; i++) + hmHexadecimal.put(i, String.valueOf((char) ('A' + i - 10))); + } + /** * This method converts a binary number to * a hexadecimal number. * - * @param binary The binary number + * @param binStr The binary number * @return The hexadecimal number */ - public String binToHex(BigInteger binary) { - //hm to store hexadecimal codes for binary numbers within the range: 0000 to 1111 i.e. for decimal numbers 0 to 15 - HashMap hmHexadecimal = new HashMap<>(); + public String binToHex(String binStr) { + BigInteger binary = new BigInteger(binStr); + // String to store hexadecimal code + String hex = ""; - //String to store hexadecimal code - String hex=""; - int i; - for(i=0 ; i<10 ; i++) - hmHexadecimal.put(i, String.valueOf(i)); - - for(i=10 ; i<16 ; i++) - hmHexadecimal.put(i,String.valueOf((char)('A'+i-10))); - - int currentbit; + int currentBit; BigInteger tenValue = new BigInteger("10"); - while(binary.compareTo(BigInteger.ZERO) != 0) { - int code4 = 0; //to store decimal equivalent of number formed by 4 decimal digits - for(i=0 ; i<4 ; i++) - { - currentbit = binary.mod(tenValue).intValueExact(); + while (binary.compareTo(BigInteger.ZERO) != 0) { + // to store decimal equivalent of number formed by 4 decimal digits + int code4 = 0; + for (int i = 0; i < 4; i++) { + currentBit = binary.mod(tenValue).intValueExact(); binary = binary.divide(tenValue); - code4 += currentbit*Math.pow(2, i); + code4 += currentBit * Math.pow(2, i); } - hex= hmHexadecimal.get(code4) + hex; + hex = hmHexadecimal.get(code4) + hex; } return hex; - } -} \ No newline at end of file +} From 4f1fceeb7f6fdc24b1d67b9b22efb03c9e57acd5 Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Wed, 30 Jan 2019 17:08:22 +0800 Subject: [PATCH 040/120] Update BinaryToHexadecimalTest.java --- .../java/com/conversions/BinaryToHexadecimalTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/conversions/BinaryToHexadecimalTest.java b/src/test/java/com/conversions/BinaryToHexadecimalTest.java index 67d93b9..801366c 100644 --- a/src/test/java/com/conversions/BinaryToHexadecimalTest.java +++ b/src/test/java/com/conversions/BinaryToHexadecimalTest.java @@ -9,8 +9,8 @@ public class BinaryToHexadecimalTest { @Test public void testBinaryToHexadecimal(){ BinaryToHexadecimal binaryToHexadecimal = new BinaryToHexadecimal(); - Assert.assertEquals("Incorrect Conversion", "2A", binaryToHexadecimal.binToHex(new BigInteger("101010"))); - Assert.assertEquals("Incorrect Conversion", "24", binaryToHexadecimal.binToHex(new BigInteger("100100"))); - Assert.assertEquals("Incorrect Conversion", "AAAAAAAAAAAAAAAAAA1", binaryToHexadecimal.binToHex(new BigInteger("1010101010101010101010101010101010101010101010101010101010101010101010100001"))); + Assert.assertEquals("Incorrect Conversion", "2A", binaryToHexadecimal.binToHex("101010")); + Assert.assertEquals("Incorrect Conversion", "24", binaryToHexadecimal.binToHex("100100")); + Assert.assertEquals("Incorrect Conversion", "AAAAAAAAAAAAAAAAAA1", binaryToHexadecimal.binToHex("1010101010101010101010101010101010101010101010101010101010101010101010100001")); } -} \ No newline at end of file +} From c7f8f772c056f8c5a84d1fd448b5fdde1b5be1c8 Mon Sep 17 00:00:00 2001 From: Adan Rodriguez Date: Wed, 30 Jan 2019 11:23:42 -0300 Subject: [PATCH 041/120] conversion decimal to hexadecimal --- .../com/conversions/DecimalToHexadecimal.java | 26 +++++++++++++++++++ .../conversions/DecimalToHexadecimalTest.java | 17 ++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 src/main/java/com/conversions/DecimalToHexadecimal.java create mode 100644 src/test/java/com/conversions/DecimalToHexadecimalTest.java diff --git a/src/main/java/com/conversions/DecimalToHexadecimal.java b/src/main/java/com/conversions/DecimalToHexadecimal.java new file mode 100644 index 0000000..e41b825 --- /dev/null +++ b/src/main/java/com/conversions/DecimalToHexadecimal.java @@ -0,0 +1,26 @@ +package src.main.java.com.conversions; + +import java.math.BigInteger; + +public class DecimalToHexadecimal { + private static final char hexChars[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + private static final BigInteger valueHex = new BigInteger("16"); + + /** + * This method converts and decimal number to a Hexadecimal number + * @param decimalStr + * @return hexadecimal number + */ + public String decimalToHex(String decimalStr){ + BigInteger decimal = new BigInteger(decimalStr); + + int rem; + String hex = ""; + while(decimal.compareTo(BigInteger.ZERO) > 0) { + rem = decimal.mod(valueHex).intValueExact(); + hex = hexChars[rem] + hex; + decimal = decimal.divide(valueHex); + } + return hex; + } +} diff --git a/src/test/java/com/conversions/DecimalToHexadecimalTest.java b/src/test/java/com/conversions/DecimalToHexadecimalTest.java new file mode 100644 index 0000000..6a9540e --- /dev/null +++ b/src/test/java/com/conversions/DecimalToHexadecimalTest.java @@ -0,0 +1,17 @@ +package src.test.java.com.conversions; + +import org.junit.Assert; +import org.junit.Test; + +public class DecimalToHexadecimalTest { + + @Test + public void testDecimalToHexadecimalTest() { + DecimalToHexadecimal decimalToHexadecimal = new DecimalToHexadecimal(); + Assert.assertEquals("Incorrect Conversion", "F", decimalToHexadecimal.decimalToHex("15")); + Assert.assertEquals("Incorrect Conversion", "121", decimalToHexadecimal.decimalToHex("289")); + Assert.assertEquals("Incorrect Conversion", "AAAAAAAAAAAAAAAAAA1", decimalToHexadecimal.decimalToHex("50371909150609548946081")); + Assert.assertEquals("Incorrect Conversion", "A", decimalToHexadecimal.decimalToHex("10")); + Assert.assertEquals("Incorrect Conversion", "8B2F", decimalToHexadecimal.decimalToHex("35631")); + } +} \ No newline at end of file From a3b4e1421a53c729dd4a9940cc05abe6be16beba Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Thu, 31 Jan 2019 21:09:03 +0800 Subject: [PATCH 042/120] Update DecimalToHexadecimal.java --- src/main/java/com/conversions/DecimalToHexadecimal.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/conversions/DecimalToHexadecimal.java b/src/main/java/com/conversions/DecimalToHexadecimal.java index e41b825..cce2666 100644 --- a/src/main/java/com/conversions/DecimalToHexadecimal.java +++ b/src/main/java/com/conversions/DecimalToHexadecimal.java @@ -16,7 +16,7 @@ public String decimalToHex(String decimalStr){ int rem; String hex = ""; - while(decimal.compareTo(BigInteger.ZERO) > 0) { + while (decimal.compareTo(BigInteger.ZERO) > 0) { rem = decimal.mod(valueHex).intValueExact(); hex = hexChars[rem] + hex; decimal = decimal.divide(valueHex); From df085d0e1dee6952f45512511a4e3a97a2368f29 Mon Sep 17 00:00:00 2001 From: Adan Rodriguez Date: Sun, 3 Feb 2019 17:39:11 -0300 Subject: [PATCH 043/120] convert decimal to octal value --- .../java/com/conversions/DecimalToOctal.java | 26 +++++++++++++++++++ .../com/conversions/DecimalToOctalTest.java | 16 ++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/com/conversions/DecimalToOctal.java create mode 100644 src/test/java/com/conversions/DecimalToOctalTest.java diff --git a/src/main/java/com/conversions/DecimalToOctal.java b/src/main/java/com/conversions/DecimalToOctal.java new file mode 100644 index 0000000..743b0e0 --- /dev/null +++ b/src/main/java/com/conversions/DecimalToOctal.java @@ -0,0 +1,26 @@ +package src.main.java.com.conversions; + +import java.math.BigInteger; + +public class DecimalToOctal { + private static final char octalChars[] = {'0','1','2','3','4','5','6','7'}; + private static final BigInteger valueOctal = new BigInteger("8"); + + /** + * This method converts and decimal number to a octal number + * @param decimalStr + * @return octal number + */ + public String decimalToOctal(String decimalStr){ + BigInteger decimal = new BigInteger(decimalStr); + + int rem; + String octal = ""; + while(decimal.compareTo(BigInteger.ZERO) > 0) { + rem = decimal.mod(valueOctal).intValueExact(); + octal = octalChars[rem] + octal; + decimal = decimal.divide(valueOctal); + } + return octal; + } +} diff --git a/src/test/java/com/conversions/DecimalToOctalTest.java b/src/test/java/com/conversions/DecimalToOctalTest.java new file mode 100644 index 0000000..1916b7e --- /dev/null +++ b/src/test/java/com/conversions/DecimalToOctalTest.java @@ -0,0 +1,16 @@ +package src.test.java.com.conversions; + +import org.junit.Assert; +import org.junit.Test; + +public class DecimalToOctalTest { + @Test + public void testDecimalToOctalTest() { + DecimalToOctal decimalToOctal = new DecimalToOctal(); + Assert.assertEquals("Incorrect Conversion", "41", decimalToOctal.decimalToOctal("33")); + Assert.assertEquals("Incorrect Conversion", "5512", decimalToOctal.decimalToOctal("2890")); + Assert.assertEquals("Incorrect Conversion", "12525252525252525252525241", decimalToOctal.decimalToOctal("50371909150609548946081")); + Assert.assertEquals("Incorrect Conversion", "13", decimalToOctal.decimalToOctal("11")); + Assert.assertEquals("Incorrect Conversion", "46703754", decimalToOctal.decimalToOctal("10192876")); + } +} From 5c946119e793bc38ef7c87a7ad7094cb033fabfc Mon Sep 17 00:00:00 2001 From: crackCodeLogn Date: Wed, 13 Feb 2019 02:18:01 +0530 Subject: [PATCH 044/120] Making the median calculating part safe from integer spillovers --- src/main/java/com/search/BinarySearch.java | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/search/BinarySearch.java b/src/main/java/com/search/BinarySearch.java index 231490a..d7d365d 100644 --- a/src/main/java/com/search/BinarySearch.java +++ b/src/main/java/com/search/BinarySearch.java @@ -2,38 +2,38 @@ /** * Binary search is an algorithm which finds the position of a target value within a sorted array - * + *

* Worst-case performance O(log n) * Best-case performance O(1) * Average performance O(log n) * Worst-case space complexity O(1) */ -public final class BinarySearch{ +public final class BinarySearch { /** * @param array is an array where the element should be found - * @param key is an element which should be found - * @param is any comparable type + * @param key is an element which should be found + * @param is any comparable type * @return index of the element */ - public static > int findIndex(T array[], T key) { - return search(array, key, 0, array.length-1); + public static > int findIndex(T[] array, T key) { + return search(array, key, 0, array.length - 1); } /** * @param array The array to search - * @param key The element you are looking for - * @param left The lower bound + * @param key The element you are looking for + * @param left The lower bound * @param right The upper bound * @return the location of the key **/ - private static > int search(T array[], T key, int left, int right){ + private static > int search(T[] array, T key, int left, int right) { if (left > right) { return -1; // Key not found } // Find median - int median = (left + right)/2; + int median = left + (right - left) / 2; int comp = key.compareTo(array[median]); if (comp < 0) { From a0235424641490793cd699ac9cc34a3343e9a5cb Mon Sep 17 00:00:00 2001 From: asri71 Date: Thu, 28 Feb 2019 16:57:18 +0530 Subject: [PATCH 045/120] Addint type package to have interfaces to take benefit of polymorphism features --- src/main/java/com/sorts/BubbleSort.java | 6 +++++- src/main/java/com/types/Sort.java | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/types/Sort.java diff --git a/src/main/java/com/sorts/BubbleSort.java b/src/main/java/com/sorts/BubbleSort.java index 8179355..c532a64 100644 --- a/src/main/java/com/sorts/BubbleSort.java +++ b/src/main/java/com/sorts/BubbleSort.java @@ -1,12 +1,16 @@ package src.main.java.com.sorts; -public class BubbleSort { +import src.main.java.com.types.Sort; + +public class BubbleSort implements Sort { /** * This method implements the Generic Bubble Sort * * @param array The array to be sorted * Sorts the array in increasing order **/ + + @Override public > T[] sort(T[] array) { int last = array.length; //Sorting diff --git a/src/main/java/com/types/Sort.java b/src/main/java/com/types/Sort.java new file mode 100644 index 0000000..ea919e2 --- /dev/null +++ b/src/main/java/com/types/Sort.java @@ -0,0 +1,6 @@ +package src.main.java.com.types; + +public interface Sort { + + public > T[] sort(T[] array); +} From ed53bd0353b6ad4bf098fd6d5435fba018282631 Mon Sep 17 00:00:00 2001 From: asri71 Date: Thu, 28 Feb 2019 17:10:08 +0530 Subject: [PATCH 046/120] Making Sort interface as functional interface to exhibit the nature and functionality of the interface more clearly to client --- src/main/java/com/types/Sort.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/types/Sort.java b/src/main/java/com/types/Sort.java index ea919e2..da89756 100644 --- a/src/main/java/com/types/Sort.java +++ b/src/main/java/com/types/Sort.java @@ -1,5 +1,6 @@ package src.main.java.com.types; +@FunctionalInterface public interface Sort { public > T[] sort(T[] array); From c8ee96d9d5a13cb01eef5ec710f190cdd9c77e2a Mon Sep 17 00:00:00 2001 From: asri71 Date: Tue, 5 Mar 2019 15:59:13 +0530 Subject: [PATCH 047/120] Adding Linked List based General queue implementation --- .../java/com/dataStructures/GeneralQueue.java | 142 ++++++++++++++++++ src/main/java/com/types/DataStructure.java | 31 ++++ src/main/java/com/types/Queue.java | 25 +++ .../com/dataStructures/GeneralQueueTest.java | 45 ++++++ 4 files changed, 243 insertions(+) create mode 100644 src/main/java/com/dataStructures/GeneralQueue.java create mode 100644 src/main/java/com/types/DataStructure.java create mode 100644 src/main/java/com/types/Queue.java create mode 100644 src/test/java/com/dataStructures/GeneralQueueTest.java diff --git a/src/main/java/com/dataStructures/GeneralQueue.java b/src/main/java/com/dataStructures/GeneralQueue.java new file mode 100644 index 0000000..ebb9230 --- /dev/null +++ b/src/main/java/com/dataStructures/GeneralQueue.java @@ -0,0 +1,142 @@ +package src.main.java.com.dataStructures; + +import src.main.java.com.types.Queue; + +import java.util.Iterator; +import java.util.LinkedList; + +/** + * linkedList based implementation of queue. + * This implementation is not thread safe and need exclusive thread safety measures from the client. + * @param + */ +public class GeneralQueue implements Queue { + + private LinkedList queue; + private Iterator itr; + + //Overloaded constructor to create queue of specific size + public GeneralQueue() { + queue = new LinkedList<>(); + } + + @Override + public boolean add(T t) { + + if(queue == null) { + throw new NullPointerException(); + } + + queue.add(t); + return true; + } + + @Override + public boolean remove(T t) { + if(null == queue || queue.size() == 0){ + throw new NullPointerException(); + } + queue.remove(t); + return true; + } + + @Override + public boolean isEmpty() { + + if(null == queue || queue.size() == 0){ + return true; + } + + return false; + } + + @Override + public Iterator iterator() { + + if(queue == null) { + return null; + } + itr = queue.iterator(); + return itr; + } + + @Override + public boolean offer(T t) { + if(null == queue) { + return false; + } + + queue.add(t); + return true; + } + + @Override + public T poll() { + + if(queue == null || queue.isEmpty()){ + return null; + } + + return queue.pollFirst(); + } + + @Override + public T element() { + + if(queue == null || queue.isEmpty()) { + throw new NullPointerException(); + } + + return queue.peekFirst(); + } + + @Override + public T peek() { + if(null == queue || queue.size() == 0){ + return null; + } + + return queue.peekFirst(); + } + + @Override + public boolean hasNext() { + + if(itr.hasNext()){ + return true; + } + return false; + } + + @Override + public T next() { + + return itr.next(); + } + + @Override + public Object[] toArray() { + + Object[] elements = {}; + if(null == queue || queue.isEmpty()){ + return elements; + } + elements = new Object[queue.size()]; + for(int i=0;i + */ +public interface DataStructure extends Iterator { + + //Method to add element in the structure + public boolean add(T t); + + //Method to remove the given object from structure + public boolean remove(T o); + + //Method to get Iterator to parse on the given structure + public Iterator iterator(); + + //Method to check if structure is empty + public boolean isEmpty(); + + //Method to get all the elements of data structure in array + public Object[] toArray(); + + //Method to get the size or number of elements in structure + public int size(); + +} diff --git a/src/main/java/com/types/Queue.java b/src/main/java/com/types/Queue.java new file mode 100644 index 0000000..a247b34 --- /dev/null +++ b/src/main/java/com/types/Queue.java @@ -0,0 +1,25 @@ +package src.main.java.com.types; + + +/** + * Interface to provide queue specific functionality to the implementing class + * This interface only defines the functionality which the queue implementing classes require. + * Any class having queue behaviour should implement this interface and override all of its methods + * @param + */ +public interface Queue extends DataStructure { + + //Method to add element + public boolean offer(T t); + + //Method to remove element + public T poll(); + + //Method to check element on head + public T peek(); + + //Method to check element on head. This throws exception on runtime if the queue is empty + public T element(); + + +} diff --git a/src/test/java/com/dataStructures/GeneralQueueTest.java b/src/test/java/com/dataStructures/GeneralQueueTest.java new file mode 100644 index 0000000..4bb07a3 --- /dev/null +++ b/src/test/java/com/dataStructures/GeneralQueueTest.java @@ -0,0 +1,45 @@ +package src.test.java.com.dataStructures; + + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.dataStructures.GeneralQueue; +import src.main.java.com.types.Queue; + +public class GeneralQueueTest { + + @Test + public void testGeneralQueue() { + + Queue myQueue = new GeneralQueue<>(); + myQueue.add(10); + myQueue.add(20); + myQueue.add(30); + myQueue.add(40); + myQueue.add(50); + + + Object[] myArray = myQueue.toArray(); + Assert.assertEquals(myArray.length, myQueue.size()); + + myQueue.remove(20); + Assert.assertEquals(myQueue.size(), 4); + + Boolean isEmpty = myQueue.isEmpty(); + Assert.assertEquals(Boolean.valueOf("false"), Boolean.valueOf(isEmpty)); + + myQueue.offer(60); + Assert.assertEquals(5, myQueue.size()); + + int polledElement = myQueue.poll(); + Assert.assertEquals(10, polledElement); + + int element = myQueue.element(); + Assert.assertEquals(30, element); + + myQueue.poll(); + int peekedElement = myQueue.peek(); + Assert.assertEquals(40, peekedElement); + + } +} From 320b5de0fee4c623e76635d0ba6fe31b00b67a50 Mon Sep 17 00:00:00 2001 From: asri71 Date: Tue, 5 Mar 2019 17:05:11 +0530 Subject: [PATCH 048/120] Making changes into method as per Oracle specifications --- .../java/com/dataStructures/GeneralQueue.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/dataStructures/GeneralQueue.java b/src/main/java/com/dataStructures/GeneralQueue.java index ebb9230..9098c71 100644 --- a/src/main/java/com/dataStructures/GeneralQueue.java +++ b/src/main/java/com/dataStructures/GeneralQueue.java @@ -4,6 +4,7 @@ import java.util.Iterator; import java.util.LinkedList; +import java.util.NoSuchElementException; /** * linkedList based implementation of queue. @@ -24,18 +25,23 @@ public GeneralQueue() { public boolean add(T t) { if(queue == null) { - throw new NullPointerException(); + throw new IllegalStateException(); + } + if(t == null){ + throw new NullPointerException(); } - queue.add(t); return true; } @Override public boolean remove(T t) { - if(null == queue || queue.size() == 0){ + if(null == queue){ throw new NullPointerException(); } + if(queue.isEmpty()) { + throw new NoSuchElementException(); + } queue.remove(t); return true; } @@ -65,7 +71,9 @@ public boolean offer(T t) { if(null == queue) { return false; } - + if(t == null){ + throw new NullPointerException(); + } queue.add(t); return true; } @@ -84,7 +92,7 @@ public T poll() { public T element() { if(queue == null || queue.isEmpty()) { - throw new NullPointerException(); + throw new NoSuchElementException(); } return queue.peekFirst(); From 5ce337fa54373fd984fe00b42e06a8300e5249b0 Mon Sep 17 00:00:00 2001 From: asri71 Date: Tue, 5 Mar 2019 17:08:54 +0530 Subject: [PATCH 049/120] Code changes to adhere to code best practices --- src/main/java/com/types/Queue.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/types/Queue.java b/src/main/java/com/types/Queue.java index a247b34..11cfe78 100644 --- a/src/main/java/com/types/Queue.java +++ b/src/main/java/com/types/Queue.java @@ -1,6 +1,8 @@ package src.main.java.com.types; +import java.util.NoSuchElementException; + /** * Interface to provide queue specific functionality to the implementing class * This interface only defines the functionality which the queue implementing classes require. @@ -10,7 +12,7 @@ public interface Queue extends DataStructure { //Method to add element - public boolean offer(T t); + public boolean offer(T t) throws NullPointerException; //Method to remove element public T poll(); @@ -19,7 +21,7 @@ public interface Queue extends DataStructure { public T peek(); //Method to check element on head. This throws exception on runtime if the queue is empty - public T element(); + public T element() throws NoSuchElementException; } From 37b99ff6ddfc6f055d9c7916090d37515f559fca Mon Sep 17 00:00:00 2001 From: yanglbme Date: Wed, 6 Mar 2019 08:57:42 +0800 Subject: [PATCH 050/120] Update GeneralQueue.java --- .../java/com/dataStructures/GeneralQueue.java | 58 +++++++------------ 1 file changed, 22 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/dataStructures/GeneralQueue.java b/src/main/java/com/dataStructures/GeneralQueue.java index 9098c71..a141ab1 100644 --- a/src/main/java/com/dataStructures/GeneralQueue.java +++ b/src/main/java/com/dataStructures/GeneralQueue.java @@ -9,6 +9,7 @@ /** * linkedList based implementation of queue. * This implementation is not thread safe and need exclusive thread safety measures from the client. + * * @param */ public class GeneralQueue implements Queue { @@ -16,7 +17,9 @@ public class GeneralQueue implements Queue { private LinkedList queue; private Iterator itr; - //Overloaded constructor to create queue of specific size + /** + * Overloaded constructor to create queue of specific size + */ public GeneralQueue() { queue = new LinkedList<>(); } @@ -24,11 +27,11 @@ public GeneralQueue() { @Override public boolean add(T t) { - if(queue == null) { + if (queue == null) { throw new IllegalStateException(); } - if(t == null){ - throw new NullPointerException(); + if (t == null) { + throw new NullPointerException(); } queue.add(t); return true; @@ -36,10 +39,10 @@ public boolean add(T t) { @Override public boolean remove(T t) { - if(null == queue){ + if (null == queue) { throw new NullPointerException(); } - if(queue.isEmpty()) { + if (queue.isEmpty()) { throw new NoSuchElementException(); } queue.remove(t); @@ -48,18 +51,12 @@ public boolean remove(T t) { @Override public boolean isEmpty() { - - if(null == queue || queue.size() == 0){ - return true; - } - - return false; + return null == queue || queue.size() == 0; } @Override public Iterator iterator() { - - if(queue == null) { + if (queue == null) { return null; } itr = queue.iterator(); @@ -68,10 +65,10 @@ public Iterator iterator() { @Override public boolean offer(T t) { - if(null == queue) { + if (null == queue) { return false; } - if(t == null){ + if (t == null) { throw new NullPointerException(); } queue.add(t); @@ -80,9 +77,8 @@ public boolean offer(T t) { @Override public T poll() { - - if(queue == null || queue.isEmpty()){ - return null; + if (queue == null || queue.isEmpty()) { + return null; } return queue.pollFirst(); @@ -90,8 +86,7 @@ public T poll() { @Override public T element() { - - if(queue == null || queue.isEmpty()) { + if (queue == null || queue.isEmpty()) { throw new NoSuchElementException(); } @@ -100,8 +95,8 @@ public T element() { @Override public T peek() { - if(null == queue || queue.size() == 0){ - return null; + if (null == queue || queue.size() == 0) { + return null; } return queue.peekFirst(); @@ -109,28 +104,22 @@ public T peek() { @Override public boolean hasNext() { - - if(itr.hasNext()){ - return true; - } - return false; + return itr.hasNext(); } @Override public T next() { - return itr.next(); } @Override public Object[] toArray() { - Object[] elements = {}; - if(null == queue || queue.isEmpty()){ + if (null == queue || queue.isEmpty()) { return elements; } elements = new Object[queue.size()]; - for(int i=0;i Date: Wed, 6 Mar 2019 08:58:11 +0800 Subject: [PATCH 051/120] Update DataStructure.java --- src/main/java/com/types/DataStructure.java | 62 +++++++++++++++------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/types/DataStructure.java b/src/main/java/com/types/DataStructure.java index 99fa871..e1ffe04 100644 --- a/src/main/java/com/types/DataStructure.java +++ b/src/main/java/com/types/DataStructure.java @@ -6,26 +6,52 @@ * This interface is to define bacis functionality expected out of any implementation class * Since this is a data structure it should have the flexibility to contain any kind of object hence it has been made generic * Any implementation class need not to be thread safe or it could be depending on the implementation class how does it want to behave. + * * @param */ public interface DataStructure extends Iterator { - //Method to add element in the structure - public boolean add(T t); - - //Method to remove the given object from structure - public boolean remove(T o); - - //Method to get Iterator to parse on the given structure - public Iterator iterator(); - - //Method to check if structure is empty - public boolean isEmpty(); - - //Method to get all the elements of data structure in array - public Object[] toArray(); - - //Method to get the size or number of elements in structure - public int size(); - + /** + * Method to add element in the structure + * + * @param t element + * @return boolean + */ + boolean add(T t); + + /** + * Method to remove the given object from structure + * + * @param o element + * @return boolean + */ + boolean remove(T o); + + /** + * Method to get Iterator to parse on the given structure + * + * @return iterator + */ + Iterator iterator(); + + /** + * Method to check if structure is empty + * + * @return boolean + */ + boolean isEmpty(); + + /** + * Method to get all the elements of data structure in array + * + * @return arr + */ + Object[] toArray(); + + /** + * Method to get the size or number of elements in structure + * + * @return size + */ + int size(); } From 481be6290cadf4303225b68557685d058178c8c9 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Wed, 6 Mar 2019 08:58:35 +0800 Subject: [PATCH 052/120] Update Queue.java --- src/main/java/com/types/Queue.java | 44 +++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/types/Queue.java b/src/main/java/com/types/Queue.java index 11cfe78..19c74e6 100644 --- a/src/main/java/com/types/Queue.java +++ b/src/main/java/com/types/Queue.java @@ -7,21 +7,39 @@ * Interface to provide queue specific functionality to the implementing class * This interface only defines the functionality which the queue implementing classes require. * Any class having queue behaviour should implement this interface and override all of its methods + * * @param */ public interface Queue extends DataStructure { - //Method to add element - public boolean offer(T t) throws NullPointerException; - - //Method to remove element - public T poll(); - - //Method to check element on head - public T peek(); - - //Method to check element on head. This throws exception on runtime if the queue is empty - public T element() throws NoSuchElementException; - - + /** + * Method to add element + * + * @param t element + * @return boolean + * @throws NullPointerException + */ + boolean offer(T t) throws NullPointerException; + + /** + * Method to remove element + * + * @return element + */ + T poll(); + + /** + * Method to check element on head + * + * @return element + */ + T peek(); + + /** + * Method to check element on head. This throws exception on runtime if the queue is empty + * + * @return element + * @throws NoSuchElementException + */ + T element() throws NoSuchElementException; } From 61bb8b3aab13b439c9ede32aca8b3c9f2ebdf4bf Mon Sep 17 00:00:00 2001 From: yanglbme Date: Wed, 6 Mar 2019 09:01:55 +0800 Subject: [PATCH 053/120] Update DecimalToHexadecimalTest.java --- src/test/java/com/conversions/DecimalToHexadecimalTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/conversions/DecimalToHexadecimalTest.java b/src/test/java/com/conversions/DecimalToHexadecimalTest.java index 6a9540e..765acb8 100644 --- a/src/test/java/com/conversions/DecimalToHexadecimalTest.java +++ b/src/test/java/com/conversions/DecimalToHexadecimalTest.java @@ -2,6 +2,7 @@ import org.junit.Assert; import org.junit.Test; +import src.main.java.com.conversions.DecimalToHexadecimal; public class DecimalToHexadecimalTest { @@ -14,4 +15,4 @@ public void testDecimalToHexadecimalTest() { Assert.assertEquals("Incorrect Conversion", "A", decimalToHexadecimal.decimalToHex("10")); Assert.assertEquals("Incorrect Conversion", "8B2F", decimalToHexadecimal.decimalToHex("35631")); } -} \ No newline at end of file +} From c2e2402e216833891ae207a9fc13d10c0d74082b Mon Sep 17 00:00:00 2001 From: yanglbme Date: Wed, 6 Mar 2019 09:02:22 +0800 Subject: [PATCH 054/120] Update DecimalToOctalTest.java --- src/test/java/com/conversions/DecimalToOctalTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/com/conversions/DecimalToOctalTest.java b/src/test/java/com/conversions/DecimalToOctalTest.java index 1916b7e..74a1094 100644 --- a/src/test/java/com/conversions/DecimalToOctalTest.java +++ b/src/test/java/com/conversions/DecimalToOctalTest.java @@ -2,6 +2,7 @@ import org.junit.Assert; import org.junit.Test; +import src.main.java.com.conversions.DecimalToOctal; public class DecimalToOctalTest { @Test From 7842c01bed1fbbe6826d9aea72f95eb88c270311 Mon Sep 17 00:00:00 2001 From: yangxf Date: Wed, 13 Mar 2019 09:52:46 +0800 Subject: [PATCH 055/120] add BloomFilter --- src/main/java/com/search/BloomFilter.java | 190 ++++++++++++++++++ src/test/java/com/search/BloomFilterTest.java | 70 +++++++ 2 files changed, 260 insertions(+) create mode 100644 src/main/java/com/search/BloomFilter.java create mode 100644 src/test/java/com/search/BloomFilterTest.java diff --git a/src/main/java/com/search/BloomFilter.java b/src/main/java/com/search/BloomFilter.java new file mode 100644 index 0000000..122a302 --- /dev/null +++ b/src/main/java/com/search/BloomFilter.java @@ -0,0 +1,190 @@ +package src.main.java.com.search; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +/** + * A simple implementation of Bloom filter. + *

+ * Bloom filter have a chance of being wrong. + *

+ * The Bloom filter assert that elements that do not exist must not exist, + * if assert an element exists, but not necessarily. + *

+ * The accuracy rate depends on capacity and hash functions. + * + * @author yangxf + */ +public class BloomFilter implements Serializable { + private static final long serialVersionUID = -4466610350741278658L; + + private static final int LONG_SHIFT = 6; + private static final int LONG_MASK = 63; + + /** + * hash functions + */ + private final List> hashFunctions; + + private final long[] table; + private final int tableMask; + private int size; + + /** + * @param capacity the filter capacity + * @param hashFunctions hash functions + * @see Builder must be build by {@link Builder}. + */ + private BloomFilter(int capacity, List> hashFunctions) { + this.hashFunctions = hashFunctions; + int cap = nextPowerOf2(capacity); + tableMask = (cap << LONG_SHIFT) - 1; + table = new long[cap]; + } + + public static Builder builder(int capacity) { + if (capacity < 1) { + throw new IllegalStateException("capacity must be > 0"); + } + + return new Builder(capacity); + } + + /** + * Add an element to the Bloom filter. + */ + public void add(String element) { + checkNotNull(element, "element"); + + for (Function hashFunction : hashFunctions) { + int key = hashFunction.apply(element) & tableMask; + table[key >>> LONG_SHIFT] |= (1 << (key & LONG_MASK)); + } + size++; + } + + /** + * @return true if the element exists, otherwise false. + */ + public boolean contains(String element) { + if (element == null) { + return false; + } + + for (Function hashFunction : hashFunctions) { + int key = hashFunction.apply(element) & tableMask; + if ((table[key >>> LONG_SHIFT] & (1 << (key & LONG_MASK))) == 0) { + return false; + } + } + return true; + } + + public List> getHashFunctions() { + return hashFunctions; + } + + public int size() { + return size; + } + + private static void checkNotNull(String element, String msg) { + if (element == null) { + throw new NullPointerException(msg + " must be not null"); + } + } + + private static int nextPowerOf2(int i) { + int n = i - 1; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + return (n < 0) ? 1 : (n >= 0x40000000) ? 0x40000000 : n + 1; + } + + /** + * We need a list of unmodifiable hash functions. + */ + public static class Builder { + private int capacity; + private List> hashFunctions = new ArrayList<>(); + + private Builder(int capacity) { + this.capacity = capacity; + } + + public Builder addHashFunction(Function function) { + hashFunctions.add(function); + return this; + } + + public BloomFilter build() { + if (hashFunctions.isEmpty()) { + addDefaultHashFunction(); + } + return new BloomFilter(capacity, Collections.unmodifiableList(hashFunctions)); + } + + /** + * I provides several default hash functions + */ + private void addDefaultHashFunction() { + // Java String Hash Function + hashFunctions.add(String::hashCode); + + // SDBM Hash Function + hashFunctions.add(key -> { + if (key == null || key.isEmpty()) { + return 0; + } + + int hash = 0; + for (int i = 0; i < key.length(); i++) { + hash = key.charAt(i) + (hash << 6) + (hash << 16) - hash; + } + hash &= 0x7ffffff; + return hash; + }); + + // Robert Sedgwicks Hash Function + hashFunctions.add(key -> { + if (key == null || key.isEmpty()) { + return 0; + } + + int hash = 0; + int magic = 63689; + for (int i = 0; i < key.length(); i++) { + hash = hash * magic + key.charAt(i); + magic *= 378551; + } + return hash; + }); + + // Arash Partow Hash Function + hashFunctions.add(key -> { + if (key == null || key.isEmpty()) { + return 0; + } + + int hash = 0; + for (int i = 0; i < key.length(); i++) { + char ch = key.charAt(i); + if ((i & 1) == 0) { + hash ^= ((hash << 7) ^ ch ^ (hash >> 3)); + } else { + hash ^= (~((hash << 11) ^ ch ^ (hash >> 5))); + } + } + return hash; + }); + } + + } + +} diff --git a/src/test/java/com/search/BloomFilterTest.java b/src/test/java/com/search/BloomFilterTest.java new file mode 100644 index 0000000..0d12b91 --- /dev/null +++ b/src/test/java/com/search/BloomFilterTest.java @@ -0,0 +1,70 @@ +package src.test.java.com.search; + +import org.junit.Test; +import src.main.java.com.search.BloomFilter; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +import static org.junit.Assert.*; + +public class BloomFilterTest { + + @Test + public void test() { + int count = 100000; + int low = 50, up = 100; + BloomFilter filter = BloomFilter.builder(10000).build(); + String[] data = new String[count]; + Set dataSet = new HashSet<>(); + for (int i = 0; i < count; i++) { + String str = randomString(low, up); + data[i] = str; + if (i % 2 == 0) { + dataSet.add(str); + filter.add(str); + } + } + + int error = 0, total = 0; + for (int i = 0; i < count; i++) { + String str = data[i]; + if (filter.contains(str)) { + total++; + if (!dataSet.contains(str)) { + error++; + } + } else { + assertFalse(dataSet.contains(str)); + } + } + System.out.println("error: " + error); + System.out.println("total: " + total); + System.out.println("error rate : " + (double) error / total); + } + + public static String randomString(int minLength, int maxLength) { + ThreadLocalRandom r = ThreadLocalRandom.current(); + int chLen = r.nextInt(minLength, maxLength), + poolSize = CHAR_POOL.length; + char[] chars = new char[chLen]; + for (int i = 0; i < chLen; i++) { + chars[i] = CHAR_POOL[r.nextInt(poolSize)]; + } + + return new String(chars); + } + + private static final char[] CHAR_POOL; + + static { + CHAR_POOL = new char[52]; + int i = 0; + for (char c = 'a'; c <= 'z'; c++) { + CHAR_POOL[i++] = c; + CHAR_POOL[i++] = (char) (c - 32); + } + } + +} \ No newline at end of file From 01b0296dad7b601605ed6b34ad00a77226bbb907 Mon Sep 17 00:00:00 2001 From: yangxf Date: Fri, 15 Mar 2019 10:03:42 +0800 Subject: [PATCH 056/120] added an implementation of disjoint-set --- .../java/com/dataStructures/DisjointSet.java | 136 ++++++++++++++++++ .../com/dataStructures/DisjointSetTest.java | 34 +++++ 2 files changed, 170 insertions(+) create mode 100644 src/main/java/com/dataStructures/DisjointSet.java create mode 100644 src/test/java/com/dataStructures/DisjointSetTest.java diff --git a/src/main/java/com/dataStructures/DisjointSet.java b/src/main/java/com/dataStructures/DisjointSet.java new file mode 100644 index 0000000..c2a59c3 --- /dev/null +++ b/src/main/java/com/dataStructures/DisjointSet.java @@ -0,0 +1,136 @@ +package src.main.java.com.dataStructures; + +import java.io.Serializable; +import java.util.*; + +/** + * An implementation of disjoint-set, represented by rooted trees. + *

+ * Actually, the instance of {@link DisjointSet} is a disjoint-set forests. + * + *

+ * Disjoint-set operations: + *

+ * 1. quickly unites two sets into a new set, requiring O(1) time. + *

+ * 2. quickly query two elements whether contained in the same set, requiring about O(1) time. + * + * @author yangxf + */ +public class DisjointSet implements Serializable { + private static final long serialVersionUID = 3134700471905625636L; + + private Map> nodeMap = new HashMap<>(); + + /** + * Add an element to the disjoint-set forests as a set. + */ + public void makeSet(T element) { + checkNotNull(element, "element"); + nodeMap.putIfAbsent(element, new Node<>()); + } + + /** + * Unites the set that contains left and the set that contains right + * into a new set with the union-by-rank heuristic. + *

+ * Rank is an upper bound on the height of node. + */ + public void union(T left, T right) { + checkNotNull(left, "element"); + checkNotNull(right, "element"); + + Node leftNode = nodeMap.get(left), + rightNode = nodeMap.get(right); + + if (leftNode == null) { + throw new NoSuchElementException(left.toString()); + } + + if (rightNode == null) { + throw new NoSuchElementException(right.toString()); + } + + Node leftSet = findSet(leftNode), + rightSet = findSet(rightNode); + + if (leftSet == rightSet) { + return; + } + + if (leftSet.rank < rightSet.rank) { + leftSet.parent = rightSet; + } else { + rightSet.parent = leftSet; + if (leftSet.rank == rightSet.rank) { + leftSet.rank++; + } + } + } + + /** + * Query two elements whether contained in the same set. + */ + public boolean isConnected(T left, T right) { + if (left == null || right == null) { + return false; + } + + Node leftNode = nodeMap.get(left); + if (leftNode == null) { + return false; + } + + Node rightNode = nodeMap.get(right); + if (rightNode == null) { + return false; + } + + if (leftNode == rightNode) { + return true; + } + + return findSet(leftNode) == findSet(rightNode); + } + + public Collection> toSets() { + Map, Set> setMap = new HashMap<>(); + for (Map.Entry> entry : nodeMap.entrySet()) { + setMap.computeIfAbsent(findSet(entry.getValue()), k -> new HashSet<>()) + .add(entry.getKey()); + } + return setMap.values(); + } + + public void show() { + toSets().forEach(System.out::println); + } + + /** + * Find the set that contains the node, actual is the first node of the set. + *

+ * Backtracking with path compression. + */ + private Node findSet(Node node) { + if (node != node.parent) { + node.parent = findSet(node.parent); + } + return node.parent; + } + + private static void checkNotNull(Object obj, String msg) { + if (obj == null) { + throw new NullPointerException(msg + " must be not null"); + } + } + + static class Node { + int rank; + Node parent; + + Node() { + parent = this; + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/dataStructures/DisjointSetTest.java b/src/test/java/com/dataStructures/DisjointSetTest.java new file mode 100644 index 0000000..5f13190 --- /dev/null +++ b/src/test/java/com/dataStructures/DisjointSetTest.java @@ -0,0 +1,34 @@ +package src.test.java.com.dataStructures; + +import org.junit.Test; +import src.main.java.com.dataStructures.DisjointSet; + +import static org.junit.Assert.*; + +public class DisjointSetTest { + @Test + public void test() { + DisjointSet set = new DisjointSet<>(); + + set.makeSet("flink"); + set.makeSet("c++"); + set.makeSet("java"); + set.makeSet("py"); + set.makeSet("spark"); + + set.union("java", "c++"); + + assertTrue(set.isConnected("java", "c++")); + assertFalse(set.isConnected("java", "py")); + + set.union("c++", "py"); + assertTrue(set.isConnected("java", "py")); + + set.makeSet("lisp"); + set.union("lisp", "py"); + + assertTrue(set.isConnected("c++", "lisp")); + + set.show(); + } +} \ No newline at end of file From 5f2257017fc8719ba14d62a344e2e03c637cf476 Mon Sep 17 00:00:00 2001 From: asri71 Date: Sat, 16 Mar 2019 12:19:07 +0530 Subject: [PATCH 057/120] Adding Stack implementation along with test class --- src/main/java/com/dataStructures/Stack.java | 148 ++++++++++++++++++ .../java/com/dataStructures/StackTest.java | 119 ++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 src/main/java/com/dataStructures/Stack.java create mode 100644 src/test/java/com/dataStructures/StackTest.java diff --git a/src/main/java/com/dataStructures/Stack.java b/src/main/java/com/dataStructures/Stack.java new file mode 100644 index 0000000..5298d65 --- /dev/null +++ b/src/main/java/com/dataStructures/Stack.java @@ -0,0 +1,148 @@ +package src.main.java.com.dataStructures; + +import java.io.Serializable; +import java.util.EmptyStackException; +import java.util.Vector; + +public class Stack extends Vector implements Serializable { + + /** + * Inital capacity alloted to stack on object creation + */ + private final int INITIAL_CAPACITY = 10; + + /** + * Increment in memory space once stack is out of space + */ + private final int EXNTEDED_CAPACITY = 10; + + + /** + * Position of tail in stack + */ + + private int tail = -1; + + /** + * Size of stack at any given time + */ + + private int size; + + /** + * Uninitialized array to hold stack elements. + * WIll be intialized with inital capacity once the object is created + */ + private Object[] elements; + + /** + * No argument to create stack object with inital capacity + */ + public Stack() { + + elements = new Object[INITIAL_CAPACITY]; + } + + /** + * Method to check if the given stack is empty or not + */ + + public boolean empty() { + + if(null == elements) { + return true; + } + + if(size == 0){ + return true; + } + + return false; + } + + + /** + * Method to check the element on head without removing it + */ + + public Object peek() { + + if(empty()) { + throw new EmptyStackException(); + } + + return elements[tail]; + } + + /** + * Method to remove the top element from stack + */ + + public Object pop() { + + if(empty()) { + throw new EmptyStackException(); + } + + Object removedElement = elements[tail]; + tail--; + size--; + return removedElement; + } + + /** + * Method to add element to stack + */ + public Object push(Object e) { + + boolean isSuccess = false; + if(tail < (INITIAL_CAPACITY - 1)){ + tail++; + elements[tail] = e; + }else{ + Object[] extendedElements = new Object[INITIAL_CAPACITY + EXNTEDED_CAPACITY]; + System.arraycopy(elements, 0, extendedElements, 0, (tail+1)); + elements = extendedElements; + tail++; + elements[tail] = e; + } + size++; + return e; + + } + + /** + * Method to search for an element in stack + */ + + public int search(Object o) { + + int index = -1; + boolean found = false; + if(empty()) { + return -1; + } + + for(int i=0; i myStack = new Stack<>(); + boolean isEmpty = myStack.empty(); + Assert.assertTrue(isEmpty); + + myStack.push(10); + isEmpty = myStack.empty(); + Assert.assertFalse(isEmpty); + } + + @Test(expected = EmptyStackException.class) + public void testPeekWithoutElements() { + + Stack myStack = new Stack<>(); + myStack.peek(); + } + + @Test + public void testPeekWithElements() { + + Stack myStack = new Stack<>(); + myStack.push(10); + myStack.push(20); + myStack.push(30); + myStack.push(40); + + Assert.assertEquals(40, myStack.peek()); + } + + @Test(expected = EmptyStackException.class) + public void testPopWithoutElements() { + + Stack myStack = new Stack<>(); + myStack.pop(); + + } + + @Test + public void testPopWithElements() { + + Stack myStack = new Stack<>(); + myStack.push(10); + myStack.push(20); + myStack.push(30); + myStack.push(40); + myStack.push(50); + + Assert.assertEquals(50, myStack.pop()); + + } + + @Test + public void testPushWithinInitialCapacity() { + + Stack myStack = new Stack<>(); + myStack.push(10); + myStack.push(20); + myStack.push(30); + myStack.push(40); + myStack.push(50); + myStack.push(60); + myStack.push(70); + myStack.push(80); + myStack.push(90); + myStack.push(100); + Assert.assertEquals(10, myStack.size()); + } + + @Test + public void testPushOutsideInitialCapacity() { + + Stack myStack = new Stack<>(); + myStack.push(10); + myStack.push(20); + myStack.push(30); + myStack.push(40); + myStack.push(50); + myStack.push(60); + myStack.push(70); + myStack.push(80); + myStack.push(90); + myStack.push(100); + myStack.push(110); + Assert.assertEquals(11, myStack.size()); + } + + @Test + public void testSearchWithObjectUnavailable() { + + Stack myStack = new Stack<>(); + myStack.push(10); + myStack.push(20); + myStack.push(30); + Assert.assertEquals(-1,myStack.search(50)); + } + + @Test + public void testSearchWithObjectAvailable() { + + Stack myStack = new Stack<>(); + myStack.push(10); + myStack.push(20); + myStack.push(30); + Assert.assertEquals(3,myStack.search(10)); + + } +} From 27753bb8d1bfe1b1e7167eecfacc504c8894c549 Mon Sep 17 00:00:00 2001 From: asri71 Date: Sat, 16 Mar 2019 12:23:10 +0530 Subject: [PATCH 058/120] Removing inheritance from Vector class --- src/main/java/com/dataStructures/Stack.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/dataStructures/Stack.java b/src/main/java/com/dataStructures/Stack.java index 5298d65..aed57bd 100644 --- a/src/main/java/com/dataStructures/Stack.java +++ b/src/main/java/com/dataStructures/Stack.java @@ -2,9 +2,8 @@ import java.io.Serializable; import java.util.EmptyStackException; -import java.util.Vector; -public class Stack extends Vector implements Serializable { +public class Stack implements Serializable { /** * Inital capacity alloted to stack on object creation From 46df09ab86e06de0d0a556f8f4c55da5c86ccf90 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Sat, 16 Mar 2019 15:08:57 +0800 Subject: [PATCH 059/120] Update Stack.java Format code --- src/main/java/com/dataStructures/Stack.java | 51 ++++++++------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/dataStructures/Stack.java b/src/main/java/com/dataStructures/Stack.java index aed57bd..0349a52 100644 --- a/src/main/java/com/dataStructures/Stack.java +++ b/src/main/java/com/dataStructures/Stack.java @@ -3,17 +3,17 @@ import java.io.Serializable; import java.util.EmptyStackException; -public class Stack implements Serializable { +public class Stack implements Serializable { /** - * Inital capacity alloted to stack on object creation + * Initial capacity allocated to stack on object creation */ private final int INITIAL_CAPACITY = 10; /** * Increment in memory space once stack is out of space */ - private final int EXNTEDED_CAPACITY = 10; + private final int EXTENDED_CAPACITY = 10; /** @@ -30,15 +30,14 @@ public class Stack implements Serializable { /** * Uninitialized array to hold stack elements. - * WIll be intialized with inital capacity once the object is created + * WIll be initialized with initial capacity once the object is created */ private Object[] elements; /** - * No argument to create stack object with inital capacity + * No argument to create stack object with initial capacity */ public Stack() { - elements = new Object[INITIAL_CAPACITY]; } @@ -47,16 +46,7 @@ public Stack() { */ public boolean empty() { - - if(null == elements) { - return true; - } - - if(size == 0){ - return true; - } - - return false; + return elements == null || size == 0; } @@ -65,12 +55,11 @@ public boolean empty() { */ public Object peek() { + if (empty()) { + throw new EmptyStackException(); + } - if(empty()) { - throw new EmptyStackException(); - } - - return elements[tail]; + return elements[tail]; } /** @@ -78,8 +67,7 @@ public Object peek() { */ public Object pop() { - - if(empty()) { + if (empty()) { throw new EmptyStackException(); } @@ -95,12 +83,12 @@ public Object pop() { public Object push(Object e) { boolean isSuccess = false; - if(tail < (INITIAL_CAPACITY - 1)){ + if (tail < (INITIAL_CAPACITY - 1)) { tail++; elements[tail] = e; - }else{ - Object[] extendedElements = new Object[INITIAL_CAPACITY + EXNTEDED_CAPACITY]; - System.arraycopy(elements, 0, extendedElements, 0, (tail+1)); + } else { + Object[] extendedElements = new Object[INITIAL_CAPACITY + EXTENDED_CAPACITY]; + System.arraycopy(elements, 0, extendedElements, 0, (tail + 1)); elements = extendedElements; tail++; elements[tail] = e; @@ -118,19 +106,19 @@ public int search(Object o) { int index = -1; boolean found = false; - if(empty()) { + if (empty()) { return -1; } - for(int i=0; i Date: Fri, 22 Mar 2019 18:36:07 +0800 Subject: [PATCH 060/120] Update SimplexNoiseOctave.java --- .../com/generation/SimplexNoiseOctave.java | 765 +++++++++--------- 1 file changed, 385 insertions(+), 380 deletions(-) diff --git a/src/main/java/com/generation/SimplexNoiseOctave.java b/src/main/java/com/generation/SimplexNoiseOctave.java index d792e12..75d979e 100644 --- a/src/main/java/com/generation/SimplexNoiseOctave.java +++ b/src/main/java/com/generation/SimplexNoiseOctave.java @@ -7,384 +7,389 @@ */ public class SimplexNoiseOctave { - private static final Gradient[] GRADIENTS = { - - new Gradient( 1, 1, 0), new Gradient(-1, 1, 0), new Gradient( 1, -1, 0), - new Gradient(-1, -1, 0), new Gradient( 1, 0, 1), new Gradient(-1, 0, 1), - new Gradient( 1, 0, -1), new Gradient(-1, 0, -1), new Gradient( 0, 1, 1), - new Gradient( 0, -1, 1), new Gradient( 0, 1, -1), new Gradient( 0, -1, -1) - }; - private static final short P_SUPPLY[] = { - - 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, - 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, - 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, - 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, - 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, - 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, - 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, - 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, - 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, - 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, - 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, - 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, - 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, - 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, - 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, - 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 - }; - private static final int LENGTH = P_SUPPLY.length * 2; - private static final int SWAP_COUNT = 20; - private static final double F2 = 0.5D * (Math.sqrt(3.0D) - 1.0D); - private static final double G2 = (3.0D - Math.sqrt(3.0D)) / 6.0D; - private static final double F3 = 1.0D / 3.0D; - private static final double G3 = 1.0D / 6.0D; - - private final short[] p = P_SUPPLY.clone(); - private final short[] perm = new short[LENGTH]; - private final short[] permMod12 = new short[LENGTH]; - - /** - * @param seed the seed that this octave uses to generate pseudo random numbers - */ - public SimplexNoiseOctave(long seed) { - - Random random = new Random(seed); - - for(int index = 0; index < SWAP_COUNT; index++) { - - int swapFrom = random.nextInt(this.p.length); - int swapTo = random.nextInt(this.p.length); - - short temp = this.p[swapFrom]; - this.p[swapFrom] = this.p[swapTo]; - this.p[swapTo] = temp; - } - - for(int index = 0; index < LENGTH; index++) { - - this.perm[index] = this.p[index & 255]; - this.permMod12[index] = (short)(this.perm[index] % 12); - } - } - - /** - * A method with the functionality of {@link Math#floor(double)} but it is faster. - * @param x the value - * @return the result - * @see Math#floor(double) - */ - private static final int fastfloor(double x) { - - int xAsInt = (int)x; - return x < xAsInt ? xAsInt - 1 : xAsInt; - } - - /** - * Dot function for a gradient. - * @param gradient the gradient - * @param x X - * @param y Y - * @return the dot value - */ - private static final double dot(Gradient gradient, double x, double y) { - - return gradient.x * x + gradient.y * y; - } - - /** - * Dot function for a gradient. - * @param gradient the gradient - * @param x X - * @param y Y - * @param z Z - * @return the dot value - */ - private static final double dot(Gradient gradient, double x, double y, double z) { - - return gradient.x * x + gradient.y * y + gradient.z * z; - } - - /** - * Makes a two dimensional noise. - * @param x X - * @param y Y - * @return the noise - */ - public double noise(double x, double y) { - - double n0; - double n1; - double n2; - - double s = (x + y) * F2; - - int i = fastfloor(x + s); - int j = fastfloor(y + s); - - double t = (i + j) * G2; - - double X0 = i - t; - double Y0 = j - t; - - double x0 = x - X0; - double y0 = y - Y0; - - int i1; - int j1; - - if(x0 > y0) { - - i1 = 1; - j1 = 0; - - } else { - - i1 = 0; - j1 = 1; - } - - double x1 = x0 - i1 + G2; - double y1 = y0 - j1 + G2; - double x2 = x0 - 1.0D + 2.0D * G2; - double y2 = y0 - 1.0D + 2.0D * G2; - - int ii = i & 0xFF; - int jj = j & 0xFF; - - int gi0 = this.permMod12[ii + this.perm[jj]]; - int gi1 = this.permMod12[ii + i1 + this.perm[jj + j1]]; - int gi2 = this.permMod12[ii + 1 + this.perm[jj + 1]]; - - double t0 = 0.5D - x0 * x0 - y0 * y0; - - if(t0 < 0) { - - n0 = 0.0; - - } else { - - t0 *= t0; - n0 = t0 * t0 * dot(GRADIENTS[gi0], x0, y0); - } - - double t1 = 0.5D - x1 * x1 - y1 * y1; - - if(t1 < 0.0D) { - - n1 = 0.0; - - } else { - - t1 *= t1; - n1 = t1 * t1 * dot(GRADIENTS[gi1], x1, y1); - } - - double t2 = 0.5D - x2 * x2 - y2 * y2; - - if(t2 < 0.0D) { - - n2 = 0.0D; - - } else { - - t2 *= t2; - n2 = t2 * t2 * dot(GRADIENTS[gi2], x2, y2); - } - - return 70.0D * (n0 + n1 + n2); - } - - /** - * Makes a three dimensional noise. - * @param x X - * @param y Y - * @param z Z - * @return the noise - */ - public double noise(double x, double y, double z) { - - double n0; - double n1; - double n2; - double n3; - - double s = (x + y + z) * F3; - - int i = fastfloor(x + s); - int j = fastfloor(y + s); - int k = fastfloor(z + s); - - double t = (i + j + k) * G3; - - double X0 = i - t; - double Y0 = j - t; - double Z0 = k - t; - - double x0 = x - X0; - double y0 = y - Y0; - double z0 = z - Z0; - - int i1; - int j1; - int k1; - int i2; - int j2; - int k2; - - if(x0 >= y0) { - - if(y0 >= z0) { - - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - - } else if(x0 >= z0) { - - i1 = 1; - j1 = 0; - k1 = 0; - i2 = 1; - j2 = 0; - k2 = 1; - - } else { - - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 1; - j2 = 0; - k2 = 1; - } - - } else { - - if(y0 < z0) { - - i1 = 0; - j1 = 0; - k1 = 1; - i2 = 0; - j2 = 1; - k2 = 1; - - } else if(x0 < z0) { - - i1 = 0; - j1 = 1; - k1 = 0; - i2 = 0; - j2 = 1; - k2 = 1; - - } else { - - i1 = 0; - j1 = 1; - k1 = 0; - i2 = 1; - j2 = 1; - k2 = 0; - } - } - - double x1 = x0 - i1 + G3; - double y1 = y0 - j1 + G3; - double z1 = z0 - k1 + G3; - - double x2 = x0 - i2 + 2.0D * G3; - double y2 = y0 - j2 + 2.0D * G3; - double z2 = z0 - k2 + 2.0D * G3; - - double x3 = x0 - 1.0D + 3.0D * G3; - double y3 = y0 - 1.0D + 3.0D * G3; - double z3 = z0 - 1.0D + 3.0D * G3; - - int ii = i & 0xFF; - int jj = j & 0xFF; - int kk = k & 0xFF; - - int gi0 = this.permMod12[ii + this.perm[jj + this.perm[kk]]]; - int gi1 = this.permMod12[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]]; - int gi2 = this.permMod12[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]]; - int gi3 = this.permMod12[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]]; - - double t0 = 0.6D - x0 * x0 - y0 * y0 - z0 * z0; - - if(t0 < 0) { - - n0 = 0.0D; - - } else { - - t0 *= t0; - n0 = t0 * t0 * dot(GRADIENTS[gi0], x0, y0, z0); - } - - double t1 = 0.6D - x1 * x1 - y1 * y1 - z1 * z1; - - if(t1 < 0) { - - n1 = 0.0D; - - } else { - - t1 *= t1; - n1 = t1 * t1 * dot(GRADIENTS[gi1], x1, y1, z1); - } - - double t2 = 0.6D - x2 * x2 - y2 * y2 - z2 * z2; - - if(t2 < 0) { - - n2 = 0.0D; - - } else { - - t2 *= t2; - n2 = t2 * t2 * dot(GRADIENTS[gi2], x2, y2, z2); - } - - double t3 = 0.6D - x3 * x3 - y3 * y3 - z3 * z3; - - if(t3 < 0) { - - n3 = 0.0D; - - } else { - - t3 *= t3; - n3 = t3 * t3 * dot(GRADIENTS[gi3], x3, y3, z3); - } - - return 32.0D * (n0 + n1 + n2 + n3); - } - - /** - * Represents a gradient. - * Inner classes are faster than arrays. - */ - private static final class Gradient { - - private final double x; - private final double y; - private final double z; - - /** - * @param x X - * @param y Y - * @param z Z - */ - private Gradient(double x, double y, double z) { - - this.x = x; - this.y = y; - this.z = z; - } - } + private static final Gradient[] GRADIENTS = { + + new Gradient(1, 1, 0), new Gradient(-1, 1, 0), new Gradient(1, -1, 0), + new Gradient(-1, -1, 0), new Gradient(1, 0, 1), new Gradient(-1, 0, 1), + new Gradient(1, 0, -1), new Gradient(-1, 0, -1), new Gradient(0, 1, 1), + new Gradient(0, -1, 1), new Gradient(0, 1, -1), new Gradient(0, -1, -1) + }; + private static final short P_SUPPLY[] = { + + 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, + 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, + 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, + 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, + 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, + 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, + 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, + 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, + 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, + 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, + 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, + 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, + 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, + 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, + 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, + 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 + }; + private static final int LENGTH = P_SUPPLY.length * 2; + private static final int SWAP_COUNT = 20; + private static final double F2 = 0.5D * (Math.sqrt(3.0D) - 1.0D); + private static final double G2 = (3.0D - Math.sqrt(3.0D)) / 6.0D; + private static final double F3 = 1.0D / 3.0D; + private static final double G3 = 1.0D / 6.0D; + + private final short[] p = P_SUPPLY.clone(); + private final short[] perm = new short[LENGTH]; + private final short[] permMod12 = new short[LENGTH]; + + /** + * @param seed the seed that this octave uses to generate pseudo random numbers + */ + public SimplexNoiseOctave(long seed) { + + Random random = new Random(seed); + + for (int index = 0; index < SWAP_COUNT; index++) { + + int swapFrom = random.nextInt(this.p.length); + int swapTo = random.nextInt(this.p.length); + + short temp = this.p[swapFrom]; + this.p[swapFrom] = this.p[swapTo]; + this.p[swapTo] = temp; + } + + for (int index = 0; index < LENGTH; index++) { + + this.perm[index] = this.p[index & 255]; + this.permMod12[index] = (short) (this.perm[index] % 12); + } + } + + /** + * A method with the functionality of {@link Math#floor(double)} but it is faster. + * + * @param x the value + * @return the result + * @see Math#floor(double) + */ + private static final int fastfloor(double x) { + + int xAsInt = (int) x; + return x < xAsInt ? xAsInt - 1 : xAsInt; + } + + /** + * Dot function for a gradient. + * + * @param gradient the gradient + * @param x X + * @param y Y + * @return the dot value + */ + private static final double dot(Gradient gradient, double x, double y) { + + return gradient.x * x + gradient.y * y; + } + + /** + * Dot function for a gradient. + * + * @param gradient the gradient + * @param x X + * @param y Y + * @param z Z + * @return the dot value + */ + private static final double dot(Gradient gradient, double x, double y, double z) { + + return gradient.x * x + gradient.y * y + gradient.z * z; + } + + /** + * Makes a two dimensional noise. + * + * @param x X + * @param y Y + * @return the noise + */ + public double noise(double x, double y) { + + double n0; + double n1; + double n2; + + double s = (x + y) * F2; + + int i = fastfloor(x + s); + int j = fastfloor(y + s); + + double t = (i + j) * G2; + + double X0 = i - t; + double Y0 = j - t; + + double x0 = x - X0; + double y0 = y - Y0; + + int i1; + int j1; + + if (x0 > y0) { + + i1 = 1; + j1 = 0; + + } else { + + i1 = 0; + j1 = 1; + } + + double x1 = x0 - i1 + G2; + double y1 = y0 - j1 + G2; + double x2 = x0 - 1.0D + 2.0D * G2; + double y2 = y0 - 1.0D + 2.0D * G2; + + int ii = i & 0xFF; + int jj = j & 0xFF; + + int gi0 = this.permMod12[ii + this.perm[jj]]; + int gi1 = this.permMod12[ii + i1 + this.perm[jj + j1]]; + int gi2 = this.permMod12[ii + 1 + this.perm[jj + 1]]; + + double t0 = 0.5D - x0 * x0 - y0 * y0; + + if (t0 < 0) { + + n0 = 0.0; + + } else { + + t0 *= t0; + n0 = t0 * t0 * dot(GRADIENTS[gi0], x0, y0); + } + + double t1 = 0.5D - x1 * x1 - y1 * y1; + + if (t1 < 0.0D) { + + n1 = 0.0; + + } else { + + t1 *= t1; + n1 = t1 * t1 * dot(GRADIENTS[gi1], x1, y1); + } + + double t2 = 0.5D - x2 * x2 - y2 * y2; + + if (t2 < 0.0D) { + + n2 = 0.0D; + + } else { + + t2 *= t2; + n2 = t2 * t2 * dot(GRADIENTS[gi2], x2, y2); + } + + return 70.0D * (n0 + n1 + n2); + } + + /** + * Makes a three dimensional noise. + * + * @param x X + * @param y Y + * @param z Z + * @return the noise + */ + public double noise(double x, double y, double z) { + + double n0; + double n1; + double n2; + double n3; + + double s = (x + y + z) * F3; + + int i = fastfloor(x + s); + int j = fastfloor(y + s); + int k = fastfloor(z + s); + + double t = (i + j + k) * G3; + + double X0 = i - t; + double Y0 = j - t; + double Z0 = k - t; + + double x0 = x - X0; + double y0 = y - Y0; + double z0 = z - Z0; + + int i1; + int j1; + int k1; + int i2; + int j2; + int k2; + + if (x0 >= y0) { + + if (y0 >= z0) { + + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + + } else if (x0 >= z0) { + + i1 = 1; + j1 = 0; + k1 = 0; + i2 = 1; + j2 = 0; + k2 = 1; + + } else { + + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 1; + j2 = 0; + k2 = 1; + } + + } else { + + if (y0 < z0) { + + i1 = 0; + j1 = 0; + k1 = 1; + i2 = 0; + j2 = 1; + k2 = 1; + + } else if (x0 < z0) { + + i1 = 0; + j1 = 1; + k1 = 0; + i2 = 0; + j2 = 1; + k2 = 1; + + } else { + + i1 = 0; + j1 = 1; + k1 = 0; + i2 = 1; + j2 = 1; + k2 = 0; + } + } + + double x1 = x0 - i1 + G3; + double y1 = y0 - j1 + G3; + double z1 = z0 - k1 + G3; + + double x2 = x0 - i2 + 2.0D * G3; + double y2 = y0 - j2 + 2.0D * G3; + double z2 = z0 - k2 + 2.0D * G3; + + double x3 = x0 - 1.0D + 3.0D * G3; + double y3 = y0 - 1.0D + 3.0D * G3; + double z3 = z0 - 1.0D + 3.0D * G3; + + int ii = i & 0xFF; + int jj = j & 0xFF; + int kk = k & 0xFF; + + int gi0 = this.permMod12[ii + this.perm[jj + this.perm[kk]]]; + int gi1 = this.permMod12[ii + i1 + this.perm[jj + j1 + this.perm[kk + k1]]]; + int gi2 = this.permMod12[ii + i2 + this.perm[jj + j2 + this.perm[kk + k2]]]; + int gi3 = this.permMod12[ii + 1 + this.perm[jj + 1 + this.perm[kk + 1]]]; + + double t0 = 0.6D - x0 * x0 - y0 * y0 - z0 * z0; + + if (t0 < 0) { + + n0 = 0.0D; + + } else { + + t0 *= t0; + n0 = t0 * t0 * dot(GRADIENTS[gi0], x0, y0, z0); + } + + double t1 = 0.6D - x1 * x1 - y1 * y1 - z1 * z1; + + if (t1 < 0) { + + n1 = 0.0D; + + } else { + + t1 *= t1; + n1 = t1 * t1 * dot(GRADIENTS[gi1], x1, y1, z1); + } + + double t2 = 0.6D - x2 * x2 - y2 * y2 - z2 * z2; + + if (t2 < 0) { + + n2 = 0.0D; + + } else { + + t2 *= t2; + n2 = t2 * t2 * dot(GRADIENTS[gi2], x2, y2, z2); + } + + double t3 = 0.6D - x3 * x3 - y3 * y3 - z3 * z3; + + if (t3 < 0) { + + n3 = 0.0D; + + } else { + + t3 *= t3; + n3 = t3 * t3 * dot(GRADIENTS[gi3], x3, y3, z3); + } + + return 32.0D * (n0 + n1 + n2 + n3); + } + + /** + * Represents a gradient. + * Inner classes are faster than arrays. + */ + private static final class Gradient { + + private final double x; + private final double y; + private final double z; + + /** + * @param x X + * @param y Y + * @param z Z + */ + private Gradient(double x, double y, double z) { + + this.x = x; + this.y = y; + this.z = z; + } + } } From 09ed874e55b89ef9c7fb5b19c55a70ae87577384 Mon Sep 17 00:00:00 2001 From: Vinod Jayakumar Date: Sat, 23 Mar 2019 22:02:19 -0400 Subject: [PATCH 061/120] Update Base64.java --- src/main/java/com/crypto/codec/Base64.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/crypto/codec/Base64.java b/src/main/java/com/crypto/codec/Base64.java index 130c81a..9d1ff91 100644 --- a/src/main/java/com/crypto/codec/Base64.java +++ b/src/main/java/com/crypto/codec/Base64.java @@ -135,8 +135,8 @@ public static byte[] decode(String base64String) { if (base64String == null) { throw new IllegalArgumentException("Base64 string must not be null!"); } - - base64String = base64String.strip(); + // remove trailing spaces if any + base64String = base64String.trim(); if (!isValidBase64String(base64String)) { throw new IllegalArgumentException("String is not a valid Base64 string!"); } From 2eec474f13ed50e58c6ecfd7c8d1be79783bafb1 Mon Sep 17 00:00:00 2001 From: Ricaro Guevara Date: Sun, 24 Mar 2019 14:40:20 -0500 Subject: [PATCH 062/120] Add binary tree implementation with test --- .../java/com/dataStructures/BinaryTree.java | 125 ++++++++++++++++++ .../com/dataStructures/BinaryTreeTest.java | 60 +++++++++ 2 files changed, 185 insertions(+) create mode 100644 src/main/java/com/dataStructures/BinaryTree.java create mode 100644 src/test/java/com/dataStructures/BinaryTreeTest.java diff --git a/src/main/java/com/dataStructures/BinaryTree.java b/src/main/java/com/dataStructures/BinaryTree.java new file mode 100644 index 0000000..1a35fed --- /dev/null +++ b/src/main/java/com/dataStructures/BinaryTree.java @@ -0,0 +1,125 @@ +package dataStructures; + +/** + * Binary tree for general value type, without redundancy + * @author RICARDO + * @param root data + */ +public class BinaryTree { + private final T data; + private BinaryTree right, // the upper binary tree + left; // the lower binary tree + + public BinaryTree(T data) { + this.data = data; + } + + @Override + public String toString(){ + return this.data.toString(); + } + + /** + * inserts a new value in it's correspondant place + * @param newDataValue value of the new banary tree to add on this tree + */ + public void insert(T newDataValue){ + this.insert(new BinaryTree(newDataValue)); + } + + /** + * inserts a new binary tree in it's correspondant place + * @param newData new value to add on this tree + */ + public void insert(BinaryTree newData){ + + int cpr = newData.data.compareTo(this.data); //new value comparission respect to actual value + + if (cpr < 0) + if (this.left == null) + this.setLeft(newData); + else + this.left.insert(newData); + else if (cpr > 0) + if (this.right == null) + this.setRight(newData); + else + this.right.insert(newData); + else + System.out.println("Redundant value, not added"); + } + + /** + * search and specific value on the tree + * @param data Searched value + * @return Binary tree wich contains the value, null if it doesn't exist + */ + public BinaryTree search(T data){ + int cpr = data.compareTo(this.data); //new value comparission respect to actual value + + if (cpr < 0) { + if (this.left == null) + return null; //the value doesn't exist + return this.left.search(data); + } + if (cpr > 0) { + if (this.right == null) + return null; //the value doesn't exist + return this.right.search(data); + } + return this; + } + + /** + * Checks if the data value exist in the tree + * @param data data to be searched + * @return true if this tree contains the data value, false if not. + */ + public boolean contains(T data){ + return !(this.search(data) == null); + } + + /** + * uses recursive black magic to print this tree in console + * @param tabCounter prev tabs + */ + private void print(int tabCounter){ + for (int i = 0; i < tabCounter; i++) + System.out.print("\t"); + + System.out.println(this); + + if (this.left!=null) + this.left.print(tabCounter+1); //it can't be ++ , pls don't change it + if (this.right!=null) + this.right.print(tabCounter+1); //it can't be ++ , pls don't change it + } + + /** + * uses black magic to print this tree in console + */ + public void print(){ + this.print(0); + } + + //getters and setters + public T getData() { + return data; + } + + public BinaryTree getRight() { + return right; + } + + public void setRight(BinaryTree right) { + this.right = right; + } + + public BinaryTree getLeft() { + return left; + } + + public void setLeft(BinaryTree left) { + this.left = left; + } +} \ No newline at end of file diff --git a/src/test/java/com/dataStructures/BinaryTreeTest.java b/src/test/java/com/dataStructures/BinaryTreeTest.java new file mode 100644 index 0000000..cfc0355 --- /dev/null +++ b/src/test/java/com/dataStructures/BinaryTreeTest.java @@ -0,0 +1,60 @@ +package dataStructures; + +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * + * @author RICARDO + */ +public class BinaryTreeTest { + + public BinaryTreeTest() { + } + + /** + * Test of insert method, of class BinaryTree. + */ + @Test + public void testInsert_BinaryTree() { + System.out.println("insert"); + BinaryTree lowerdata = new BinaryTree<>("1"); + BinaryTree upperdata = new BinaryTree<>("3"); + BinaryTree instance = new BinaryTree<>("2"); + instance.insert(lowerdata); + instance.insert(upperdata); + String proof = instance.getLeft().toString()+instance.toString()+instance.getRight().toString(); + System.out.println(proof); + assertEquals("123", proof); + } + + /** + * Test of search method, of class BinaryTree. + */ + @Test + public void testSearch() { + System.out.println("search"); + BinaryTree instance = new BinaryTree<>(5); + for (int i = 1; i < 10; i++) { + instance.insert(new Integer(i)); + } + BinaryTree result = instance.search(new Integer(1)); + assertEquals(new Integer(1), result.getData()); + } + + /** + * Test of contains method, of class BinaryTree. + */ + @Test + public void testContains() { + System.out.println("contains"); + BinaryTree instance = new BinaryTree<>(5); + for (int i = 1; i < 10; i++) { + instance.insert(i); + } + + boolean result = instance.contains(2)&&instance.contains(11); + assertEquals(false, result); + } + +} From 4721cff668615d7ca22760dce0444532fe04ca48 Mon Sep 17 00:00:00 2001 From: Ricaro Guevara Date: Sun, 24 Mar 2019 22:54:12 -0500 Subject: [PATCH 063/120] made requested changes for binary tree implementation --- src/main/java/com/dataStructures/BinaryTree.java | 12 ++++++------ src/test/java/com/dataStructures/BinaryTreeTest.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/dataStructures/BinaryTree.java b/src/main/java/com/dataStructures/BinaryTree.java index 1a35fed..8cdb319 100644 --- a/src/main/java/com/dataStructures/BinaryTree.java +++ b/src/main/java/com/dataStructures/BinaryTree.java @@ -1,4 +1,4 @@ -package dataStructures; +package src.main.java.com.dataStructures; /** * Binary tree for general value type, without redundancy @@ -76,7 +76,7 @@ public BinaryTree search(T data){ * @return true if this tree contains the data value, false if not. */ public boolean contains(T data){ - return !(this.search(data) == null); + return this.search(data) != null; } /** @@ -89,10 +89,10 @@ private void print(int tabCounter){ System.out.println(this); - if (this.left!=null) - this.left.print(tabCounter+1); //it can't be ++ , pls don't change it - if (this.right!=null) - this.right.print(tabCounter+1); //it can't be ++ , pls don't change it + if (this.left != null) + this.left.print(tabCounter + 1); //it can't be ++ , pls don't change it + if (this.right != null) + this.right.print(tabCounter + 1); //it can't be ++ , pls don't change it } /** diff --git a/src/test/java/com/dataStructures/BinaryTreeTest.java b/src/test/java/com/dataStructures/BinaryTreeTest.java index cfc0355..b269441 100644 --- a/src/test/java/com/dataStructures/BinaryTreeTest.java +++ b/src/test/java/com/dataStructures/BinaryTreeTest.java @@ -1,4 +1,4 @@ -package dataStructures; +package src.main.java.com.dataStructures; import org.junit.Test; import static org.junit.Assert.*; From 7216f28cb318b32eedf420d2fb6274254dd671ff Mon Sep 17 00:00:00 2001 From: DDullahan Date: Mon, 8 Apr 2019 08:57:34 +0800 Subject: [PATCH 064/120] Added FastPower Added FastPower --- src/main/java/com/Others/FastPower.java | 37 +++++++++++++++++++ src/main/java/com/Others/FastPowerTest.java | 40 +++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 src/main/java/com/Others/FastPower.java create mode 100644 src/main/java/com/Others/FastPowerTest.java diff --git a/src/main/java/com/Others/FastPower.java b/src/main/java/com/Others/FastPower.java new file mode 100644 index 0000000..003f1d6 --- /dev/null +++ b/src/main/java/com/Others/FastPower.java @@ -0,0 +1,37 @@ +package src.main.java.com.Others; + +import java.math.BigInteger; + +/** + * We may calculate power with loops, but what if the index is too large ? + * FastPower aims to calculate quickly in this circumstances with time complexity O(log k), + * where k is the index. + * + * @author DDullahan + */ +public class FastPower { + public static BigInteger calculate(BigInteger n, BigInteger k, BigInteger mod) { + BigInteger ans = BigInteger.ONE; + while (!k.equals(BigInteger.ZERO)) { + int odd = k.mod(new BigInteger("2")).compareTo(BigInteger.ZERO); + if(odd == 1){ + ans = ans.multiply(n).mod(mod); + } + k = k.divide(new BigInteger("2")); + n = n.multiply(n).mod(mod); + } + return ans.mod(mod); + } + + public static long calculate(long n, long k, long mod) { + long ans = 1; + while (k != 0) { + if (k % 2 == 1) { + ans = (ans * n) % mod; + } + k >>= 1; + n = (n * n) % mod; + } + return ans % mod; + } +} diff --git a/src/main/java/com/Others/FastPowerTest.java b/src/main/java/com/Others/FastPowerTest.java new file mode 100644 index 0000000..b071c4e --- /dev/null +++ b/src/main/java/com/Others/FastPowerTest.java @@ -0,0 +1,40 @@ +package src.main.java.com.Others; + +import org.junit.*; + +import java.math.BigInteger; + +import static org.junit.Assert.*; + +public class FastPowerTest { + + @Test + public void test() { + System.out.println("Long Type:"); + long result; + result = FastPower.calculate(2, 2, 10); + assertEquals(result, 4); + System.out.println("The result of power(2,2) mod 10 is " + result); + + result = FastPower.calculate(100, 1000, 20); + assertEquals(result, 0); + System.out.println("The result of power(100, 1000) mod 20 is " + result); + + result = FastPower.calculate(123456, 123456789, 234); + System.out.println("The result of power(123456, 123456789) mod 234 is " + result); + + + System.out.println("BigInteger Type:"); + BigInteger bigResult; + bigResult = FastPower.calculate(BigInteger.TEN, BigInteger.TEN, new BigInteger("4")); + assertEquals(bigResult, BigInteger.ZERO); + System.out.println("The bigResult of power(10, 10) mod 4 is " + bigResult); + + bigResult = FastPower.calculate(new BigInteger("123456"), new BigInteger("123456789"), new BigInteger("234")); + System.out.println("The bigResult of power(123456, 123456789) mod 234 is " + bigResult); + + bigResult = FastPower.calculate(new BigInteger("123456789101112"), new BigInteger("12345678910111213"), new BigInteger("567890")); + System.out.println("The bigResult of power(123456789101112, 12345678910111213) mod 567890 is " + bigResult); + + } +} \ No newline at end of file From 91c19921ef99ada3cf676afa861bef9483eec0d6 Mon Sep 17 00:00:00 2001 From: nbdgit Date: Sun, 14 Apr 2019 16:55:05 +0530 Subject: [PATCH 065/120] Commit BinaryToGray --- .../java/com/conversions/BinaryToGray.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/com/conversions/BinaryToGray.java diff --git a/src/main/java/com/conversions/BinaryToGray.java b/src/main/java/com/conversions/BinaryToGray.java new file mode 100644 index 0000000..7b14c2a --- /dev/null +++ b/src/main/java/com/conversions/BinaryToGray.java @@ -0,0 +1,30 @@ +package src.main.java.com.conversions; + +public class BinaryToGray +{ + /* This method convert the binary number into gray code + @param binaryno need to convert binary number into gray code + @return graycode return as string + */ + + public String binaryToGray(String binarycode) + { + + String graycode=Character.toString(binarycode.charAt(0)); + + + for(int i=0;i Date: Sun, 14 Apr 2019 16:56:52 +0530 Subject: [PATCH 066/120] Commit BinaryToGrayTest --- .../com/conversions/BinaryToGrayTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/test/java/com/conversions/BinaryToGrayTest.java diff --git a/src/test/java/com/conversions/BinaryToGrayTest.java b/src/test/java/com/conversions/BinaryToGrayTest.java new file mode 100644 index 0000000..25edede --- /dev/null +++ b/src/test/java/com/conversions/BinaryToGrayTest.java @@ -0,0 +1,19 @@ +package src.test.java.com.conversions; + +import src.main.java.com.conversions.BinaryToGray; +import org.junit.Test; +import static org.junit.Assert.assertEquals; + +public class BinaryToGrayTest +{ + + + @Test + public void testBinaryToGray() + { + BinaryToGray btog=new BinaryToGray(); + assertEquals("1101",btog.binaryToGray("1001")); + assertEquals("11010011101",btog.binaryToGray("10011101001")); + } + +} From 6938c409f95d85157ffdc716ce3cf4216ca403cf Mon Sep 17 00:00:00 2001 From: Abir Bhushan Date: Mon, 15 Apr 2019 11:14:22 +0100 Subject: [PATCH 067/120] Create DepthFirstSearch.java --- .../java/com/search/DepthFirstSearch.java | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/main/java/com/search/DepthFirstSearch.java diff --git a/src/main/java/com/search/DepthFirstSearch.java b/src/main/java/com/search/DepthFirstSearch.java new file mode 100644 index 0000000..fe16e42 --- /dev/null +++ b/src/main/java/com/search/DepthFirstSearch.java @@ -0,0 +1,126 @@ +package src.main.java.com.search; + +/** + * Searching is faster in sorted structures. Binary search is O(log n). + * However, the cost of sorting is O(n · log n). + * What to do when adding or removing elements? Sort again? No. + * Create efficient data structures to maintain sorted sequences, and search in them + * Key example: binary sorted tree, allowing O(log N) insert, remove and lookup. + + In comes, depth-first search + * Worst-case performance O(n) + * Best-case performance O(1) + * Average performance O(n) + * + * @author abir (https://github.com/abircb) + */ + +public class DepthFirstSearch { + + /** + * Depth-first search method + * + * @param tree- Binary tree to be searched + * @param value- Key being searched for + * @return Location of the key + */ + + public static > T find(T key, BinaryTree tree) { + return tree.get(key); + } + +} + +/** + * The BinaryTree class defines the structure of a binary tree + * Also contains a static nested class called TreeNode + * @param + * @author abir + */ +class BinaryTree> { + + private TreeNode root; + + /** + * @author abir + * @param

+ * This class defines what a node in a binary tree looks like + */ + private static class TreeNode

> { + + P key, value; + TreeNode

left, right; + + private TreeNode(P key, P value) { + this.key = key; + this.value = value; + this.left = null; + this.right = null; + } + + /** + * @param node + * adds the specified node + */ + private void add(TreeNode

node) { + if (node.key.compareTo(this.key) < 0) { + if(this.left == null) { + this.left = node; + } + else { + this.left.add(node); + } + } + + else { + if(this.right == null) { + this.right = node; + } + else { + this.right.add(node); + } + } + } + + /** + * @param key + * @return the tree node corresponding to the key + */ + private TreeNode

find(P key) { + if(key.compareTo(this.key) == 0) return this; + + else if(key.compareTo(this.key) < 0) { + if(this.left == null) return null; + else return this.left.find(key); + } + + else { + if(this.right == null) return null; + else return this.right.find(key); + } + } + + } + + public BinaryTree() { + this.root = null; + } + + public void add(T key, T value) { + TreeNode node = new TreeNode(key, value); + if(this.root == null) { + this.root = node; + } + else { + this.root.add(node); + } + } + + public T get(T key) { + if(this.root == null) return null; + + TreeNode node = this.root.find(key); + if(node == null) return null; + return node.value; + } +} From 4d9965cb945d59c5582e1f9cdfc7f59627638beb Mon Sep 17 00:00:00 2001 From: Abir Bhushan Date: Mon, 15 Apr 2019 11:38:59 +0100 Subject: [PATCH 068/120] Create DepthFirstSearchTest.java this test is created for the DepthFirstSearch.java file- that I added- containing the DepthFirstSearch algorithm --- .../java/com/search/DepthFirstSearchTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/test/java/com/search/DepthFirstSearchTest.java diff --git a/src/test/java/com/search/DepthFirstSearchTest.java b/src/test/java/com/search/DepthFirstSearchTest.java new file mode 100644 index 0000000..859abfb --- /dev/null +++ b/src/test/java/com/search/DepthFirstSearchTest.java @@ -0,0 +1,36 @@ +package src.test.java.com.search; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.search.DepthFirstSearch; +import src.main.java.com.search.BinaryTree; + +public class DepthFirstSearchTest { + @Test + public void testDepthFirstSearch() { + + BinaryTree tree1 = new BinaryTree(); + tree1.add(1,1); + tree1.add(2,2); + tree1.add(3,3); + tree1.add(4,4); + Assert.assertEquals("Incorrect index", 3, DepthFirstSearch.find(3, tree1)); + Assert.assertEquals("Incorrect index", 1, DepthFirstSearch.find(1, tree1)); + Assert.assertEquals("Incorrect index", null, DepthFirstSearch.find(0, tree1)); + Assert.assertEquals("Incorrect index", null, DepthFirstSearch.find(8, tree1)); + Assert.assertEquals("Incorrect index", null, DepthFirstSearch.find(-2, tree1)); + + BinaryTree tree2 = new BinaryTree(); + tree2.add("1","A"); + tree2.add("2","B"); + tree2.add("3","C"); + tree2.add("4","D"); + + Assert.assertEquals("Incorrect index", "C", LinearSearch.findIndex(tree2,"3")); + Assert.assertEquals("Incorrect index", "B", LinearSearch.findIndex(tree2,"2")); + Assert.assertEquals("Incorrect index", null, LinearSearch.findIndex(tree2,"F")); + + BinaryTree tree3 = new BinaryTree(); + Assert.assertEquals("Incorrect index", null, LinearSearch.findIndex(tree3, "")); + } +} From 785b570167f2016b2f49a9deb73106e70e264c87 Mon Sep 17 00:00:00 2001 From: Abir Bhushan Date: Tue, 16 Apr 2019 19:39:26 +0100 Subject: [PATCH 069/120] Update DepthFirstSearch.java --- src/main/java/com/search/DepthFirstSearch.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/search/DepthFirstSearch.java b/src/main/java/com/search/DepthFirstSearch.java index fe16e42..12ce4c1 100644 --- a/src/main/java/com/search/DepthFirstSearch.java +++ b/src/main/java/com/search/DepthFirstSearch.java @@ -10,7 +10,7 @@ In comes, depth-first search * Worst-case performance O(n) * Best-case performance O(1) - * Average performance O(n) + * Average performance O(n) * * @author abir (https://github.com/abircb) */ @@ -26,8 +26,8 @@ public class DepthFirstSearch { */ public static > T find(T key, BinaryTree tree) { - return tree.get(key); - } + return tree.get(key); + } } From 230f04f6141565f242c6832ff752d93134a0ac52 Mon Sep 17 00:00:00 2001 From: Havan Agrawal Date: Fri, 3 May 2019 00:31:43 +0530 Subject: [PATCH 070/120] Apply suggestions from code review Co-Authored-By: nbdgit <48550673+nbdgit@users.noreply.github.com> --- src/main/java/com/conversions/BinaryToGray.java | 14 ++++++-------- .../java/com/conversions/BinaryToGrayTest.java | 5 ++--- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/conversions/BinaryToGray.java b/src/main/java/com/conversions/BinaryToGray.java index 7b14c2a..cf44b82 100644 --- a/src/main/java/com/conversions/BinaryToGray.java +++ b/src/main/java/com/conversions/BinaryToGray.java @@ -3,28 +3,26 @@ public class BinaryToGray { /* This method convert the binary number into gray code - @param binaryno need to convert binary number into gray code + @param binarycode need to convert binary number into gray code @return graycode return as string */ public String binaryToGray(String binarycode) { - String graycode=Character.toString(binarycode.charAt(0)); - + String graycode = Character.toString(binarycode.charAt(0)); - for(int i=0;i Date: Fri, 3 May 2019 08:56:07 +0800 Subject: [PATCH 071/120] fixed problems of code review from @havanagrawal https://github.com/TheAlgorithms/Java/pull/731/files/7216f28cb318b32eedf420d2fb6274254dd671ff --- src/main/java/com/Others/FastPower.java | 6 ++-- src/main/java/com/Others/FastPowerTest.java | 40 +++++++++------------ 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/Others/FastPower.java b/src/main/java/com/Others/FastPower.java index 003f1d6..8cc1b8b 100644 --- a/src/main/java/com/Others/FastPower.java +++ b/src/main/java/com/Others/FastPower.java @@ -13,11 +13,11 @@ public class FastPower { public static BigInteger calculate(BigInteger n, BigInteger k, BigInteger mod) { BigInteger ans = BigInteger.ONE; while (!k.equals(BigInteger.ZERO)) { - int odd = k.mod(new BigInteger("2")).compareTo(BigInteger.ZERO); - if(odd == 1){ + int odd = k.mod(BigInteger.valueOf(2)).compareTo(BigInteger.ZERO); + if(odd > 0){ ans = ans.multiply(n).mod(mod); } - k = k.divide(new BigInteger("2")); + k = k.divide(BigInteger.valueOf(2)); n = n.multiply(n).mod(mod); } return ans.mod(mod); diff --git a/src/main/java/com/Others/FastPowerTest.java b/src/main/java/com/Others/FastPowerTest.java index b071c4e..bd61704 100644 --- a/src/main/java/com/Others/FastPowerTest.java +++ b/src/main/java/com/Others/FastPowerTest.java @@ -8,33 +8,25 @@ public class FastPowerTest { - @Test - public void test() { - System.out.println("Long Type:"); - long result; - result = FastPower.calculate(2, 2, 10); - assertEquals(result, 4); - System.out.println("The result of power(2,2) mod 10 is " + result); - - result = FastPower.calculate(100, 1000, 20); - assertEquals(result, 0); - System.out.println("The result of power(100, 1000) mod 20 is " + result); - - result = FastPower.calculate(123456, 123456789, 234); - System.out.println("The result of power(123456, 123456789) mod 234 is " + result); - + void testLong(long n, long k, long m){ + long result = FastPower.calculate(n,k,m); + assertEquals(result, BigInteger.valueOf(n).modPow(BigInteger.valueOf(k), BigInteger.valueOf(m)).longValue()); + } - System.out.println("BigInteger Type:"); - BigInteger bigResult; - bigResult = FastPower.calculate(BigInteger.TEN, BigInteger.TEN, new BigInteger("4")); - assertEquals(bigResult, BigInteger.ZERO); - System.out.println("The bigResult of power(10, 10) mod 4 is " + bigResult); + void testBigInteger(BigInteger n, BigInteger k, BigInteger m){ + BigInteger result = FastPower.calculate(n,k,m); + assertEquals(result, n.modPow(k,m)); + } - bigResult = FastPower.calculate(new BigInteger("123456"), new BigInteger("123456789"), new BigInteger("234")); - System.out.println("The bigResult of power(123456, 123456789) mod 234 is " + bigResult); + @Test + public void test() { + testLong(2,2,10); + testLong(100,1000,20); + testLong(123456,123456789,234); - bigResult = FastPower.calculate(new BigInteger("123456789101112"), new BigInteger("12345678910111213"), new BigInteger("567890")); - System.out.println("The bigResult of power(123456789101112, 12345678910111213) mod 567890 is " + bigResult); + testBigInteger(BigInteger.TEN,BigInteger.TEN, BigInteger.valueOf(4)); + testBigInteger(new BigInteger("123456"), new BigInteger("123456789"), new BigInteger("234")); + testBigInteger(new BigInteger("123456789101112"), new BigInteger("12345678910111213"), new BigInteger("567890")); } } \ No newline at end of file From f5754d3aefc5c1f7298addb17c02d64e9101d4a6 Mon Sep 17 00:00:00 2001 From: Nilanjan <48550673+nbdgit@users.noreply.github.com> Date: Fri, 3 May 2019 22:16:06 +0530 Subject: [PATCH 072/120] Add StringBuilder class --- src/main/java/com/conversions/BinaryToGray.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/conversions/BinaryToGray.java b/src/main/java/com/conversions/BinaryToGray.java index cf44b82..1482b8d 100644 --- a/src/main/java/com/conversions/BinaryToGray.java +++ b/src/main/java/com/conversions/BinaryToGray.java @@ -10,19 +10,19 @@ public class BinaryToGray public String binaryToGray(String binarycode) { - String graycode = Character.toString(binarycode.charAt(0)); + StringBuilder graycode = new StringBuilder(Character.toString(binarycode.charAt(0))); for(int i = 0; i < binarycode.length() - 1; i++) { if (binarycode.charAt(i) == binarycode.charAt(i+1)) - graycode = graycode + "0"; + graycode.append("0"); else - graycode = graycode + "1"; + graycode.append("1"); } - return graycode; + return graycode.toString(); } } From 1bf9cf601929a0fb85d14a2b1a4eb1bdf1a0090b Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Wed, 8 May 2019 13:51:07 +0530 Subject: [PATCH 073/120] Added the algorithm and test for Exponential Search --- .../java/com/search/ExponentialSearch.java | 39 +++++++++++++++++++ .../com/search/ExponentialSearchTest.java | 31 +++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/main/java/com/search/ExponentialSearch.java create mode 100644 src/test/java/com/search/ExponentialSearchTest.java diff --git a/src/main/java/com/search/ExponentialSearch.java b/src/main/java/com/search/ExponentialSearch.java new file mode 100644 index 0000000..e60940c --- /dev/null +++ b/src/main/java/com/search/ExponentialSearch.java @@ -0,0 +1,39 @@ +package src.main.java.com.search; + +import java.util.Arrays; + +/** + * Exponential search (also called doubling search or galloping search or Struzik search) is an algorithm which finds + * the position of a target value within an array. It works by determining a range that the search key resides in and + * performing a binary search within that range + *

+ * Worst-case performance O(n) + * Best-case performance O(1) + * Average performance O(Log n) + * Worst-case space complexity O(Log n) + */ +public class ExponentialSearch { + /** + * @param array is an array where the element should be found + * @param key is an element which should be found + * @param is any comparable type + * @return The index position of the key in the array, returns -1 for empty array + */ + public > int findIndex(T[] array, T key) { + int size = array.length; + if(size == 0) + return -1; + // If the element is present at first position + if (array[0] == key) + return 0; + + // Find the range for binary search by repeated doubling + int i = 1; + while (i < size && array[i].compareTo(key) <= 0) { + i = i * 2; + } + + // Call binary search for the range found + return Arrays.binarySearch(array, i / 2, Math.min(i, size), key); + } +} diff --git a/src/test/java/com/search/ExponentialSearchTest.java b/src/test/java/com/search/ExponentialSearchTest.java new file mode 100644 index 0000000..1023e8e --- /dev/null +++ b/src/test/java/com/search/ExponentialSearchTest.java @@ -0,0 +1,31 @@ +package src.test.java.com.search; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.search.ExponentialSearch; + +public class ExponentialSearchTest { + @Test + public void testExponentialSearch() { + ExponentialSearch expSearch = new ExponentialSearch(); + + Integer[] arr = {11, 14, 23, 29, 36, 40, 42, 52}; + int x = 36; + int index = expSearch.findIndex(arr, x); + Assert.assertEquals("Incorrect index", 4, index); + + Integer[] arrTwo = {-210, -190, -180, -160, -130, -120, -100}; + x = -120; + index = expSearch.findIndex(arrTwo, x); + Assert.assertEquals("Incorrect index", 5, index); + + String[] arrString = {"101", "122", "136", "165", "225", "251", "291"}; + String stringX = "122"; + index = expSearch.findIndex(arrString, stringX); + Assert.assertEquals("Incorrect index", 1, index); + + String[] arrThree = {}; + Assert.assertEquals("Incorrect index", -1, expSearch.findIndex(arrThree, "")); + } + +} From 46e52f43787026feb339270c0f2291492ded599b Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Thu, 9 May 2019 16:34:58 +0800 Subject: [PATCH 074/120] Update SimplexNoiseTest.java --- .../java/com/generation/SimplexNoiseTest.java | 67 +++++++++---------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/src/test/java/com/generation/SimplexNoiseTest.java b/src/test/java/com/generation/SimplexNoiseTest.java index a977e8e..c50cf7b 100644 --- a/src/test/java/com/generation/SimplexNoiseTest.java +++ b/src/test/java/com/generation/SimplexNoiseTest.java @@ -1,6 +1,5 @@ package src.test.java.com.generation; -import static org.junit.jupiter.api.Assertions.*; import java.awt.Color; import java.awt.image.BufferedImage; @@ -9,42 +8,42 @@ import javax.imageio.ImageIO; -import org.junit.jupiter.api.Test; +import org.junit.Assert; +import org.junit.Test; import src.main.java.com.generation.SimplexNoise; public class SimplexNoiseTest { - @Test - public void testGenerateHeightMap() { - - final int WIDTH = 256; - final int HEIGHT = 256; - final int X = 0; - final int Y = 0; - final String RESOURCE_NAME = "src/test/java/com/generation/expected-result.png"; - - float[][] heightmap = new SimplexNoise(50, 0.3F, 1111111111111111L).generateHeightMap(X, Y, WIDTH, HEIGHT); - BufferedImage image = null; - - try(InputStream in = this.getClass().getClassLoader().getResourceAsStream(RESOURCE_NAME)) { - - image = ImageIO.read(in); - - assertEquals(WIDTH, image.getWidth()); - assertEquals(HEIGHT, image.getHeight()); - - } catch(IOException | IllegalArgumentException exception) { - - fail(exception); - } - - for(int x = 0; x < WIDTH; x++) { - - for(int y = 0; y < HEIGHT; y++) { - - assertEquals(new Color(image.getRGB(x, y)).getRed(), (int)(heightmap[x][y] * 255)); - } - } - } + @Test + public void testGenerateHeightMap() { + + final int WIDTH = 256; + final int HEIGHT = 256; + final int X = 0; + final int Y = 0; + final String RESOURCE_NAME = "src/test/java/com/generation/expected-result.png"; + + float[][] heightmap = new SimplexNoise(50, 0.3F, 1111111111111111L).generateHeightMap(X, Y, WIDTH, HEIGHT); + BufferedImage image = null; + + try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(RESOURCE_NAME)) { + + image = ImageIO.read(in); + + Assert.assertEquals(WIDTH, image.getWidth()); + Assert.assertEquals(HEIGHT, image.getHeight()); + + } catch (IOException | IllegalArgumentException exception) { + + } + + for (int x = 0; x < WIDTH; x++) { + + for (int y = 0; y < HEIGHT; y++) { + + Assert.assertEquals(new Color(image.getRGB(x, y)).getRed(), (int) (heightmap[x][y] * 255)); + } + } + } } From 60bb026f8ab64e2a1c16465492e04c9a4f6c3bdf Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Thu, 9 May 2019 20:33:46 +0800 Subject: [PATCH 075/120] Update ExponentialSearch.java --- src/main/java/com/search/ExponentialSearch.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/search/ExponentialSearch.java b/src/main/java/com/search/ExponentialSearch.java index e60940c..0f30f09 100644 --- a/src/main/java/com/search/ExponentialSearch.java +++ b/src/main/java/com/search/ExponentialSearch.java @@ -20,9 +20,11 @@ public class ExponentialSearch { * @return The index position of the key in the array, returns -1 for empty array */ public > int findIndex(T[] array, T key) { - int size = array.length; - if(size == 0) + if (array == null || array.length == 0) { return -1; + } + int size = array.length; + // If the element is present at first position if (array[0] == key) return 0; @@ -30,10 +32,10 @@ public > int findIndex(T[] array, T key) { // Find the range for binary search by repeated doubling int i = 1; while (i < size && array[i].compareTo(key) <= 0) { - i = i * 2; + i <<= 1; } // Call binary search for the range found - return Arrays.binarySearch(array, i / 2, Math.min(i, size), key); + return Arrays.binarySearch(array, i >> 1, Math.min(i, size), key); } } From 8e8e14d1c2d0aa07df563ddd922ce682e70b88fd Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 10 May 2019 14:49:24 +0800 Subject: [PATCH 076/120] refactor: format code and fix typos --- .../com/conversions/AnyBaseToDecimal.java | 13 +- .../com/conversions/BinaryToHexadecimal.java | 2 +- .../com/conversions/DecimalToAnyBase.java | 14 +- .../com/conversions/DecimalToHexadecimal.java | 5 +- .../java/com/conversions/DecimalToOctal.java | 7 +- .../java/com/dataStructures/BinaryTree.java | 58 ++-- .../java/com/dataStructures/DisjointSet.java | 1 - .../java/com/generation/SimplexNoise.java | 251 +++++++++--------- .../com/generation/SimplexNoiseOctave.java | 2 +- .../matchings/stableMatching/GaleShapley.java | 6 +- src/main/java/com/search/BloomFilter.java | 1 - src/main/java/com/search/LinearSearch.java | 4 +- src/main/java/com/sorts/HeapSort.java | 177 ++++++------ src/main/java/com/sorts/MergeSort.java | 124 ++++----- src/main/java/com/sorts/QuickSort.java | 97 ++++--- src/main/java/com/sorts/SelectionSort.java | 44 +-- src/main/java/com/sorts/ShellSort.java | 40 +-- src/main/java/com/sorts/SortUtils.java | 68 ++--- src/main/java/com/sorts/StoogeSort.java | 62 ++--- src/main/java/com/types/Sort.java | 2 +- .../com/dataStructures/BinaryTreeTest.java | 40 ++- 21 files changed, 513 insertions(+), 505 deletions(-) diff --git a/src/main/java/com/conversions/AnyBaseToDecimal.java b/src/main/java/com/conversions/AnyBaseToDecimal.java index 4267e66..65f89f2 100644 --- a/src/main/java/com/conversions/AnyBaseToDecimal.java +++ b/src/main/java/com/conversions/AnyBaseToDecimal.java @@ -3,6 +3,7 @@ public class AnyBaseToDecimal { /** * This method produces a decimal value of any given input number of any base + * * @param inpNum String of which we need the decimal value and base in integer format * @return string format of the decimal value */ @@ -12,11 +13,11 @@ public String convertToDecimal(String inpNum, int base) { int num = 0; int pow = 1; - for (int i=len-1; i>=0; i--) { + for (int i = len - 1; i >= 0; i--) { if (valOfChar(inpNum.charAt(i)) >= base) { return "Invalid Number"; } - num += valOfChar(inpNum.charAt(i))*pow; + num += valOfChar(inpNum.charAt(i)) * pow; pow *= base; } return String.valueOf(num); @@ -24,16 +25,16 @@ public String convertToDecimal(String inpNum, int base) { /** * This method produces integer value of the input character and returns it + * * @param c Char of which we need the integer value of * @return integer value of input char */ private static int valOfChar(char c) { if (c >= '0' && c <= '9') { - return (int)c - '0'; - } - else { - return (int)c - 'A' + 10; + return (int) c - '0'; + } else { + return (int) c - 'A' + 10; } } } \ No newline at end of file diff --git a/src/main/java/com/conversions/BinaryToHexadecimal.java b/src/main/java/com/conversions/BinaryToHexadecimal.java index 8497fa2..fc89157 100644 --- a/src/main/java/com/conversions/BinaryToHexadecimal.java +++ b/src/main/java/com/conversions/BinaryToHexadecimal.java @@ -11,7 +11,7 @@ public class BinaryToHexadecimal { * hm to store hexadecimal codes for binary numbers * within the range: 0000 to 1111 i.e. for decimal numbers 0 to 15 */ - private static Map hmHexadecimal = new HashMap<>(16); + private static Map hmHexadecimal = new HashMap<>(16); static { int i; diff --git a/src/main/java/com/conversions/DecimalToAnyBase.java b/src/main/java/com/conversions/DecimalToAnyBase.java index ae675f2..912d423 100644 --- a/src/main/java/com/conversions/DecimalToAnyBase.java +++ b/src/main/java/com/conversions/DecimalToAnyBase.java @@ -3,23 +3,24 @@ import java.util.ArrayList; public class DecimalToAnyBase { + /** * This method produces a String value of any given input decimal in any base - * @param inp Decimal of which we need the value in base in String format + * + * @param inp Decimal of which we need the value in base in String format * @param base base in which we want the decimal value to be converted into * @return string format of the converted value in the given base */ - public String convertToAnyBase(int inp, int base) { ArrayList charArr = new ArrayList<>(); while (inp > 0) { - charArr.add(reVal(inp%base)); + charArr.add(reVal(inp % base)); inp /= base; } StringBuilder str = new StringBuilder(charArr.size()); - for(Character ch: charArr) { + for (Character ch : charArr) { str.append(ch); } @@ -28,14 +29,15 @@ public String convertToAnyBase(int inp, int base) { /** * This method produces character value of the input integer and returns it + * * @param num integer of which we need the character value of * @return character value of input integer */ private char reVal(int num) { if (num >= 0 && num <= 9) - return (char)(num + '0'); + return (char) (num + '0'); else - return (char)(num - 10 + 'A'); + return (char) (num - 10 + 'A'); } } diff --git a/src/main/java/com/conversions/DecimalToHexadecimal.java b/src/main/java/com/conversions/DecimalToHexadecimal.java index cce2666..e0e9360 100644 --- a/src/main/java/com/conversions/DecimalToHexadecimal.java +++ b/src/main/java/com/conversions/DecimalToHexadecimal.java @@ -3,15 +3,16 @@ import java.math.BigInteger; public class DecimalToHexadecimal { - private static final char hexChars[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + private static final char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; private static final BigInteger valueHex = new BigInteger("16"); /** * This method converts and decimal number to a Hexadecimal number + * * @param decimalStr * @return hexadecimal number */ - public String decimalToHex(String decimalStr){ + public String decimalToHex(String decimalStr) { BigInteger decimal = new BigInteger(decimalStr); int rem; diff --git a/src/main/java/com/conversions/DecimalToOctal.java b/src/main/java/com/conversions/DecimalToOctal.java index 743b0e0..6ab6e72 100644 --- a/src/main/java/com/conversions/DecimalToOctal.java +++ b/src/main/java/com/conversions/DecimalToOctal.java @@ -3,20 +3,21 @@ import java.math.BigInteger; public class DecimalToOctal { - private static final char octalChars[] = {'0','1','2','3','4','5','6','7'}; + private static final char[] octalChars = {'0', '1', '2', '3', '4', '5', '6', '7'}; private static final BigInteger valueOctal = new BigInteger("8"); /** * This method converts and decimal number to a octal number + * * @param decimalStr * @return octal number */ - public String decimalToOctal(String decimalStr){ + public String decimalToOctal(String decimalStr) { BigInteger decimal = new BigInteger(decimalStr); int rem; String octal = ""; - while(decimal.compareTo(BigInteger.ZERO) > 0) { + while (decimal.compareTo(BigInteger.ZERO) > 0) { rem = decimal.mod(valueOctal).intValueExact(); octal = octalChars[rem] + octal; decimal = decimal.divide(valueOctal); diff --git a/src/main/java/com/dataStructures/BinaryTree.java b/src/main/java/com/dataStructures/BinaryTree.java index 8cdb319..3542bce 100644 --- a/src/main/java/com/dataStructures/BinaryTree.java +++ b/src/main/java/com/dataStructures/BinaryTree.java @@ -2,39 +2,42 @@ /** * Binary tree for general value type, without redundancy - * @author RICARDO + * * @param root data */ + public class BinaryTree { private final T data; - private BinaryTree right, // the upper binary tree - left; // the lower binary tree + private BinaryTree right, // the upper binary tree + left; // the lower binary tree public BinaryTree(T data) { this.data = data; } @Override - public String toString(){ + public String toString() { return this.data.toString(); } - + /** * inserts a new value in it's correspondant place - * @param newDataValue value of the new banary tree to add on this tree + * + * @param newDataValue value of the new binary tree to add on this tree */ - public void insert(T newDataValue){ + public void insert(T newDataValue) { this.insert(new BinaryTree(newDataValue)); } - + /** * inserts a new binary tree in it's correspondant place - * @param newData new value to add on this tree + * + * @param newData new value to add on this tree */ - public void insert(BinaryTree newData){ - + public void insert(BinaryTree newData) { + int cpr = newData.data.compareTo(this.data); //new value comparission respect to actual value - + if (cpr < 0) if (this.left == null) this.setLeft(newData); @@ -51,12 +54,13 @@ else if (cpr > 0) /** * search and specific value on the tree - * @param data Searched value - * @return Binary tree wich contains the value, null if it doesn't exist + * + * @param data Searched value + * @return Binary tree which contains the value, null if it doesn't exist */ - public BinaryTree search(T data){ + public BinaryTree search(T data) { int cpr = data.compareTo(this.data); //new value comparission respect to actual value - + if (cpr < 0) { if (this.left == null) return null; //the value doesn't exist @@ -65,43 +69,45 @@ public BinaryTree search(T data){ if (cpr > 0) { if (this.right == null) return null; //the value doesn't exist - return this.right.search(data); + return this.right.search(data); } return this; } - + /** * Checks if the data value exist in the tree + * * @param data data to be searched * @return true if this tree contains the data value, false if not. */ - public boolean contains(T data){ + public boolean contains(T data) { return this.search(data) != null; } - + /** * uses recursive black magic to print this tree in console + * * @param tabCounter prev tabs */ - private void print(int tabCounter){ + private void print(int tabCounter) { for (int i = 0; i < tabCounter; i++) System.out.print("\t"); - + System.out.println(this); - + if (this.left != null) this.left.print(tabCounter + 1); //it can't be ++ , pls don't change it if (this.right != null) this.right.print(tabCounter + 1); //it can't be ++ , pls don't change it } - + /** * uses black magic to print this tree in console */ - public void print(){ + public void print() { this.print(0); } - + //getters and setters public T getData() { return data; diff --git a/src/main/java/com/dataStructures/DisjointSet.java b/src/main/java/com/dataStructures/DisjointSet.java index c2a59c3..3fb70f6 100644 --- a/src/main/java/com/dataStructures/DisjointSet.java +++ b/src/main/java/com/dataStructures/DisjointSet.java @@ -15,7 +15,6 @@ *

* 2. quickly query two elements whether contained in the same set, requiring about O(1) time. * - * @author yangxf */ public class DisjointSet implements Serializable { private static final long serialVersionUID = 3134700471905625636L; diff --git a/src/main/java/com/generation/SimplexNoise.java b/src/main/java/com/generation/SimplexNoise.java index 699e0a2..a4fcb3f 100644 --- a/src/main/java/com/generation/SimplexNoise.java +++ b/src/main/java/com/generation/SimplexNoise.java @@ -7,128 +7,131 @@ */ public class SimplexNoise { - private SimplexNoiseOctave[] octaves; - private double[] frequencys; - private double[] amplitudes; - private int largestFeature; - private double persistance; - private long seed; - - /** - * @param largestFeature the diameter of the largest possible "cloud". - * @param persistence the persistence. a low persistence causes smoother transition between the features while a high one makes the transition hard. (range = {@code 0.0F} - {@code 1.0F}) - * @param seed the seed this algorithm will use to generate pseudo random numbers. The generation will always look the same if the seed and the other parameters have the same value as in a previous generation - */ - public SimplexNoise(int largestFeature, double persistence, long seed) { - - this.largestFeature = largestFeature; - this.persistance = persistence; - this.seed = seed; - - int octaveCount = (int)Math.ceil(Math.log10(largestFeature) / Math.log10(2.0D)); - this.octaves = new SimplexNoiseOctave[octaveCount]; - this.frequencys = new double[octaveCount]; - this.amplitudes = new double[octaveCount]; - - Random random = new Random(seed); - - for(int index = 0; index < octaveCount; index++) { - - this.octaves[index] = new SimplexNoiseOctave(random.nextInt()); - this.frequencys[index] = Math.pow(2, index); - this.amplitudes[index] = Math.pow(persistence, octaveCount - index); - } - } - - /** - * Generates a height map. - * @param x X coordinate - * @param y Y coordinate - * @param width width - * @param height height - * @return the generated height map - */ - public float[][] generateHeightMap(int x, int y, int width, int height) { - - int xEnd = x + width; - int yEnd = y + height; - - float[][] result = new float[width][height]; - - for(int i = 0; i < width; i++) { - - for(int j = 0; j < height; j++) { - - int posX = x + i * ((xEnd - x) / width); - int posY = y + j * ((yEnd - y) / height); - result[i][j] = Math.min(1.0F, Math.max(0.0F, (float)(0.5D * (1 + this.getNoise(posX, posY))))); - } - } - - return result; - } - - /** - * Generates a two dimensional noise. - * @param x X coordinate - * @param y Y coordinate - * @return the generated noise - */ - public double getNoise(int x, int y) { - - double result = 0; - - for(int index = 0; index < this.octaves.length; index++) { - - result += this.octaves[index].noise(x / this.frequencys[index], y / this.frequencys[index]) * this.amplitudes[index]; - } - - return result; - } - - /** - * Generates a three dimensional noise. - * @param x X coordinate - * @param y Y coordinate - * @param z Z coordinate - * @return the generated noise - */ - public double getNoise(int x, int y, int z) { - - double result = 0; - - for(int index = 0; index < this.octaves.length; index++) { - - double frequency = Math.pow(2, index); - double amplitude = Math.pow(this.persistance, this.octaves.length - index); - - result += this.octaves[index].noise(x / frequency, y / frequency, z / frequency) * amplitude; - } - - return result; - } - - /** - * @return the largest possible feature - */ - public int getLargestFeature() { - - return this.largestFeature; - } - - /** - * @return the persistence - */ - public double getPersistance() { - - return this.persistance; - } - - /** - * @return the seed - */ - public long getSeed() { - - return this.seed; - } + private SimplexNoiseOctave[] octaves; + private double[] frequencys; + private double[] amplitudes; + private int largestFeature; + private double persistance; + private long seed; + + /** + * @param largestFeature the diameter of the largest possible "cloud". + * @param persistence the persistence. a low persistence causes smoother transition between the features while a high one makes the transition hard. (range = {@code 0.0F} - {@code 1.0F}) + * @param seed the seed this algorithm will use to generate pseudo random numbers. The generation will always look the same if the seed and the other parameters have the same value as in a previous generation + */ + public SimplexNoise(int largestFeature, double persistence, long seed) { + + this.largestFeature = largestFeature; + this.persistance = persistence; + this.seed = seed; + + int octaveCount = (int) Math.ceil(Math.log10(largestFeature) / Math.log10(2.0D)); + this.octaves = new SimplexNoiseOctave[octaveCount]; + this.frequencys = new double[octaveCount]; + this.amplitudes = new double[octaveCount]; + + Random random = new Random(seed); + + for (int index = 0; index < octaveCount; index++) { + + this.octaves[index] = new SimplexNoiseOctave(random.nextInt()); + this.frequencys[index] = Math.pow(2, index); + this.amplitudes[index] = Math.pow(persistence, octaveCount - index); + } + } + + /** + * Generates a height map. + * + * @param x X coordinate + * @param y Y coordinate + * @param width width + * @param height height + * @return the generated height map + */ + public float[][] generateHeightMap(int x, int y, int width, int height) { + + int xEnd = x + width; + int yEnd = y + height; + + float[][] result = new float[width][height]; + + for (int i = 0; i < width; i++) { + + for (int j = 0; j < height; j++) { + + int posX = x + i * ((xEnd - x) / width); + int posY = y + j * ((yEnd - y) / height); + result[i][j] = Math.min(1.0F, Math.max(0.0F, (float) (0.5D * (1 + this.getNoise(posX, posY))))); + } + } + + return result; + } + + /** + * Generates a two dimensional noise. + * + * @param x X coordinate + * @param y Y coordinate + * @return the generated noise + */ + public double getNoise(int x, int y) { + + double result = 0; + + for (int index = 0; index < this.octaves.length; index++) { + + result += this.octaves[index].noise(x / this.frequencys[index], y / this.frequencys[index]) * this.amplitudes[index]; + } + + return result; + } + + /** + * Generates a three dimensional noise. + * + * @param x X coordinate + * @param y Y coordinate + * @param z Z coordinate + * @return the generated noise + */ + public double getNoise(int x, int y, int z) { + + double result = 0; + + for (int index = 0; index < this.octaves.length; index++) { + + double frequency = Math.pow(2, index); + double amplitude = Math.pow(this.persistance, this.octaves.length - index); + + result += this.octaves[index].noise(x / frequency, y / frequency, z / frequency) * amplitude; + } + + return result; + } + + /** + * @return the largest possible feature + */ + public int getLargestFeature() { + + return this.largestFeature; + } + + /** + * @return the persistence + */ + public double getPersistance() { + + return this.persistance; + } + + /** + * @return the seed + */ + public long getSeed() { + + return this.seed; + } } diff --git a/src/main/java/com/generation/SimplexNoiseOctave.java b/src/main/java/com/generation/SimplexNoiseOctave.java index 75d979e..b1e281d 100644 --- a/src/main/java/com/generation/SimplexNoiseOctave.java +++ b/src/main/java/com/generation/SimplexNoiseOctave.java @@ -14,7 +14,7 @@ public class SimplexNoiseOctave { new Gradient(1, 0, -1), new Gradient(-1, 0, -1), new Gradient(0, 1, 1), new Gradient(0, -1, 1), new Gradient(0, 1, -1), new Gradient(0, -1, -1) }; - private static final short P_SUPPLY[] = { + private static final short[] P_SUPPLY = { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, diff --git a/src/main/java/com/matchings/stableMatching/GaleShapley.java b/src/main/java/com/matchings/stableMatching/GaleShapley.java index 3c60e83..18624f9 100644 --- a/src/main/java/com/matchings/stableMatching/GaleShapley.java +++ b/src/main/java/com/matchings/stableMatching/GaleShapley.java @@ -5,8 +5,8 @@ public class GaleShapley { /** * Return a stable matching between men and women according to their preferences, * following the Gale-Shapley algorithm. - * - * @param menPrefs for each man, for each preference rank, the corresponding woman + * + * @param menPrefs for each man, for each preference rank, the corresponding woman * @param womenPrefs for each woman, for each preference rank, the corresponding man * @return for each man, the associated woman (1-dimensional array) */ @@ -88,7 +88,7 @@ public int[] GaleShapleyStableMarriage(int[][] menPrefs, int[][] womenPrefs) { /** * Get a currently unengaged man, if there is one - * + * * @param menMatching the current men matching array (being constructed) * @return the first man that is not engaged, or -1 if all men are engaged */ diff --git a/src/main/java/com/search/BloomFilter.java b/src/main/java/com/search/BloomFilter.java index 122a302..70a7f1c 100644 --- a/src/main/java/com/search/BloomFilter.java +++ b/src/main/java/com/search/BloomFilter.java @@ -16,7 +16,6 @@ *

* The accuracy rate depends on capacity and hash functions. * - * @author yangxf */ public class BloomFilter implements Serializable { private static final long serialVersionUID = -4466610350741278658L; diff --git a/src/main/java/com/search/LinearSearch.java b/src/main/java/com/search/LinearSearch.java index e8e8e3e..66db8aa 100644 --- a/src/main/java/com/search/LinearSearch.java +++ b/src/main/java/com/search/LinearSearch.java @@ -15,7 +15,7 @@ public final class LinearSearch { * @param is any comparable type * @return index of the element */ - public static > int findIndex(T array[], T key) { + public static > int findIndex(T[] array, T key) { return search(array, key); } @@ -24,7 +24,7 @@ public static > int findIndex(T array[], T key) { * @param key The element you are looking for * @return the location of the key or -1 if the element is not found **/ - private static > int search(T array[], T key){ + private static > int search(T[] array, T key){ for(int i = 0; i < array.length;i++) { if (array[i].compareTo(key) == 0){ return i; diff --git a/src/main/java/com/sorts/HeapSort.java b/src/main/java/com/sorts/HeapSort.java index a1cefd0..4135e5b 100644 --- a/src/main/java/com/sorts/HeapSort.java +++ b/src/main/java/com/sorts/HeapSort.java @@ -9,107 +9,106 @@ public class HeapSort { + private static class Heap> { + /** + * Array to store heap + */ + private T[] heap; + + /** + * Constructor + * + * @param heap array of unordered integers + */ + Heap(T[] heap) { + this.heap = heap; + } - private static class Heap> { - /** - * Array to store heap - */ - private T[] heap; - - /** - * Constructor - * - * @param heap array of unordered integers - */ - Heap(T[] heap) { - this.heap = heap; - } + /** + * Heapifies subtree from top as root to last as last child + * + * @param rootIndex index of root + * @param lastChild index of last child + */ + private void heapSubtree(int rootIndex, int lastChild) { + int leftIndex = rootIndex * 2 + 1; + int rightIndex = rootIndex * 2 + 2; + T root = heap[rootIndex]; + if (rightIndex <= lastChild) { + // if has right and left children + T left = heap[leftIndex]; + T right = heap[rightIndex]; + if (less(left, right) && less(left, root)) { + swap(heap, leftIndex, rootIndex); + heapSubtree(leftIndex, lastChild); + } else if (less(right, root)) { + swap(heap, rightIndex, rootIndex); + heapSubtree(rightIndex, lastChild); + } + } else if (leftIndex <= lastChild) { + // if no right child, but has left child + T left = heap[leftIndex]; + if (less(left, root)) { + swap(heap, leftIndex, rootIndex); + heapSubtree(leftIndex, lastChild); + } + } + } - /** - * Heapifies subtree from top as root to last as last child - * - * @param rootIndex index of root - * @param lastChild index of last child - */ - private void heapSubtree(int rootIndex, int lastChild) { - int leftIndex = rootIndex * 2 + 1; - int rightIndex = rootIndex * 2 + 2; - T root = heap[rootIndex]; - if (rightIndex <= lastChild) { - // if has right and left children - T left = heap[leftIndex]; - T right = heap[rightIndex]; - if (less(left, right) && less(left, root)) { - swap(heap, leftIndex, rootIndex); - heapSubtree(leftIndex, lastChild); - } else if (less(right, root)) { - swap(heap, rightIndex, rootIndex); - heapSubtree(rightIndex, lastChild); + + /** + * Makes heap with root as root + * + * @param root index of root of heap + */ + private void makeMinHeap(int root) { + int leftIndex = root * 2 + 1; + int rightIndex = root * 2 + 2; + boolean hasLeftChild = leftIndex < heap.length; + boolean hasRightChild = rightIndex < heap.length; + if (hasRightChild) { + //if has left and right + makeMinHeap(leftIndex); + makeMinHeap(rightIndex); + heapSubtree(root, heap.length - 1); + } else if (hasLeftChild) { + heapSubtree(root, heap.length - 1); + } } - } else if (leftIndex <= lastChild) { - // if no right child, but has left child - T left = heap[leftIndex]; - if (less(left, root)) { - swap(heap, leftIndex, rootIndex); - heapSubtree(leftIndex, lastChild); + + /** + * Gets the root of heap + * + * @return root of heap + */ + private T getRoot(int size) { + swap(heap, 0, size); + heapSubtree(0, size - 1); + // return old root + return heap[size]; } - } - } - /** - * Makes heap with root as root - * - * @param root index of root of heap - */ - private void makeMinHeap(int root) { - int leftIndex = root * 2 + 1; - int rightIndex = root * 2 + 2; - boolean hasLeftChild = leftIndex < heap.length; - boolean hasRightChild = rightIndex < heap.length; - if (hasRightChild) { - //if has left and right - makeMinHeap(leftIndex); - makeMinHeap(rightIndex); - heapSubtree(root, heap.length - 1); - } else if (hasLeftChild) { - heapSubtree(root, heap.length - 1); - } } - /** - * Gets the root of heap - * - * @return root of heap - */ - private T getRoot(int size) { - swap(heap, 0, size); - heapSubtree(0, size - 1); - // return old root - return heap[size]; + public > T[] sort(T[] unsorted) { + return sort(Arrays.asList(unsorted)).toArray(unsorted); } + private > List sort(List unsorted) { + int size = unsorted.size(); - } - - public > T[] sort(T[] unsorted) { - return sort(Arrays.asList(unsorted)).toArray(unsorted); - } - - private > List sort(List unsorted) { - int size = unsorted.size(); + @SuppressWarnings("unchecked") + Heap heap = new Heap<>(unsorted.toArray((T[]) new Comparable[unsorted.size()])); - @SuppressWarnings("unchecked") - Heap heap = new Heap<>(unsorted.toArray((T[]) new Comparable[unsorted.size()])); + // make min heap using index 0 as root. + heap.makeMinHeap(0); + List sorted = new ArrayList<>(size); + while (size > 0) { + T min = heap.getRoot(--size); + sorted.add(min); + } - // make min heap using index 0 as root. - heap.makeMinHeap(0); - List sorted = new ArrayList<>(size); - while (size > 0) { - T min = heap.getRoot(--size); - sorted.add(min); + return sorted; } - - return sorted; - } } \ No newline at end of file diff --git a/src/main/java/com/sorts/MergeSort.java b/src/main/java/com/sorts/MergeSort.java index 3582a08..6d6516b 100644 --- a/src/main/java/com/sorts/MergeSort.java +++ b/src/main/java/com/sorts/MergeSort.java @@ -2,74 +2,74 @@ public class MergeSort { - /** - * This method implements the Generic Merge Sort - * - * @param unsorted the array which should be sorted - * @param Comparable class - * @return sorted array - */ - @SuppressWarnings("unchecked") - public > T[] sort(T[] unsorted) { - T[] tmp = (T[]) new Comparable[unsorted.length]; - doSort(unsorted, tmp, 0, unsorted.length - 1); - return unsorted; - } + /** + * This method implements the Generic Merge Sort + * + * @param unsorted the array which should be sorted + * @param Comparable class + * @return sorted array + */ + @SuppressWarnings("unchecked") + public > T[] sort(T[] unsorted) { + T[] tmp = (T[]) new Comparable[unsorted.length]; + doSort(unsorted, tmp, 0, unsorted.length - 1); + return unsorted; + } - /** - * @param arr The array to be sorted - * @param temp The copy of the actual array - * @param left The first index of the array - * @param right The last index of the array - * Recursively sorts the array in increasing order - **/ - private static > void doSort(T[] arr, T[] temp, int left, int right) { - if (left < right) { - int mid = left + (right - left) / 2; - doSort(arr, temp, left, mid); - doSort(arr, temp, mid + 1, right); - merge(arr, temp, left, mid, right); + /** + * @param arr The array to be sorted + * @param temp The copy of the actual array + * @param left The first index of the array + * @param right The last index of the array + * Recursively sorts the array in increasing order + **/ + private static > void doSort(T[] arr, T[] temp, int left, int right) { + if (left < right) { + int mid = left + (right - left) / 2; + doSort(arr, temp, left, mid); + doSort(arr, temp, mid + 1, right); + merge(arr, temp, left, mid, right); + } } - } - /** - * This method implements the merge step of the merge sort - * - * @param arr The array to be sorted - * @param temp The copy of the actual array - * @param left The first index of the array - * @param mid The middle index of the array - * @param right The last index of the array - * merges two parts of an array in increasing order - **/ - private static > void merge(T[] arr, T[] temp, int left, int mid, int right) { - System.arraycopy(arr, left, temp, left, right - left + 1); + /** + * This method implements the merge step of the merge sort + * + * @param arr The array to be sorted + * @param temp The copy of the actual array + * @param left The first index of the array + * @param mid The middle index of the array + * @param right The last index of the array + * merges two parts of an array in increasing order + **/ + private static > void merge(T[] arr, T[] temp, int left, int mid, int right) { + System.arraycopy(arr, left, temp, left, right - left + 1); - int i = left; - int j = mid + 1; - int k = left; + int i = left; + int j = mid + 1; + int k = left; - while (i <= mid && j <= right) { - if (temp[i].compareTo(temp[j]) <= 0) { - arr[k] = temp[i]; - i++; - } else { - arr[k] = temp[j]; - j++; - } - k++; - } + while (i <= mid && j <= right) { + if (temp[i].compareTo(temp[j]) <= 0) { + arr[k] = temp[i]; + i++; + } else { + arr[k] = temp[j]; + j++; + } + k++; + } - while (i <= mid) { - arr[k] = temp[i]; - i++; - k++; - } + while (i <= mid) { + arr[k] = temp[i]; + i++; + k++; + } - while (j <= right) { - arr[k] = temp[j]; - j++; - k++; + while (j <= right) { + arr[k] = temp[j]; + j++; + k++; + } } - } } diff --git a/src/main/java/com/sorts/QuickSort.java b/src/main/java/com/sorts/QuickSort.java index 31d6a0f..e1a5f15 100644 --- a/src/main/java/com/sorts/QuickSort.java +++ b/src/main/java/com/sorts/QuickSort.java @@ -5,61 +5,60 @@ public class QuickSort { - - /** - * This method implements the Generic Quick Sort - * - * @param array The array to be sorted - * Sorts the array in increasing order - **/ - public > T[] sort(T[] array) { - doSort(array, 0, array.length - 1); - return array; - } + /** + * This method implements the Generic Quick Sort + * + * @param array The array to be sorted + * Sorts the array in increasing order + **/ + public > T[] sort(T[] array) { + doSort(array, 0, array.length - 1); + return array; + } - /** - * The sorting process - * - * @param left The first index of an array - * @param right The last index of an array - * @param array The array to be sorted - **/ + /** + * The sorting process + * + * @param left The first index of an array + * @param right The last index of an array + * @param array The array to be sorted + **/ - private static > void doSort(T[] array, int left, int right) { - if (left < right) { - int pivot = partition(array, left, right); - doSort(array, left, pivot - 1); - doSort(array, pivot, right); + private static > void doSort(T[] array, int left, int right) { + if (left < right) { + int pivot = partition(array, left, right); + doSort(array, left, pivot - 1); + doSort(array, pivot, right); + } } - } - /** - * This method finds the partition index for an array - * - * @param array The array to be sorted - * @param left The first index of an array - * @param right The last index of an array - * Finds the partition index of an array - **/ + /** + * This method finds the partition index for an array + * + * @param array The array to be sorted + * @param left The first index of an array + * @param right The last index of an array + * Finds the partition index of an array + **/ - private static > int partition(T[] array, int left, int right) { - int mid = (left + right) / 2; - T pivot = array[mid]; + private static > int partition(T[] array, int left, int right) { + int mid = (left + right) / 2; + T pivot = array[mid]; - while (left <= right) { - while (less(array[left], pivot)) { - ++left; - } - while (less(pivot, array[right])) { - --right; - } - if (left <= right) { - swap(array, left, right); - ++left; - --right; - } + while (left <= right) { + while (less(array[left], pivot)) { + ++left; + } + while (less(pivot, array[right])) { + --right; + } + if (left <= right) { + swap(array, left, right); + ++left; + --right; + } + } + return left; } - return left; - } } \ No newline at end of file diff --git a/src/main/java/com/sorts/SelectionSort.java b/src/main/java/com/sorts/SelectionSort.java index 1038bec..b498aa7 100644 --- a/src/main/java/com/sorts/SelectionSort.java +++ b/src/main/java/com/sorts/SelectionSort.java @@ -5,28 +5,28 @@ public class SelectionSort { - /** - * This method implements the Generic Selection Sort - * - * @param arr The array to be sorted - * Sorts the array in increasing order - **/ - public > T[] sort(T[] arr) { - int n = arr.length; - for (int i = 0; i < n - 1; i++) { - // Initial index of min - int min = i; - for (int j = i + 1; j < n; j++) { - if (less(arr[j], arr[min])) { - min = j; + /** + * This method implements the Generic Selection Sort + * + * @param arr The array to be sorted + * Sorts the array in increasing order + **/ + public > T[] sort(T[] arr) { + int n = arr.length; + for (int i = 0; i < n - 1; i++) { + // Initial index of min + int min = i; + for (int j = i + 1; j < n; j++) { + if (less(arr[j], arr[min])) { + min = j; + } + } + // Swapping if index of min is changed + if (min != i) { + swap(arr, i, min); + } } - } - // Swapping if index of min is changed - if (min != i) { - swap(arr, i, min); - } - } - return arr; - } + return arr; + } } \ No newline at end of file diff --git a/src/main/java/com/sorts/ShellSort.java b/src/main/java/com/sorts/ShellSort.java index d300cfc..8ec8e41 100644 --- a/src/main/java/com/sorts/ShellSort.java +++ b/src/main/java/com/sorts/ShellSort.java @@ -5,28 +5,28 @@ public class ShellSort { - /** - * This method implements Generic Shell Sort. - * - * @param array The array to be sorted - */ - public > T[] sort(T[] array) { - int length = array.length; - int n = 1; + /** + * This method implements Generic Shell Sort. + * + * @param array The array to be sorted + */ + public > T[] sort(T[] array) { + int length = array.length; + int n = 1; - while (n < length / 3) { - n = 3 * n + 1; - } + while (n < length / 3) { + n = 3 * n + 1; + } - while (n >= 1) { - for (int i = n; i < length; i++) { - for (int j = i; j >= n && less(array[j], array[j - n]); j -= n) { - swap(array, j, j - n); + while (n >= 1) { + for (int i = n; i < length; i++) { + for (int j = i; j >= n && less(array[j], array[j - n]); j -= n) { + swap(array, j, j - n); + } + } + n /= 3; } - } - n /= 3; - } - return array; - } + return array; + } } \ No newline at end of file diff --git a/src/main/java/com/sorts/SortUtils.java b/src/main/java/com/sorts/SortUtils.java index 26fc683..bd5e5a6 100644 --- a/src/main/java/com/sorts/SortUtils.java +++ b/src/main/java/com/sorts/SortUtils.java @@ -3,43 +3,43 @@ final class SortUtils { - /** - * Helper method for swapping places in array - * - * @param array The array which elements we want to swap - * @param idx index of the first element - * @param idy index of the second element - */ - static boolean swap(T[] array, int idx, int idy) { - T swap = array[idx]; - array[idx] = array[idy]; - array[idy] = swap; - return true; - } + /** + * Helper method for swapping places in array + * + * @param array The array which elements we want to swap + * @param idx index of the first element + * @param idy index of the second element + */ + static boolean swap(T[] array, int idx, int idy) { + T swap = array[idx]; + array[idx] = array[idy]; + array[idy] = swap; + return true; + } - /** - * This method checks if first element is less then the other element - * - * @param v first element - * @param w second element - * @return true if the first element is less then the second element - */ - static > boolean less(T v, T w) { - return v.compareTo(w) < 0; - } + /** + * This method checks if first element is less then the other element + * + * @param v first element + * @param w second element + * @return true if the first element is less then the second element + */ + static > boolean less(T v, T w) { + return v.compareTo(w) < 0; + } - /** - * Swaps all position from {@param left} to @{@param right} for {@param array} - * - * @param array is an array - * @param left is a left flip border of the array - * @param right is a right flip border of the array - */ - static > void flip(T[] array, int left, int right) { - while (left <= right) { - swap(array, left++, right--); + /** + * Swaps all position from {@param left} to @{@param right} for {@param array} + * + * @param array is an array + * @param left is a left flip border of the array + * @param right is a right flip border of the array + */ + static > void flip(T[] array, int left, int right) { + while (left <= right) { + swap(array, left++, right--); + } } - } } \ No newline at end of file diff --git a/src/main/java/com/sorts/StoogeSort.java b/src/main/java/com/sorts/StoogeSort.java index fe81a6d..b57d35d 100644 --- a/src/main/java/com/sorts/StoogeSort.java +++ b/src/main/java/com/sorts/StoogeSort.java @@ -5,35 +5,35 @@ public class StoogeSort { - /** - * This method implements recursion StoogeSort - * - * @param int[] array to store number elements - * @param f first element in the array - * @param l last element in the array - */ - public > T[] sort(T[] arr, int f, int l) { - - // Ends recursion when met - if (f >= l) - return arr; - - if (less(arr[l], arr[f])) { - swap(arr, f, l); - } - - if (l - f + 1 > 2) { - int entry = (l - f + 1) / 3; - - // Does a recursive sort of the first two thirds elements - sort(arr, f, l - entry); - - // Does a recursive sort of the last two thirds elements - sort(arr, f + entry, l); - - // Another recursive sort first two thirds elements to confirm - sort(arr, f, l - entry); - } - return arr; - } + /** + * This method implements recursion StoogeSort + * + * @param arr array to store number elements + * @param f first element in the array + * @param l last element in the array + */ + public > T[] sort(T[] arr, int f, int l) { + + // Ends recursion when met + if (f >= l) + return arr; + + if (less(arr[l], arr[f])) { + swap(arr, f, l); + } + + if (l - f + 1 > 2) { + int entry = (l - f + 1) / 3; + + // Does a recursive sort of the first two thirds elements + sort(arr, f, l - entry); + + // Does a recursive sort of the last two thirds elements + sort(arr, f + entry, l); + + // Another recursive sort first two thirds elements to confirm + sort(arr, f, l - entry); + } + return arr; + } } \ No newline at end of file diff --git a/src/main/java/com/types/Sort.java b/src/main/java/com/types/Sort.java index da89756..e3316b4 100644 --- a/src/main/java/com/types/Sort.java +++ b/src/main/java/com/types/Sort.java @@ -3,5 +3,5 @@ @FunctionalInterface public interface Sort { - public > T[] sort(T[] array); + > T[] sort(T[] array); } diff --git a/src/test/java/com/dataStructures/BinaryTreeTest.java b/src/test/java/com/dataStructures/BinaryTreeTest.java index b269441..383bc0a 100644 --- a/src/test/java/com/dataStructures/BinaryTreeTest.java +++ b/src/test/java/com/dataStructures/BinaryTreeTest.java @@ -1,30 +1,29 @@ -package src.main.java.com.dataStructures; +package src.test.java.com.dataStructures; import org.junit.Test; +import src.main.java.com.dataStructures.BinaryTree; + import static org.junit.Assert.*; -/** - * - * @author RICARDO - */ public class BinaryTreeTest { - + public BinaryTreeTest() { } - + /** * Test of insert method, of class BinaryTree. */ @Test - public void testInsert_BinaryTree() { + public void testInsertBinaryTree() { System.out.println("insert"); - BinaryTree lowerdata = new BinaryTree<>("1"); - BinaryTree upperdata = new BinaryTree<>("3"); + BinaryTree lowerData = new BinaryTree<>("1"); + BinaryTree upperData = new BinaryTree<>("3"); BinaryTree instance = new BinaryTree<>("2"); - instance.insert(lowerdata); - instance.insert(upperdata); - String proof = instance.getLeft().toString()+instance.toString()+instance.getRight().toString(); - System.out.println(proof); + instance.insert(lowerData); + instance.insert(upperData); + String proof = instance.getLeft().toString() + + instance.toString() + + instance.getRight().toString(); assertEquals("123", proof); } @@ -36,10 +35,10 @@ public void testSearch() { System.out.println("search"); BinaryTree instance = new BinaryTree<>(5); for (int i = 1; i < 10; i++) { - instance.insert(new Integer(i)); + instance.insert(i); } - BinaryTree result = instance.search(new Integer(1)); - assertEquals(new Integer(1), result.getData()); + BinaryTree result = instance.search(1); + assertEquals(1, result.getData()); } /** @@ -52,9 +51,8 @@ public void testContains() { for (int i = 1; i < 10; i++) { instance.insert(i); } - - boolean result = instance.contains(2)&&instance.contains(11); - assertEquals(false, result); - } + boolean result = instance.contains(2) && instance.contains(11); + assertFalse(result); + } } From 184f644bd7050f5ee0837b45a44ef5ef1e0eda69 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 10 May 2019 15:16:01 +0800 Subject: [PATCH 077/120] update binaryToGray --- .../java/com/conversions/BinaryToGray.java | 44 +++++++++---------- .../com/conversions/BinaryToGrayTest.java | 21 +++++---- 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/conversions/BinaryToGray.java b/src/main/java/com/conversions/BinaryToGray.java index 1482b8d..60896e0 100644 --- a/src/main/java/com/conversions/BinaryToGray.java +++ b/src/main/java/com/conversions/BinaryToGray.java @@ -1,28 +1,26 @@ package src.main.java.com.conversions; -public class BinaryToGray -{ - /* This method convert the binary number into gray code - @param binarycode need to convert binary number into gray code - @return graycode return as string - */ +/** + * Convert the binary number into gray code + */ +public class BinaryToGray { - public String binaryToGray(String binarycode) - { - - StringBuilder graycode = new StringBuilder(Character.toString(binarycode.charAt(0))); - - for(int i = 0; i < binarycode.length() - 1; i++) - { - - if (binarycode.charAt(i) == binarycode.charAt(i+1)) - graycode.append("0"); - else - graycode.append("1"); - - } - - return graycode.toString(); - } + /** + * convert the binary number into gray code + * + * @param binaryCode binary number + * @return grayCode return as string + */ + public String binaryToGray(String binaryCode) { + StringBuilder grayCode = new StringBuilder(Character.toString(binaryCode.charAt(0))); + + for (int i = 0; i < binaryCode.length() - 1; i++) { + if (binaryCode.charAt(i) == binaryCode.charAt(i + 1)) + grayCode.append("0"); + else + grayCode.append("1"); + } + return grayCode.toString(); + } } diff --git a/src/test/java/com/conversions/BinaryToGrayTest.java b/src/test/java/com/conversions/BinaryToGrayTest.java index c44f547..64de892 100644 --- a/src/test/java/com/conversions/BinaryToGrayTest.java +++ b/src/test/java/com/conversions/BinaryToGrayTest.java @@ -2,17 +2,16 @@ import src.main.java.com.conversions.BinaryToGray; import org.junit.Test; + import static org.junit.Assert.assertEquals; -public class BinaryToGrayTest -{ - - @Test - public void testBinaryToGray() - { - BinaryToGray btog = new BinaryToGray(); - assertEquals("1101", btog.binaryToGray("1001")); - assertEquals("11010011101",btog.binaryToGray("10011101001")); - } - +public class BinaryToGrayTest { + + @Test + public void testBinaryToGray() { + BinaryToGray binaryToGray = new BinaryToGray(); + assertEquals("1101", binaryToGray.binaryToGray("1001")); + assertEquals("11010011101", binaryToGray.binaryToGray("10011101001")); + } + } From fbffeb658c131440196f5cd9b6d330fd93847b41 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 10 May 2019 15:39:18 +0800 Subject: [PATCH 078/120] refactor: update FastPower --- .../com/{Others => others}/FastPower.java | 0 src/test/java/com/others/FastPowerTest.java | 9 +++++++ .../others/FastPowerTest.java___jb_tmp___} | 25 +++++++++++-------- 3 files changed, 23 insertions(+), 11 deletions(-) rename src/main/java/com/{Others => others}/FastPower.java (100%) create mode 100644 src/test/java/com/others/FastPowerTest.java rename src/{main/java/com/Others/FastPowerTest.java => test/java/com/others/FastPowerTest.java___jb_tmp___} (52%) diff --git a/src/main/java/com/Others/FastPower.java b/src/main/java/com/others/FastPower.java similarity index 100% rename from src/main/java/com/Others/FastPower.java rename to src/main/java/com/others/FastPower.java diff --git a/src/test/java/com/others/FastPowerTest.java b/src/test/java/com/others/FastPowerTest.java new file mode 100644 index 0000000..af38477 --- /dev/null +++ b/src/test/java/com/others/FastPowerTest.java @@ -0,0 +1,9 @@ +package src.test.java.com.others; + +/** + * @author bingo + * @since 2019/5/10 + */ + +public class FastPowerTest { +} diff --git a/src/main/java/com/Others/FastPowerTest.java b/src/test/java/com/others/FastPowerTest.java___jb_tmp___ similarity index 52% rename from src/main/java/com/Others/FastPowerTest.java rename to src/test/java/com/others/FastPowerTest.java___jb_tmp___ index bd61704..4a08656 100644 --- a/src/main/java/com/Others/FastPowerTest.java +++ b/src/test/java/com/others/FastPowerTest.java___jb_tmp___ @@ -1,6 +1,7 @@ -package src.main.java.com.Others; +package src.test.java.com.others; -import org.junit.*; +import org.junit.Test; +import src.main.java.com.others.FastPower; import java.math.BigInteger; @@ -8,23 +9,25 @@ public class FastPowerTest { - void testLong(long n, long k, long m){ - long result = FastPower.calculate(n,k,m); + @Test + void testLong(long n, long k, long m) { + long result = FastPower.calculate(n, k, m); assertEquals(result, BigInteger.valueOf(n).modPow(BigInteger.valueOf(k), BigInteger.valueOf(m)).longValue()); } - void testBigInteger(BigInteger n, BigInteger k, BigInteger m){ - BigInteger result = FastPower.calculate(n,k,m); - assertEquals(result, n.modPow(k,m)); + @Test + void testBigInteger(BigInteger n, BigInteger k, BigInteger m) { + BigInteger result = FastPower.calculate(n, k, m); + assertEquals(result, n.modPow(k, m)); } @Test public void test() { - testLong(2,2,10); - testLong(100,1000,20); - testLong(123456,123456789,234); + testLong(2, 2, 10); + testLong(100, 1000, 20); + testLong(123456, 123456789, 234); - testBigInteger(BigInteger.TEN,BigInteger.TEN, BigInteger.valueOf(4)); + testBigInteger(BigInteger.TEN, BigInteger.TEN, BigInteger.valueOf(4)); testBigInteger(new BigInteger("123456"), new BigInteger("123456789"), new BigInteger("234")); testBigInteger(new BigInteger("123456789101112"), new BigInteger("12345678910111213"), new BigInteger("567890")); From 1041b02e6b81f44af8c25707edf885bced453b1c Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Fri, 10 May 2019 15:42:08 +0800 Subject: [PATCH 079/120] refactor: update FastPower --- src/main/java/com/others/FastPower.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/others/FastPower.java b/src/main/java/com/others/FastPower.java index 8cc1b8b..ef1bd89 100644 --- a/src/main/java/com/others/FastPower.java +++ b/src/main/java/com/others/FastPower.java @@ -1,4 +1,4 @@ -package src.main.java.com.Others; +package src.main.java.com.others; import java.math.BigInteger; @@ -7,14 +7,13 @@ * FastPower aims to calculate quickly in this circumstances with time complexity O(log k), * where k is the index. * - * @author DDullahan */ public class FastPower { public static BigInteger calculate(BigInteger n, BigInteger k, BigInteger mod) { BigInteger ans = BigInteger.ONE; while (!k.equals(BigInteger.ZERO)) { int odd = k.mod(BigInteger.valueOf(2)).compareTo(BigInteger.ZERO); - if(odd > 0){ + if (odd > 0) { ans = ans.multiply(n).mod(mod); } k = k.divide(BigInteger.valueOf(2)); From cac1b0b4c7545c6605d3c0c839003f27b34b6a2c Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Fri, 10 May 2019 15:42:55 +0800 Subject: [PATCH 080/120] Delete FastPowerTest.java___jb_tmp___ --- .../com/others/FastPowerTest.java___jb_tmp___ | 35 ------------------- 1 file changed, 35 deletions(-) delete mode 100644 src/test/java/com/others/FastPowerTest.java___jb_tmp___ diff --git a/src/test/java/com/others/FastPowerTest.java___jb_tmp___ b/src/test/java/com/others/FastPowerTest.java___jb_tmp___ deleted file mode 100644 index 4a08656..0000000 --- a/src/test/java/com/others/FastPowerTest.java___jb_tmp___ +++ /dev/null @@ -1,35 +0,0 @@ -package src.test.java.com.others; - -import org.junit.Test; -import src.main.java.com.others.FastPower; - -import java.math.BigInteger; - -import static org.junit.Assert.*; - -public class FastPowerTest { - - @Test - void testLong(long n, long k, long m) { - long result = FastPower.calculate(n, k, m); - assertEquals(result, BigInteger.valueOf(n).modPow(BigInteger.valueOf(k), BigInteger.valueOf(m)).longValue()); - } - - @Test - void testBigInteger(BigInteger n, BigInteger k, BigInteger m) { - BigInteger result = FastPower.calculate(n, k, m); - assertEquals(result, n.modPow(k, m)); - } - - @Test - public void test() { - testLong(2, 2, 10); - testLong(100, 1000, 20); - testLong(123456, 123456789, 234); - - testBigInteger(BigInteger.TEN, BigInteger.TEN, BigInteger.valueOf(4)); - testBigInteger(new BigInteger("123456"), new BigInteger("123456789"), new BigInteger("234")); - testBigInteger(new BigInteger("123456789101112"), new BigInteger("12345678910111213"), new BigInteger("567890")); - - } -} \ No newline at end of file From ada660a4c313be9f4d3c2e50da4a3b2dc97f2f5f Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Fri, 10 May 2019 15:43:36 +0800 Subject: [PATCH 081/120] refactor: update FastPower --- src/test/java/com/others/FastPowerTest.java | 34 ++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/others/FastPowerTest.java b/src/test/java/com/others/FastPowerTest.java index af38477..c3f504e 100644 --- a/src/test/java/com/others/FastPowerTest.java +++ b/src/test/java/com/others/FastPowerTest.java @@ -1,9 +1,35 @@ package src.test.java.com.others; -/** - * @author bingo - * @since 2019/5/10 - */ +import org.junit.Test; +import src.main.java.com.others.FastPower; + +import java.math.BigInteger; + +import static org.junit.Assert.*; public class FastPowerTest { + + @Test + void testLong(long n, long k, long m) { + long result = FastPower.calculate(n, k, m); + assertEquals(result, BigInteger.valueOf(n).modPow(BigInteger.valueOf(k), BigInteger.valueOf(m)).longValue()); + } + + @Test + void testBigInteger(BigInteger n, BigInteger k, BigInteger m) { + BigInteger result = FastPower.calculate(n, k, m); + assertEquals(result, n.modPow(k, m)); + } + + @Test + public void test() { + testLong(2, 2, 10); + testLong(100, 1000, 20); + testLong(123456, 123456789, 234); + + testBigInteger(BigInteger.TEN, BigInteger.TEN, BigInteger.valueOf(4)); + testBigInteger(new BigInteger("123456"), new BigInteger("123456789"), new BigInteger("234")); + testBigInteger(new BigInteger("123456789101112"), new BigInteger("12345678910111213"), new BigInteger("567890")); + + } } From fa1503fa77e6904d55517dd5a869140880cb3956 Mon Sep 17 00:00:00 2001 From: Abir Bhushan Date: Fri, 10 May 2019 19:48:02 +0100 Subject: [PATCH 082/120] Apply suggestions from code review Update DepthFirstSearch.java - signature removed, and whitespaces resolved Co-Authored-By: Libin Yang --- src/main/java/com/search/DepthFirstSearch.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/search/DepthFirstSearch.java b/src/main/java/com/search/DepthFirstSearch.java index 12ce4c1..64df6bf 100644 --- a/src/main/java/com/search/DepthFirstSearch.java +++ b/src/main/java/com/search/DepthFirstSearch.java @@ -12,7 +12,6 @@ * Best-case performance O(1) * Average performance O(n) * - * @author abir (https://github.com/abircb) */ public class DepthFirstSearch { @@ -35,14 +34,12 @@ public static > T find(T key, BinaryTree tree) { * The BinaryTree class defines the structure of a binary tree * Also contains a static nested class called TreeNode * @param - * @author abir */ class BinaryTree> { private TreeNode root; /** - * @author abir * @param

* This class defines what a node in a binary tree looks like */ @@ -87,10 +84,10 @@ private void add(TreeNode

node) { * @return the tree node corresponding to the key */ private TreeNode

find(P key) { - if(key.compareTo(this.key) == 0) return this; + if (key.compareTo(this.key) == 0) return this; else if(key.compareTo(this.key) < 0) { - if(this.left == null) return null; + if (this.left == null) return null; else return this.left.find(key); } From e5856e329fe940fb1bfff5c16d182f4ec63a77ed Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Sat, 11 May 2019 09:52:38 +0800 Subject: [PATCH 083/120] Revert "Added DepthFirstSearch.java and DepthFirstTestSearch.java" --- .../java/com/search/DepthFirstSearch.java | 123 ------------------ .../java/com/search/DepthFirstSearchTest.java | 36 ----- 2 files changed, 159 deletions(-) delete mode 100644 src/main/java/com/search/DepthFirstSearch.java delete mode 100644 src/test/java/com/search/DepthFirstSearchTest.java diff --git a/src/main/java/com/search/DepthFirstSearch.java b/src/main/java/com/search/DepthFirstSearch.java deleted file mode 100644 index 64df6bf..0000000 --- a/src/main/java/com/search/DepthFirstSearch.java +++ /dev/null @@ -1,123 +0,0 @@ -package src.main.java.com.search; - -/** - * Searching is faster in sorted structures. Binary search is O(log n). - * However, the cost of sorting is O(n · log n). - * What to do when adding or removing elements? Sort again? No. - * Create efficient data structures to maintain sorted sequences, and search in them - * Key example: binary sorted tree, allowing O(log N) insert, remove and lookup. - - In comes, depth-first search - * Worst-case performance O(n) - * Best-case performance O(1) - * Average performance O(n) - * - */ - -public class DepthFirstSearch { - - /** - * Depth-first search method - * - * @param tree- Binary tree to be searched - * @param value- Key being searched for - * @return Location of the key - */ - - public static > T find(T key, BinaryTree tree) { - return tree.get(key); - } - -} - -/** - * The BinaryTree class defines the structure of a binary tree - * Also contains a static nested class called TreeNode - * @param - */ -class BinaryTree> { - - private TreeNode root; - - /** - * @param

- * This class defines what a node in a binary tree looks like - */ - private static class TreeNode

> { - - P key, value; - TreeNode

left, right; - - private TreeNode(P key, P value) { - this.key = key; - this.value = value; - this.left = null; - this.right = null; - } - - /** - * @param node - * adds the specified node - */ - private void add(TreeNode

node) { - if (node.key.compareTo(this.key) < 0) { - if(this.left == null) { - this.left = node; - } - else { - this.left.add(node); - } - } - - else { - if(this.right == null) { - this.right = node; - } - else { - this.right.add(node); - } - } - } - - /** - * @param key - * @return the tree node corresponding to the key - */ - private TreeNode

find(P key) { - if (key.compareTo(this.key) == 0) return this; - - else if(key.compareTo(this.key) < 0) { - if (this.left == null) return null; - else return this.left.find(key); - } - - else { - if(this.right == null) return null; - else return this.right.find(key); - } - } - - } - - public BinaryTree() { - this.root = null; - } - - public void add(T key, T value) { - TreeNode node = new TreeNode(key, value); - if(this.root == null) { - this.root = node; - } - else { - this.root.add(node); - } - } - - public T get(T key) { - if(this.root == null) return null; - - TreeNode node = this.root.find(key); - if(node == null) return null; - return node.value; - } -} diff --git a/src/test/java/com/search/DepthFirstSearchTest.java b/src/test/java/com/search/DepthFirstSearchTest.java deleted file mode 100644 index 859abfb..0000000 --- a/src/test/java/com/search/DepthFirstSearchTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package src.test.java.com.search; - -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.search.DepthFirstSearch; -import src.main.java.com.search.BinaryTree; - -public class DepthFirstSearchTest { - @Test - public void testDepthFirstSearch() { - - BinaryTree tree1 = new BinaryTree(); - tree1.add(1,1); - tree1.add(2,2); - tree1.add(3,3); - tree1.add(4,4); - Assert.assertEquals("Incorrect index", 3, DepthFirstSearch.find(3, tree1)); - Assert.assertEquals("Incorrect index", 1, DepthFirstSearch.find(1, tree1)); - Assert.assertEquals("Incorrect index", null, DepthFirstSearch.find(0, tree1)); - Assert.assertEquals("Incorrect index", null, DepthFirstSearch.find(8, tree1)); - Assert.assertEquals("Incorrect index", null, DepthFirstSearch.find(-2, tree1)); - - BinaryTree tree2 = new BinaryTree(); - tree2.add("1","A"); - tree2.add("2","B"); - tree2.add("3","C"); - tree2.add("4","D"); - - Assert.assertEquals("Incorrect index", "C", LinearSearch.findIndex(tree2,"3")); - Assert.assertEquals("Incorrect index", "B", LinearSearch.findIndex(tree2,"2")); - Assert.assertEquals("Incorrect index", null, LinearSearch.findIndex(tree2,"F")); - - BinaryTree tree3 = new BinaryTree(); - Assert.assertEquals("Incorrect index", null, LinearSearch.findIndex(tree3, "")); - } -} From 36f977936db733e237eab6968d7016890350fefa Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Mon, 13 May 2019 16:36:38 +0530 Subject: [PATCH 084/120] Added the algorithm and test for Fibonacci Search --- src/main/java/com/search/FibonacciSearch.java | 69 +++++++++++++++++++ .../java/com/search/FibonacciSearchTest.java | 30 ++++++++ 2 files changed, 99 insertions(+) create mode 100644 src/main/java/com/search/FibonacciSearch.java create mode 100644 src/test/java/com/search/FibonacciSearchTest.java diff --git a/src/main/java/com/search/FibonacciSearch.java b/src/main/java/com/search/FibonacciSearch.java new file mode 100644 index 0000000..3a3a4c5 --- /dev/null +++ b/src/main/java/com/search/FibonacciSearch.java @@ -0,0 +1,69 @@ +package src.main.java.com.search; + +import static java.lang.Math.min; + +/** + * Fibonacci search is a method of searching a sorted array using a divide and conquer algorithm that narrows down + * possible locations with the aid of Fibonacci numbers. Compared to binary search where the sorted array is divided + * into two equal-sized parts, one of which is examined further, Fibonacci search divides the array into two parts that + * have sizes that are consecutive Fibonacci numbers. + *

+ * Worst-case performance O(Log n) + * Best-case performance O(1) + * Average performance O(Log n) + * Average space complexity O(1) + */ +public class FibonacciSearch { + /** + * @param array is an array where the element should be found + * @param key is an element which should be found + * @param is any comparable type + * @return The index position of the key in the array, returns -1 for empty array + */ + public > int findIndex(T[] array, T key) { + int size = array.length; + + if (size == 0) + return -1; + + // Initialize the fibonacci numbers + int fibN1 = 1; // (n-1)th Fibonacci term + int fibN2 = 0; // (n-2)th Fibonacci term + int fibN = fibN1 + fibN2; // nth Fibonacci term + + //fibN should store the smallest Fibonacci Number greater than or equal to size + while (fibN < size) { + fibN2 = fibN1; + fibN1 = fibN; + fibN = fibN2 + fibN1; + } + + // Marks the eliminated range from front + int offset = -1; + + while (fibN > 1) { + // Check if fibN2 is a valid location + int i = min(offset + fibN2, size - 1); + + //If key is greater than the value at index fibN2, cuts the sub-array from offset to i + if (array[i].compareTo(key) < 0) { + fibN = fibN1; + fibN1 = fibN2; + fibN2 = fibN - fibN1; + offset = i; + } + + //If x is greater than the value at index fibN2, cuts the sub-array after i+1 + else if (array[i].compareTo(key) > 0) { + fibN = fibN2; + fibN1 = fibN1 - fibN2; + fibN2 = fibN - fibN1; + } else return i; //Element found + } + // comparing the last element with key + if (fibN1 == 1 && array[offset + 1].compareTo(key) == 0) + return offset + 1; + + return -1; // Element not found + } +} diff --git a/src/test/java/com/search/FibonacciSearchTest.java b/src/test/java/com/search/FibonacciSearchTest.java new file mode 100644 index 0000000..2adae9d --- /dev/null +++ b/src/test/java/com/search/FibonacciSearchTest.java @@ -0,0 +1,30 @@ +package src.test.java.com.search; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.search.FibonacciSearch; + +public class FibonacciSearchTest { + @Test + public void testFibonacciSearch() { + FibonacciSearch fibonacciSearch = new FibonacciSearch(); + + Integer[] arr = {11, 14, 23, 32, 36, 40, 54, 69}; + int x = 54; + int index = fibonacciSearch.findIndex(arr, x); + Assert.assertEquals("Incorrect index", 6, index); + + Integer[] arrTwo = {-400, -283, -180, -160, -129, -120, -30}; + x = -120; + index = fibonacciSearch.findIndex(arrTwo, x); + Assert.assertEquals("Incorrect index", 5, index); + + String[] arrString = {"101", "122", "136", "165", "225", "351", "458"}; + String stringX = "136"; + index = fibonacciSearch.findIndex(arrString, stringX); + Assert.assertEquals("Incorrect index", 2, index); + + String[] arrThree = {}; + Assert.assertEquals("Incorrect index", -1, fibonacciSearch.findIndex(arrThree, "")); + } +} From 09c4cd790fea45e823d859e4049449d82b71e2f4 Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Mon, 13 May 2019 21:29:00 +0800 Subject: [PATCH 085/120] Update FibonacciSearch.java Add single space after `//` --- src/main/java/com/search/FibonacciSearch.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/search/FibonacciSearch.java b/src/main/java/com/search/FibonacciSearch.java index 3a3a4c5..3bbcd0f 100644 --- a/src/main/java/com/search/FibonacciSearch.java +++ b/src/main/java/com/search/FibonacciSearch.java @@ -31,7 +31,7 @@ public > int findIndex(T[] array, T key) { int fibN2 = 0; // (n-2)th Fibonacci term int fibN = fibN1 + fibN2; // nth Fibonacci term - //fibN should store the smallest Fibonacci Number greater than or equal to size + // fibN should store the smallest Fibonacci Number greater than or equal to size while (fibN < size) { fibN2 = fibN1; fibN1 = fibN; @@ -45,7 +45,7 @@ public > int findIndex(T[] array, T key) { // Check if fibN2 is a valid location int i = min(offset + fibN2, size - 1); - //If key is greater than the value at index fibN2, cuts the sub-array from offset to i + // If key is greater than the value at index fibN2, cuts the sub-array from offset to i if (array[i].compareTo(key) < 0) { fibN = fibN1; fibN1 = fibN2; @@ -53,12 +53,12 @@ public > int findIndex(T[] array, T key) { offset = i; } - //If x is greater than the value at index fibN2, cuts the sub-array after i+1 + // If x is greater than the value at index fibN2, cuts the sub-array after i+1 else if (array[i].compareTo(key) > 0) { fibN = fibN2; fibN1 = fibN1 - fibN2; fibN2 = fibN - fibN1; - } else return i; //Element found + } else return i; // Element found } // comparing the last element with key if (fibN1 == 1 && array[offset + 1].compareTo(key) == 0) From ea6c4e5a8aa3e7b344c1bd424e9ed2f63ef94805 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Tue, 14 May 2019 14:54:50 +0530 Subject: [PATCH 086/120] Added Singleton Design pattern implementation in Java and its test --- .../singletonpattern/Singleton.java | 44 ++++++++++++++++++ .../singletonpattern/SingletonTest.java | 45 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/main/java/com/designpatterns/singletonpattern/Singleton.java create mode 100644 src/test/java/com/designpatterns/singletonpattern/SingletonTest.java diff --git a/src/main/java/com/designpatterns/singletonpattern/Singleton.java b/src/main/java/com/designpatterns/singletonpattern/Singleton.java new file mode 100644 index 0000000..f846c33 --- /dev/null +++ b/src/main/java/com/designpatterns/singletonpattern/Singleton.java @@ -0,0 +1,44 @@ +package src.main.java.com.designpatterns.singletonpattern; + +/** + * The singleton pattern is a design pattern that restricts the instantiation of a class to one "single" instance. + * This is useful when exactly one object is needed to coordinate actions across the system. The term comes from the + * mathematical concept of a singleton. + *

+ * The key idea in this pattern is to make the class itself responsible for controlling its instantiation (only once). + * The hidden constructor (declared private) ensures that the class can never be instantiated from outside the class. + * The public static operation can be accessed easily by using the class name and function name(Singleton.getInstance()) + * + * @see Singleton Pattern + */ +public class Singleton { + private volatile static Singleton instance = null; + + private Singleton() { + } + + /** + * A singleton implementation may use lazy initialization, where the instance is created when the static method + * is first invoked. + *

+ * If the static method might be called from multiple threads simultaneously, measures may need + * to be taken to prevent race conditions that could result in the creation of multiple instances of the class. + *

+ * The following implementation is a thread-safe sample implementation, using lazy initialization with + * double-checked locking. + * + * @return the single instance of the Singleton class + */ + public static Singleton getInstance() { + if (instance == null) { + // First attempt to make thread safe + synchronized (Singleton.class) { + // Double Checked locking as multiple threads can reach the above step + if (instance == null) { + instance = new Singleton(); + } + } + } + return instance; + } +} diff --git a/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java b/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java new file mode 100644 index 0000000..2b7058e --- /dev/null +++ b/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java @@ -0,0 +1,45 @@ +package src.test.java.com.designpatterns.singletonpattern; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.designpatterns.singletonpattern.Singleton; + +import java.util.ArrayList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class SingletonTest { + private static volatile ArrayList hashCodeList = new ArrayList<>(); + + @Test + public void testSingleton() throws InterruptedException { + boolean testFailed = false; + ExecutorService es = Executors.newCachedThreadPool(); + // Creates 15 threads and makes all of them access the Singleton class + // Saves the hash code of the object in a static list + for (int i = 0; i < 15; i++) + es.execute(() -> { + try { + Singleton singletonInstance = Singleton.getInstance(); + int singletonInsCode = singletonInstance.hashCode(); + System.out.println(singletonInsCode); + hashCodeList.add(singletonInsCode); + } catch (Exception e) { + System.out.println("Exception is caught"); + } + }); + es.shutdown(); + boolean finished = es.awaitTermination(1, TimeUnit.MINUTES); + // wait for all threads to finish + if (finished) { + Integer firstCode = hashCodeList.get(0); + for (Integer code : hashCodeList) { + if (!firstCode.equals(code)) { + testFailed = true; + } + } + Assert.assertFalse(testFailed); + } + } +} From 4a3f8712185d621fb11f2734ba967854c034eff5 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Wed, 15 May 2019 13:31:07 +0530 Subject: [PATCH 087/120] Update src/test/java/com/designpatterns/singletonpattern/SingletonTest.java Removed println statement Co-Authored-By: Libin Yang --- .../java/com/designpatterns/singletonpattern/SingletonTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java b/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java index 2b7058e..b3c3361 100644 --- a/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java +++ b/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java @@ -23,7 +23,6 @@ public void testSingleton() throws InterruptedException { try { Singleton singletonInstance = Singleton.getInstance(); int singletonInsCode = singletonInstance.hashCode(); - System.out.println(singletonInsCode); hashCodeList.add(singletonInsCode); } catch (Exception e) { System.out.println("Exception is caught"); From 43d47225be70d7b10aada93efdf7e26c84421366 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Wed, 15 May 2019 17:17:37 +0530 Subject: [PATCH 088/120] Added Factory Design pattern implementation in Java and its test --- .../factorypattern/Pentagon.java | 13 ++++++ .../factorypattern/Polygon.java | 20 +++++++++ .../factorypattern/PolygonFactory.java | 32 +++++++++++++ .../designpatterns/factorypattern/Square.java | 14 ++++++ .../factorypattern/Triangle.java | 13 ++++++ .../factorypattern/PolygonFactoryTest.java | 45 +++++++++++++++++++ 6 files changed, 137 insertions(+) create mode 100644 src/main/java/com/designpatterns/factorypattern/Pentagon.java create mode 100644 src/main/java/com/designpatterns/factorypattern/Polygon.java create mode 100644 src/main/java/com/designpatterns/factorypattern/PolygonFactory.java create mode 100644 src/main/java/com/designpatterns/factorypattern/Square.java create mode 100644 src/main/java/com/designpatterns/factorypattern/Triangle.java create mode 100644 src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java diff --git a/src/main/java/com/designpatterns/factorypattern/Pentagon.java b/src/main/java/com/designpatterns/factorypattern/Pentagon.java new file mode 100644 index 0000000..a7ad7c3 --- /dev/null +++ b/src/main/java/com/designpatterns/factorypattern/Pentagon.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.factorypattern; + +public class Pentagon implements Polygon { + @Override + public String getType() { + return "Pentagon"; + } + + @Override + public double area(double side) { + return 3.847104 * side * side; + } +} diff --git a/src/main/java/com/designpatterns/factorypattern/Polygon.java b/src/main/java/com/designpatterns/factorypattern/Polygon.java new file mode 100644 index 0000000..415d673 --- /dev/null +++ b/src/main/java/com/designpatterns/factorypattern/Polygon.java @@ -0,0 +1,20 @@ +package src.main.java.com.designpatterns.factorypattern; + +public interface Polygon { + /** + * Should be overriden to describe the type of each polygon + * + * @return a String value describing the name of the polygon + */ + String getType(); + + /** + * Calculates the area of the regular polygon + * + * @param side The length of the side of regular polygon + * @return area of the polygon + */ + double area(double side); +} + + diff --git a/src/main/java/com/designpatterns/factorypattern/PolygonFactory.java b/src/main/java/com/designpatterns/factorypattern/PolygonFactory.java new file mode 100644 index 0000000..08dc9e4 --- /dev/null +++ b/src/main/java/com/designpatterns/factorypattern/PolygonFactory.java @@ -0,0 +1,32 @@ +package src.main.java.com.designpatterns.factorypattern; + +/** + * In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal + * with the problem of creating objects without having to specify the exact class of the object that will be created. + * This is done by creating objects by calling a factory method—either specified in an interface and implemented by + * child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling + * a constructor. + * + * @see Factory Pattern + */ +public class PolygonFactory { + /** + * Factory pattern implementation for the Polygon Interface to return the correct regular polygon object + * depending on the number of sides it has. + * + * @param numberOfSides in the polygon to initialize. + * @return the object having the respective number of sides + */ + public Polygon getPolygon(int numberOfSides) { + switch (numberOfSides) { + case 3: + return new Triangle(); + case 4: + return new Square(); + case 5: + return new Pentagon(); + default: + return null; + } + } +} diff --git a/src/main/java/com/designpatterns/factorypattern/Square.java b/src/main/java/com/designpatterns/factorypattern/Square.java new file mode 100644 index 0000000..30f9d23 --- /dev/null +++ b/src/main/java/com/designpatterns/factorypattern/Square.java @@ -0,0 +1,14 @@ +package src.main.java.com.designpatterns.factorypattern; + +public class Square implements Polygon { + + @Override + public String getType() { + return "Square"; + } + + @Override + public double area(double side) { + return side * side; + } +} diff --git a/src/main/java/com/designpatterns/factorypattern/Triangle.java b/src/main/java/com/designpatterns/factorypattern/Triangle.java new file mode 100644 index 0000000..69beb14 --- /dev/null +++ b/src/main/java/com/designpatterns/factorypattern/Triangle.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.factorypattern; + +public class Triangle implements Polygon { + @Override + public String getType() { + return "Triangle"; + } + + @Override + public double area(double side) { + return 0.433013 * side * side; + } +} diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java new file mode 100644 index 0000000..7d76a82 --- /dev/null +++ b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java @@ -0,0 +1,45 @@ +package src.test.java.com.designpatterns.factorypattern; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.designpatterns.factorypattern.Polygon; +import src.main.java.com.designpatterns.factorypattern.PolygonFactory; + +public class PolygonFactoryTest { + @Test + public void testPolygonFactory() { + String failReason = ""; + PolygonFactory polFactory = new PolygonFactory(); + + //Test for triangle + Polygon triangle = polFactory.getPolygon(3); + if (!triangle.getType().equals("Triangle")) { + failReason += "Polygon Factory failed for Triangle."; + } + if (triangle.area(4) != 6.928208) { + failReason += "Triangle area is incorrect!"; + } + + + //Test for square + Polygon square = polFactory.getPolygon(4); + if (!square.getType().equals("Square")) { + failReason += "Polygon Factory failed for Square."; + } + if (square.area(5) != 25) { + failReason += "Square area is incorrect!"; + } + + + //Test for pentagon + Polygon pentagon = polFactory.getPolygon(5); + if (!pentagon.getType().equals("Pentagon")) { + failReason += "Polygon Factory failed for Pentagon."; + } + if (pentagon.area(9) != 311.615424) { + failReason += "Pentagon area is incorrect!"; + } + + Assert.assertEquals(failReason, failReason, ""); + } +} From c29640e0e2e081def7dec714846b8acbb1074d05 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 16 May 2019 13:04:41 +0530 Subject: [PATCH 089/120] Update src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java Co-Authored-By: Libin Yang --- .../com/designpatterns/factorypattern/PolygonFactoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java index 7d76a82..25a43ed 100644 --- a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java @@ -11,7 +11,7 @@ public void testPolygonFactory() { String failReason = ""; PolygonFactory polFactory = new PolygonFactory(); - //Test for triangle + // Test for triangle Polygon triangle = polFactory.getPolygon(3); if (!triangle.getType().equals("Triangle")) { failReason += "Polygon Factory failed for Triangle."; From c11a0611a07ca00d8e6ff3e97a1494feeb80d04d Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 16 May 2019 13:04:56 +0530 Subject: [PATCH 090/120] Update src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java Co-Authored-By: Libin Yang --- .../com/designpatterns/factorypattern/PolygonFactoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java index 25a43ed..bcc0e3a 100644 --- a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java @@ -21,7 +21,7 @@ public void testPolygonFactory() { } - //Test for square + // Test for square Polygon square = polFactory.getPolygon(4); if (!square.getType().equals("Square")) { failReason += "Polygon Factory failed for Square."; From 77881f67fd8a935e6ac0942d53815f709cd10c87 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 16 May 2019 13:05:06 +0530 Subject: [PATCH 091/120] Update src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java Co-Authored-By: Libin Yang --- .../com/designpatterns/factorypattern/PolygonFactoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java index bcc0e3a..bd54800 100644 --- a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java @@ -13,7 +13,7 @@ public void testPolygonFactory() { // Test for triangle Polygon triangle = polFactory.getPolygon(3); - if (!triangle.getType().equals("Triangle")) { + if (!"Triangle".equals(triangle.getType())) { failReason += "Polygon Factory failed for Triangle."; } if (triangle.area(4) != 6.928208) { From 6ffb2d5b4ee7ea554d3c11cea9a0d032860fb7cd Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 16 May 2019 13:05:13 +0530 Subject: [PATCH 092/120] Update src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java Co-Authored-By: Libin Yang --- .../com/designpatterns/factorypattern/PolygonFactoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java index bd54800..318f2d9 100644 --- a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java @@ -33,7 +33,7 @@ public void testPolygonFactory() { //Test for pentagon Polygon pentagon = polFactory.getPolygon(5); - if (!pentagon.getType().equals("Pentagon")) { + if (!"Pentagon".equals(pentagon.getType())) { failReason += "Polygon Factory failed for Pentagon."; } if (pentagon.area(9) != 311.615424) { From 321ebea864f98a4405590a1965b2426c5f12221b Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 16 May 2019 13:05:42 +0530 Subject: [PATCH 093/120] Update src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java Co-Authored-By: Libin Yang --- .../com/designpatterns/factorypattern/PolygonFactoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java index 318f2d9..1cb92d4 100644 --- a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java @@ -31,7 +31,7 @@ public void testPolygonFactory() { } - //Test for pentagon + // Test for pentagon Polygon pentagon = polFactory.getPolygon(5); if (!"Pentagon".equals(pentagon.getType())) { failReason += "Polygon Factory failed for Pentagon."; From 616d5cfcc81aa0b97f713cbd1dd38d1866eaf7fb Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 16 May 2019 13:05:49 +0530 Subject: [PATCH 094/120] Update src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java Co-Authored-By: Libin Yang --- .../com/designpatterns/factorypattern/PolygonFactoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java index 1cb92d4..c175911 100644 --- a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java @@ -23,7 +23,7 @@ public void testPolygonFactory() { // Test for square Polygon square = polFactory.getPolygon(4); - if (!square.getType().equals("Square")) { + if (!"Square".equals(square.getType())) { failReason += "Polygon Factory failed for Square."; } if (square.area(5) != 25) { From b532d70716a53f502e960faf659d419f7e111242 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 16 May 2019 16:05:27 +0530 Subject: [PATCH 095/120] Added Builder Design pattern implementation in Java and its test --- .../builderpattern/Desktop.java | 82 +++++++++++++++++++ .../builderpattern/DesktopBuilderTest.java | 32 ++++++++ 2 files changed, 114 insertions(+) create mode 100644 src/main/java/com/designpatterns/builderpattern/Desktop.java create mode 100644 src/test/java/com/designpatterns/builderpattern/DesktopBuilderTest.java diff --git a/src/main/java/com/designpatterns/builderpattern/Desktop.java b/src/main/java/com/designpatterns/builderpattern/Desktop.java new file mode 100644 index 0000000..19943de --- /dev/null +++ b/src/main/java/com/designpatterns/builderpattern/Desktop.java @@ -0,0 +1,82 @@ +package src.main.java.com.designpatterns.builderpattern; + +/** + * The Builder is a design pattern designed to provide a flexible solution to various object creation problems in + * object-oriented programming. The intent of the Builder design pattern is to separate the construction of a complex + * object from its representation. + * + * @see Builder Pattern + */ + +public class Desktop { + private String CPU; + private String RAM; + + private boolean isGraphicCardEnabled; + private String operatingSystem; + private int diskSizeGB; + private String graphicCard; + + private Desktop(DesktopBuilder builder) { + this.CPU = builder.CPU; + this.RAM = builder.RAM; + this.isGraphicCardEnabled = builder.isGraphicCardEnabled; + this.operatingSystem = builder.operatingSystem; + this.diskSizeGB = builder.diskSizeGB; + this.graphicCard = builder.graphicCard; + } + + /** + * Builder class for the above Desktop class. Constructs the Desktop by invoking the Desktop class constructor and + * allows access to set optional fields in the Desktop class. + */ + public static class DesktopBuilder { + private String CPU; + private String RAM; + private boolean isGraphicCardEnabled; + private String operatingSystem; + private int diskSizeGB; + private String graphicCard; + + public DesktopBuilder(String CPU, String RAM) { + this.CPU = CPU; + this.RAM = RAM; + } + + public DesktopBuilder setGraphicCardEnabled(boolean graphicCardEnabled) { + this.isGraphicCardEnabled = graphicCardEnabled; + return this; + } + + public DesktopBuilder setOperatingSystem(String operatingSystem) { + this.operatingSystem = operatingSystem; + return this; + } + + public DesktopBuilder setDiskSizeGB(int diskSize) { + this.diskSizeGB = diskSize; + return this; + } + + public DesktopBuilder setGraphicCard(String graphicCard) { + this.graphicCard = graphicCard; + return this; + } + + public Desktop build() { + return new Desktop(this); + } + } + + @Override + public String toString() { + return "Desktop{" + + "CPU='" + CPU + '\'' + + ", RAM='" + RAM + '\'' + + ", isGraphicCardEnabled=" + isGraphicCardEnabled + + ", operatingSystem='" + operatingSystem + '\'' + + ", diskSizeGB=" + diskSizeGB + + ", graphicCard='" + graphicCard + '\'' + + '}'; + } +} diff --git a/src/test/java/com/designpatterns/builderpattern/DesktopBuilderTest.java b/src/test/java/com/designpatterns/builderpattern/DesktopBuilderTest.java new file mode 100644 index 0000000..c57b1f9 --- /dev/null +++ b/src/test/java/com/designpatterns/builderpattern/DesktopBuilderTest.java @@ -0,0 +1,32 @@ +package src.test.java.com.designpatterns.builderpattern; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.designpatterns.builderpattern.Desktop; + +public class DesktopBuilderTest { + private final String configOne = "Desktop{CPU='Intel i7', RAM='Corsair Vengeance 3000', isGraphicCardEnabled=true" + + ", operatingSystem='Windows 10', diskSizeGB=16, graphicCard='NVIDIA GTX 1080'}"; + private final String configTwo = "Desktop{CPU='Intel i5', RAM='HyperX Fury v5', isGraphicCardEnabled=true, " + + "operatingSystem='Red Hat Enterprise', diskSizeGB=16, graphicCard='NVIDIA RTX 2080'}"; + + @Test + public void testDesktopBuilder() { + Desktop d1 = new Desktop.DesktopBuilder("Intel i7", "Corsair Vengeance 3000") + .setDiskSizeGB(16) + .setGraphicCard("NVIDIA GTX 1080") + .setGraphicCardEnabled(true) + .setOperatingSystem("Windows 10") + .build(); + Assert.assertEquals(d1.toString(), configOne); + + Desktop d2 = new Desktop.DesktopBuilder("Intel i5", "HyperX Fury v5") + .setDiskSizeGB(16) + .setGraphicCard("NVIDIA RTX 2080") + .setGraphicCardEnabled(true) + .setOperatingSystem("Red Hat Enterprise") + .build(); + Assert.assertEquals(d2.toString(), configTwo); + } + +} From ee985d510b463757451d8f86a91aa1c91c7cd4c4 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Tue, 21 May 2019 11:37:16 +0530 Subject: [PATCH 096/120] Added a sub-package for "creational" in order to organize the code better --- .../{builderpattern => creational/builder}/Desktop.java | 2 +- .../{factorypattern => creational/factory}/Pentagon.java | 2 +- .../{factorypattern => creational/factory}/Polygon.java | 2 +- .../factory}/PolygonFactory.java | 2 +- .../{factorypattern => creational/factory}/Square.java | 2 +- .../{factorypattern => creational/factory}/Triangle.java | 2 +- .../singleton}/Singleton.java | 2 +- .../builder}/DesktopBuilderTest.java | 4 ++-- .../factory}/PolygonFactoryTest.java | 6 +++--- .../singleton}/SingletonTest.java | 4 ++-- 10 files changed, 14 insertions(+), 14 deletions(-) rename src/main/java/com/designpatterns/{builderpattern => creational/builder}/Desktop.java (97%) rename src/main/java/com/designpatterns/{factorypattern => creational/factory}/Pentagon.java (78%) rename src/main/java/com/designpatterns/{factorypattern => creational/factory}/Polygon.java (86%) rename src/main/java/com/designpatterns/{factorypattern => creational/factory}/PolygonFactory.java (95%) rename src/main/java/com/designpatterns/{factorypattern => creational/factory}/Square.java (77%) rename src/main/java/com/designpatterns/{factorypattern => creational/factory}/Triangle.java (78%) rename src/main/java/com/designpatterns/{singletonpattern => creational/singleton}/Singleton.java (96%) rename src/test/java/com/designpatterns/{builderpattern => creational/builder}/DesktopBuilderTest.java (90%) rename src/test/java/com/designpatterns/{factorypattern => creational/factory}/PolygonFactoryTest.java (85%) rename src/test/java/com/designpatterns/{singletonpattern => creational/singleton}/SingletonTest.java (91%) diff --git a/src/main/java/com/designpatterns/builderpattern/Desktop.java b/src/main/java/com/designpatterns/creational/builder/Desktop.java similarity index 97% rename from src/main/java/com/designpatterns/builderpattern/Desktop.java rename to src/main/java/com/designpatterns/creational/builder/Desktop.java index 19943de..d66ecf3 100644 --- a/src/main/java/com/designpatterns/builderpattern/Desktop.java +++ b/src/main/java/com/designpatterns/creational/builder/Desktop.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.builderpattern; +package src.main.java.com.designpatterns.creational.builder; /** * The Builder is a design pattern designed to provide a flexible solution to various object creation problems in diff --git a/src/main/java/com/designpatterns/factorypattern/Pentagon.java b/src/main/java/com/designpatterns/creational/factory/Pentagon.java similarity index 78% rename from src/main/java/com/designpatterns/factorypattern/Pentagon.java rename to src/main/java/com/designpatterns/creational/factory/Pentagon.java index a7ad7c3..2d70f0d 100644 --- a/src/main/java/com/designpatterns/factorypattern/Pentagon.java +++ b/src/main/java/com/designpatterns/creational/factory/Pentagon.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.factorypattern; +package src.main.java.com.designpatterns.creational.factory; public class Pentagon implements Polygon { @Override diff --git a/src/main/java/com/designpatterns/factorypattern/Polygon.java b/src/main/java/com/designpatterns/creational/factory/Polygon.java similarity index 86% rename from src/main/java/com/designpatterns/factorypattern/Polygon.java rename to src/main/java/com/designpatterns/creational/factory/Polygon.java index 415d673..0d5b4c9 100644 --- a/src/main/java/com/designpatterns/factorypattern/Polygon.java +++ b/src/main/java/com/designpatterns/creational/factory/Polygon.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.factorypattern; +package src.main.java.com.designpatterns.creational.factory; public interface Polygon { /** diff --git a/src/main/java/com/designpatterns/factorypattern/PolygonFactory.java b/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java similarity index 95% rename from src/main/java/com/designpatterns/factorypattern/PolygonFactory.java rename to src/main/java/com/designpatterns/creational/factory/PolygonFactory.java index 08dc9e4..8b31472 100644 --- a/src/main/java/com/designpatterns/factorypattern/PolygonFactory.java +++ b/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.factorypattern; +package src.main.java.com.designpatterns.creational.factory; /** * In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal diff --git a/src/main/java/com/designpatterns/factorypattern/Square.java b/src/main/java/com/designpatterns/creational/factory/Square.java similarity index 77% rename from src/main/java/com/designpatterns/factorypattern/Square.java rename to src/main/java/com/designpatterns/creational/factory/Square.java index 30f9d23..562233c 100644 --- a/src/main/java/com/designpatterns/factorypattern/Square.java +++ b/src/main/java/com/designpatterns/creational/factory/Square.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.factorypattern; +package src.main.java.com.designpatterns.creational.factory; public class Square implements Polygon { diff --git a/src/main/java/com/designpatterns/factorypattern/Triangle.java b/src/main/java/com/designpatterns/creational/factory/Triangle.java similarity index 78% rename from src/main/java/com/designpatterns/factorypattern/Triangle.java rename to src/main/java/com/designpatterns/creational/factory/Triangle.java index 69beb14..d95228b 100644 --- a/src/main/java/com/designpatterns/factorypattern/Triangle.java +++ b/src/main/java/com/designpatterns/creational/factory/Triangle.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.factorypattern; +package src.main.java.com.designpatterns.creational.factory; public class Triangle implements Polygon { @Override diff --git a/src/main/java/com/designpatterns/singletonpattern/Singleton.java b/src/main/java/com/designpatterns/creational/singleton/Singleton.java similarity index 96% rename from src/main/java/com/designpatterns/singletonpattern/Singleton.java rename to src/main/java/com/designpatterns/creational/singleton/Singleton.java index f846c33..9591303 100644 --- a/src/main/java/com/designpatterns/singletonpattern/Singleton.java +++ b/src/main/java/com/designpatterns/creational/singleton/Singleton.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.singletonpattern; +package src.main.java.com.designpatterns.creational.singleton; /** * The singleton pattern is a design pattern that restricts the instantiation of a class to one "single" instance. diff --git a/src/test/java/com/designpatterns/builderpattern/DesktopBuilderTest.java b/src/test/java/com/designpatterns/creational/builder/DesktopBuilderTest.java similarity index 90% rename from src/test/java/com/designpatterns/builderpattern/DesktopBuilderTest.java rename to src/test/java/com/designpatterns/creational/builder/DesktopBuilderTest.java index c57b1f9..2f8e4ce 100644 --- a/src/test/java/com/designpatterns/builderpattern/DesktopBuilderTest.java +++ b/src/test/java/com/designpatterns/creational/builder/DesktopBuilderTest.java @@ -1,8 +1,8 @@ -package src.test.java.com.designpatterns.builderpattern; +package src.test.java.com.designpatterns.creational.builder; import org.junit.Assert; import org.junit.Test; -import src.main.java.com.designpatterns.builderpattern.Desktop; +import src.main.java.com.designpatterns.creational.builder.Desktop; public class DesktopBuilderTest { private final String configOne = "Desktop{CPU='Intel i7', RAM='Corsair Vengeance 3000', isGraphicCardEnabled=true" + diff --git a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java b/src/test/java/com/designpatterns/creational/factory/PolygonFactoryTest.java similarity index 85% rename from src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java rename to src/test/java/com/designpatterns/creational/factory/PolygonFactoryTest.java index c175911..d8ea659 100644 --- a/src/test/java/com/designpatterns/factorypattern/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/creational/factory/PolygonFactoryTest.java @@ -1,9 +1,9 @@ -package src.test.java.com.designpatterns.factorypattern; +package src.test.java.com.designpatterns.creational.factory; import org.junit.Assert; import org.junit.Test; -import src.main.java.com.designpatterns.factorypattern.Polygon; -import src.main.java.com.designpatterns.factorypattern.PolygonFactory; +import src.main.java.com.designpatterns.creational.factory.Polygon; +import src.main.java.com.designpatterns.creational.factory.PolygonFactory; public class PolygonFactoryTest { @Test diff --git a/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java b/src/test/java/com/designpatterns/creational/singleton/SingletonTest.java similarity index 91% rename from src/test/java/com/designpatterns/singletonpattern/SingletonTest.java rename to src/test/java/com/designpatterns/creational/singleton/SingletonTest.java index b3c3361..8374494 100644 --- a/src/test/java/com/designpatterns/singletonpattern/SingletonTest.java +++ b/src/test/java/com/designpatterns/creational/singleton/SingletonTest.java @@ -1,8 +1,8 @@ -package src.test.java.com.designpatterns.singletonpattern; +package src.test.java.com.designpatterns.creational.singleton; import org.junit.Assert; import org.junit.Test; -import src.main.java.com.designpatterns.singletonpattern.Singleton; +import src.main.java.com.designpatterns.creational.singleton.Singleton; import java.util.ArrayList; import java.util.concurrent.ExecutorService; From ba900596249d37476eddb9cccdc16b5a08911ecb Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Tue, 21 May 2019 14:14:43 +0530 Subject: [PATCH 097/120] Added the prototype pattern and its unit test --- .../creational/prototype/BlackColor.java | 13 +++++++ .../creational/prototype/BlueColor.java | 15 ++++++++ .../creational/prototype/Color.java | 34 +++++++++++++++++++ .../creational/prototype/ColorStore.java | 18 ++++++++++ .../creational/prototype/RedColor.java | 13 +++++++ .../creational/prototype/PrototypeTest.java | 29 ++++++++++++++++ 6 files changed, 122 insertions(+) create mode 100644 src/main/java/com/designpatterns/creational/prototype/BlackColor.java create mode 100644 src/main/java/com/designpatterns/creational/prototype/BlueColor.java create mode 100644 src/main/java/com/designpatterns/creational/prototype/Color.java create mode 100644 src/main/java/com/designpatterns/creational/prototype/ColorStore.java create mode 100644 src/main/java/com/designpatterns/creational/prototype/RedColor.java create mode 100644 src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java diff --git a/src/main/java/com/designpatterns/creational/prototype/BlackColor.java b/src/main/java/com/designpatterns/creational/prototype/BlackColor.java new file mode 100644 index 0000000..b70a182 --- /dev/null +++ b/src/main/java/com/designpatterns/creational/prototype/BlackColor.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.creational.prototype; + +class BlackColor extends Color { + + BlackColor() { + this.colorName = "black"; + } + + @Override + public String addColor() { + return "Black color added"; + } +} \ No newline at end of file diff --git a/src/main/java/com/designpatterns/creational/prototype/BlueColor.java b/src/main/java/com/designpatterns/creational/prototype/BlueColor.java new file mode 100644 index 0000000..231103f --- /dev/null +++ b/src/main/java/com/designpatterns/creational/prototype/BlueColor.java @@ -0,0 +1,15 @@ +package src.main.java.com.designpatterns.creational.prototype; + +class BlueColor extends Color { + + BlueColor() { + this.colorName = "blue"; + } + + @Override + public String addColor() { + return "Blue color added"; + } + +} + diff --git a/src/main/java/com/designpatterns/creational/prototype/Color.java b/src/main/java/com/designpatterns/creational/prototype/Color.java new file mode 100644 index 0000000..9706c2f --- /dev/null +++ b/src/main/java/com/designpatterns/creational/prototype/Color.java @@ -0,0 +1,34 @@ +package src.main.java.com.designpatterns.creational.prototype; + +/** + * The prototype pattern is used when the type of objects to create is determined by a prototypical instance, which + * is cloned to produce new objects.

+ * This pattern is used to: + * 1. avoid subclasses of an object creator in the client application, like the factory method pattern does. + * 2. avoid the inherent cost of creating a new object in the standard way (e.g., using the 'new' keyword) when it is + * prohibitively expensive for a given application. + * + * @see Prototype Pattern + */ +public abstract class Color implements Cloneable { + + String colorName; + + public abstract String addColor(); + + /** + * This method should be called from the client instead of writing code that invokes the "new" operator on a + * hard-coded class name. + * + * @return a clone for the object + */ + public Object clone() { + Object clone = null; + try { + clone = super.clone(); + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + return clone; + } +} \ No newline at end of file diff --git a/src/main/java/com/designpatterns/creational/prototype/ColorStore.java b/src/main/java/com/designpatterns/creational/prototype/ColorStore.java new file mode 100644 index 0000000..fc6b519 --- /dev/null +++ b/src/main/java/com/designpatterns/creational/prototype/ColorStore.java @@ -0,0 +1,18 @@ +package src.main.java.com.designpatterns.creational.prototype; + +import java.util.HashMap; +import java.util.Map; + +public class ColorStore { + private static Map colorMap = new HashMap<>(); + + static { + colorMap.put("blue", new BlueColor()); + colorMap.put("black", new BlackColor()); + colorMap.put("red", new RedColor()); + } + + public static Color getColor(String colorName) { + return (Color) colorMap.get(colorName).clone(); + } +} diff --git a/src/main/java/com/designpatterns/creational/prototype/RedColor.java b/src/main/java/com/designpatterns/creational/prototype/RedColor.java new file mode 100644 index 0000000..96392c4 --- /dev/null +++ b/src/main/java/com/designpatterns/creational/prototype/RedColor.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.creational.prototype; + +class RedColor extends Color { + + RedColor() { + this.colorName = "red"; + } + + @Override + public String addColor() { + return "Red color added"; + } +} diff --git a/src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java b/src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java new file mode 100644 index 0000000..e1a2c7a --- /dev/null +++ b/src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java @@ -0,0 +1,29 @@ +package src.test.java.com.designpatterns.creational.prototype; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.designpatterns.creational.prototype.ColorStore; + +public class PrototypeTest { + @Test + public void testPrototype() { + String testFailReason = ""; + String testOne = ColorStore.getColor("blue").addColor(); + if (!"Blue color added".equals(testOne)) { + testFailReason += "TC 1 Failed: Blue couldn't be added\n"; + } + String testTwo = ColorStore.getColor("black").addColor(); + if (!"Black color added".equals(testTwo)) { + testFailReason += "TC 2 Failed: Black couldn't be added\n"; + } + String testThree = ColorStore.getColor("red").addColor(); + if (!"Red color added".equals(testThree)) { + testFailReason += "TC 3 Failed: Red couldn't be added\n"; + } + String testFour = ColorStore.getColor("blue").addColor(); + if (!"Blue color added".equals(testFour)) { + testFailReason += "TC 4 Failed: Blue couldn't be added\n"; + } + Assert.assertEquals(testFailReason, "", testFailReason); + } +} From 4fd7698fd216e88d8228096fe2945c7aac428145 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Tue, 21 May 2019 14:21:25 +0530 Subject: [PATCH 098/120] Updated SimpleNoise test to use org.juint.Assert instead of jupiter --- .../java/com/generation/SimplexNoiseTest.java | 69 +++++++++---------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/src/test/java/com/generation/SimplexNoiseTest.java b/src/test/java/com/generation/SimplexNoiseTest.java index a977e8e..d3ca2ae 100644 --- a/src/test/java/com/generation/SimplexNoiseTest.java +++ b/src/test/java/com/generation/SimplexNoiseTest.java @@ -1,7 +1,5 @@ package src.test.java.com.generation; -import static org.junit.jupiter.api.Assertions.*; - import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; @@ -9,42 +7,43 @@ import javax.imageio.ImageIO; -import org.junit.jupiter.api.Test; +import org.junit.Assert; +import org.junit.Test; import src.main.java.com.generation.SimplexNoise; public class SimplexNoiseTest { - @Test - public void testGenerateHeightMap() { - - final int WIDTH = 256; - final int HEIGHT = 256; - final int X = 0; - final int Y = 0; - final String RESOURCE_NAME = "src/test/java/com/generation/expected-result.png"; - - float[][] heightmap = new SimplexNoise(50, 0.3F, 1111111111111111L).generateHeightMap(X, Y, WIDTH, HEIGHT); - BufferedImage image = null; - - try(InputStream in = this.getClass().getClassLoader().getResourceAsStream(RESOURCE_NAME)) { - - image = ImageIO.read(in); - - assertEquals(WIDTH, image.getWidth()); - assertEquals(HEIGHT, image.getHeight()); - - } catch(IOException | IllegalArgumentException exception) { - - fail(exception); - } - - for(int x = 0; x < WIDTH; x++) { - - for(int y = 0; y < HEIGHT; y++) { - - assertEquals(new Color(image.getRGB(x, y)).getRed(), (int)(heightmap[x][y] * 255)); - } - } - } + @Test + public void testGenerateHeightMap() { + + final int WIDTH = 256; + final int HEIGHT = 256; + final int X = 0; + final int Y = 0; + final String RESOURCE_NAME = "src/test/java/com/generation/expected-result.png"; + + float[][] heightmap = new SimplexNoise(50, 0.3F, 1111111111111111L).generateHeightMap(X, Y, WIDTH, HEIGHT); + BufferedImage image = null; + + try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(RESOURCE_NAME)) { + + image = ImageIO.read(in); + + Assert.assertEquals(WIDTH, image.getWidth()); + Assert.assertEquals(HEIGHT, image.getHeight()); + + } catch (IOException | IllegalArgumentException exception) { + + Assert.fail(exception.toString()); + } + + for (int x = 0; x < WIDTH; x++) { + + for (int y = 0; y < HEIGHT; y++) { + + Assert.assertEquals(new Color(image.getRGB(x, y)).getRed(), (int) (heightmap[x][y] * 255)); + } + } + } } From b6772c5fb14ae98f8955b60cc6c20314ceafbe35 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Wed, 22 May 2019 12:49:33 +0530 Subject: [PATCH 099/120] Cast the second operand of Math.pow to double --- src/main/java/com/generation/SimplexNoise.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/generation/SimplexNoise.java b/src/main/java/com/generation/SimplexNoise.java index a4fcb3f..485a55b 100644 --- a/src/main/java/com/generation/SimplexNoise.java +++ b/src/main/java/com/generation/SimplexNoise.java @@ -36,7 +36,7 @@ public SimplexNoise(int largestFeature, double persistence, long seed) { this.octaves[index] = new SimplexNoiseOctave(random.nextInt()); this.frequencys[index] = Math.pow(2, index); - this.amplitudes[index] = Math.pow(persistence, octaveCount - index); + this.amplitudes[index] = Math.pow(persistence, (double)octaveCount - index); } } @@ -103,7 +103,7 @@ public double getNoise(int x, int y, int z) { for (int index = 0; index < this.octaves.length; index++) { double frequency = Math.pow(2, index); - double amplitude = Math.pow(this.persistance, this.octaves.length - index); + double amplitude = Math.pow(this.persistance, (double)this.octaves.length - index); result += this.octaves[index].noise(x / frequency, y / frequency, z / frequency) * amplitude; } From 5358f8ddc998b59c95a400e9a6011b900a1f0c7f Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 23 May 2019 00:21:14 +0530 Subject: [PATCH 100/120] Added space after typecast expression Co-Authored-By: Libin Yang --- src/main/java/com/generation/SimplexNoise.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/generation/SimplexNoise.java b/src/main/java/com/generation/SimplexNoise.java index 485a55b..50abd39 100644 --- a/src/main/java/com/generation/SimplexNoise.java +++ b/src/main/java/com/generation/SimplexNoise.java @@ -36,7 +36,7 @@ public SimplexNoise(int largestFeature, double persistence, long seed) { this.octaves[index] = new SimplexNoiseOctave(random.nextInt()); this.frequencys[index] = Math.pow(2, index); - this.amplitudes[index] = Math.pow(persistence, (double)octaveCount - index); + this.amplitudes[index] = Math.pow(persistence, (double) octaveCount - index); } } From c25da3ce974d6120574b83664733044e46741eba Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 23 May 2019 09:40:46 +0530 Subject: [PATCH 101/120] Update src/main/java/com/generation/SimplexNoise.java Co-Authored-By: Libin Yang --- src/main/java/com/generation/SimplexNoise.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/generation/SimplexNoise.java b/src/main/java/com/generation/SimplexNoise.java index 50abd39..fb4473d 100644 --- a/src/main/java/com/generation/SimplexNoise.java +++ b/src/main/java/com/generation/SimplexNoise.java @@ -103,7 +103,7 @@ public double getNoise(int x, int y, int z) { for (int index = 0; index < this.octaves.length; index++) { double frequency = Math.pow(2, index); - double amplitude = Math.pow(this.persistance, (double)this.octaves.length - index); + double amplitude = Math.pow(this.persistance, (double) this.octaves.length - index); result += this.octaves[index].noise(x / frequency, y / frequency, z / frequency) * amplitude; } From 3f9ff6e3b54104d0d5e598f893a8cb8589450e3d Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Thu, 23 May 2019 12:07:30 +0530 Subject: [PATCH 102/120] Prevent the byte from getting automatically promoted --- src/main/java/com/crypto/codec/Base64.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/crypto/codec/Base64.java b/src/main/java/com/crypto/codec/Base64.java index 9d1ff91..f65faf9 100644 --- a/src/main/java/com/crypto/codec/Base64.java +++ b/src/main/java/com/crypto/codec/Base64.java @@ -184,7 +184,7 @@ private static byte[] decodeBlock(byte[] block) { decodedBlock[0] = (byte) (decodeAlphabet[block[0]] << 2 | decodeAlphabet[block[1]] >>> 4); decodedBlock[1] = (byte) (decodeAlphabet[block[1]] << 4 | decodeAlphabet[block[2]] >>> 2); - decodedBlock[2] = (byte) (decodeAlphabet[block[2]] << 6 | decodeAlphabet[block[3]]); + decodedBlock[2] = (byte) (decodeAlphabet[block[2]] << 6 | decodeAlphabet[block[3]] & 0xff); return decodedBlock; } From 8841314c87b2037ee6372552f075b889fd939f65 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Fri, 24 May 2019 13:24:29 +0530 Subject: [PATCH 103/120] Added the code for Abstract factory pattern implementation and its unit test --- .../abstractfactory/AbstractShapeFactory.java | 23 ++++++++++ .../creational/abstractfactory/Circle.java | 13 ++++++ .../abstractfactory/FactoryProvider.java | 12 +++++ .../abstractfactory/FactoryType.java | 6 +++ .../creational/abstractfactory/Line.java | 13 ++++++ .../creational/abstractfactory/Shape.java | 18 ++++++++ .../creational/abstractfactory/ShapeType.java | 7 +++ .../creational/abstractfactory/Sphere.java | 13 ++++++ .../abstractfactory/ThreeDShapeFactory.java | 11 +++++ .../abstractfactory/TwoDShapeFactory.java | 13 ++++++ .../AbstractShapeFactoryTest.java | 46 +++++++++++++++++++ 11 files changed, 175 insertions(+) create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/Circle.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/Line.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/Shape.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java create mode 100644 src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java create mode 100644 src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java b/src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java new file mode 100644 index 0000000..f48f80c --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java @@ -0,0 +1,23 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +/** + * The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme + * without specifying their concrete classes. In normal usage, the client software creates a concrete implementation of + * the abstract factory and then uses the generic interface of the factory to create the concrete objects that are part + * of the theme. The client doesn't know (or care) which concrete objects it gets from each of these internal factories, + * since it uses only the generic interfaces of their products. + *

+ * This pattern separates the details of implementation of a set of objects from their general usage and relies on + * object composition, as object creation is implemented in methods exposed in the factory interface. + * + * @see Abstract Factory Pattern + */ +public abstract class AbstractShapeFactory { + /** + * Creates the appropriate shape object depending on the type of the shape + * + * @param name enum defining the name of the shape + * @return shape object + */ + public abstract Shape getShape(ShapeType name); +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Circle.java b/src/main/java/com/designpatterns/creational/abstractfactory/Circle.java new file mode 100644 index 0000000..47f277a --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Circle.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public class Circle implements Shape { + @Override + public double surfaceArea(float radius) { + return Math.PI * radius * radius; + } + + @Override + public ShapeType getShapeType() { + return ShapeType.CIRCLE; + } +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java new file mode 100644 index 0000000..40716aa --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java @@ -0,0 +1,12 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public class FactoryProvider { + public static AbstractShapeFactory getShapeFactory(FactoryType factoryType) { + if (FactoryType.TWO_D_FACTORY == factoryType) { + return new TwoDShapeFactory(); + } else if (FactoryType.THREE_D_FACTORY == factoryType) { + return new ThreeDShapeFactory(); + } + return null; + } +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java new file mode 100644 index 0000000..8ea56aa --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java @@ -0,0 +1,6 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public enum FactoryType { + TWO_D_FACTORY, + THREE_D_FACTORY +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Line.java b/src/main/java/com/designpatterns/creational/abstractfactory/Line.java new file mode 100644 index 0000000..620037c --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Line.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public class Line implements Shape { + @Override + public double surfaceArea(float radius) { + return 0; + } + + @Override + public ShapeType getShapeType() { + return ShapeType.LINE; + } +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Shape.java b/src/main/java/com/designpatterns/creational/abstractfactory/Shape.java new file mode 100644 index 0000000..5e74131 --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Shape.java @@ -0,0 +1,18 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public interface Shape { + /** + * calculates the surface area for the shape object + * + * @param radius the radius or length of shape whose area is to be calculated + * @return total surface area for the shape + */ + double surfaceArea(float radius); + + /** + * A property to identity the type of the shape for testing the pattern + * + * @return an enum describing the shape type + */ + ShapeType getShapeType(); +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java b/src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java new file mode 100644 index 0000000..8fc6ac9 --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java @@ -0,0 +1,7 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public enum ShapeType { + LINE, + CIRCLE, + SPHERE +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java b/src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java new file mode 100644 index 0000000..01b530c --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public class Sphere implements Shape { + @Override + public double surfaceArea(float radius) { + return 4 * Math.PI * radius * radius; + } + + @Override + public ShapeType getShapeType() { + return ShapeType.SPHERE; + } +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java b/src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java new file mode 100644 index 0000000..2a23234 --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java @@ -0,0 +1,11 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public class ThreeDShapeFactory extends AbstractShapeFactory { + @Override + public Shape getShape(ShapeType name) { + if (ShapeType.SPHERE == name) { + return new Sphere(); + } + return null; + } +} diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java b/src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java new file mode 100644 index 0000000..5d553ef --- /dev/null +++ b/src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java @@ -0,0 +1,13 @@ +package src.main.java.com.designpatterns.creational.abstractfactory; + +public class TwoDShapeFactory extends AbstractShapeFactory { + @Override + public Shape getShape(ShapeType name) { + if (ShapeType.LINE == name) { + return new Line(); + } else if (ShapeType.CIRCLE == name) { + return new Circle(); + } + return null; + } +} diff --git a/src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java b/src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java new file mode 100644 index 0000000..96e4e34 --- /dev/null +++ b/src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java @@ -0,0 +1,46 @@ +package src.test.java.com.designpatterns.creational.abstractfactory; + +import org.junit.Assert; +import org.junit.Test; +import src.main.java.com.designpatterns.creational.abstractfactory.*; + +public class AbstractShapeFactoryTest { + @Test + public void testAbstractShapeFactory() { + String failReason = ""; + // Tests for 2-D shape factory + // Test for Line + AbstractShapeFactory shapeFactory = FactoryProvider.getShapeFactory(FactoryType.TWO_D_FACTORY); + Shape shape = shapeFactory.getShape(ShapeType.LINE); + if (shape.getShapeType() != ShapeType.LINE) { + failReason += "Could not create an object for LINE.\n"; + } + if (shape.surfaceArea(5) != 0) { + failReason += "Surface area of Line is incorrect!.\n"; + } + + // Test for circle + shape = shapeFactory.getShape(ShapeType.CIRCLE); + if (shape.getShapeType() != ShapeType.CIRCLE) { + failReason += "Could not create an object for CIRCLE.\n"; + } + if (shape.surfaceArea(9) != 254.46900494077323) { + failReason += "Surface area of Circle is incorrect!.\n"; + } + + // Test for 3-D shape factory + // Test for Sphere + shapeFactory = FactoryProvider.getShapeFactory(FactoryType.THREE_D_FACTORY); + shape = shapeFactory.getShape(ShapeType.SPHERE); + + if (shape.getShapeType() != ShapeType.SPHERE) { + failReason += "Could not create and object for SPHERE.\n"; + } + if (shape.surfaceArea(6) != 452.3893421169302) { + failReason += "Surface area of Sphere is incorrect!.\n"; + } + + Assert.assertEquals(failReason, "", failReason); + + } +} From 7e33042c3a508723a087e8f33c78c873fdcf840e Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Fri, 24 May 2019 13:45:48 +0530 Subject: [PATCH 104/120] @Test annotated methods must be public. Removed the annotation and made methods private --- src/test/java/com/others/FastPowerTest.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/others/FastPowerTest.java b/src/test/java/com/others/FastPowerTest.java index c3f504e..5824dae 100644 --- a/src/test/java/com/others/FastPowerTest.java +++ b/src/test/java/com/others/FastPowerTest.java @@ -9,14 +9,12 @@ public class FastPowerTest { - @Test - void testLong(long n, long k, long m) { + private void testLong(long n, long k, long m) { long result = FastPower.calculate(n, k, m); assertEquals(result, BigInteger.valueOf(n).modPow(BigInteger.valueOf(k), BigInteger.valueOf(m)).longValue()); } - @Test - void testBigInteger(BigInteger n, BigInteger k, BigInteger m) { + private void testBigInteger(BigInteger n, BigInteger k, BigInteger m) { BigInteger result = FastPower.calculate(n, k, m); assertEquals(result, n.modPow(k, m)); } From 13a08836be1403de642524b5b97404e5b1f21cae Mon Sep 17 00:00:00 2001 From: Libin Yang Date: Fri, 24 May 2019 17:28:00 +0800 Subject: [PATCH 105/120] Update Sha2Test.java Fix #768 --- src/test/java/com/crypto/hash/Sha2Test.java | 82 +++++++-------------- 1 file changed, 27 insertions(+), 55 deletions(-) diff --git a/src/test/java/com/crypto/hash/Sha2Test.java b/src/test/java/com/crypto/hash/Sha2Test.java index ee1d7aa..d684587 100644 --- a/src/test/java/com/crypto/hash/Sha2Test.java +++ b/src/test/java/com/crypto/hash/Sha2Test.java @@ -1,19 +1,17 @@ package src.test.java.com.crypto.hash; -import java.lang.StringBuilder; -import org.junit.Test; +import org.junit.Assert; import org.junit.BeforeClass; +import org.junit.Test; import src.main.java.com.crypto.hash.Sha2; -import static junit.framework.Assert.assertEquals; - public class Sha2Test { - /* + + /** * The following test vectors for the SHA-2 family are taken from: * https://www.di-mgt.com.au/sha_testvectors.html */ - private static byte[][] vector; @BeforeClass @@ -21,7 +19,7 @@ public static void setUpClass() { System.out.println("@BeforeClass setUpClass"); StringBuilder builder = new StringBuilder(); - vector = new byte[6][]; + vector = new byte[5][]; vector[0] = "abc".getBytes(); vector[1] = "".getBytes(); @@ -31,161 +29,135 @@ public static void setUpClass() { builder.append("a"); } vector[4] = builder.toString().getBytes(); - builder = new StringBuilder(); - for (int i = 0; i < 16_777_216; i++) { - builder.append("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno"); - } - vector[5] = builder.toString().getBytes(); + } @Test public void TestSha224Vector1() { String digest = "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7"; - assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[0])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[0])); } @Test public void TestSha224Vector2() { String digest = "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"; - assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[1])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[1])); } @Test public void TestSha224Vector3() { String digest = "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525"; - assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[2])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[2])); } @Test public void TestSha224Vector4() { String digest = "c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3"; - assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[3])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[3])); } @Test public void TestSha224Vector5() { String digest = "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67"; - assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[4])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[4])); } - @Test - public void TestSha224Vector6() { - String digest = "b5989713ca4fe47a009f8621980b34e6d63ed3063b2a0a2c867d8a85"; - assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[5])); - } @Test public void TestSha256Vector1() { String digest = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"; - assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[0])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[0])); } @Test public void TestSha256Vector2() { String digest = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[1])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[1])); } @Test public void TestSha256Vector3() { String digest = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; - assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[2])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[2])); } @Test public void TestSha256Vector4() { String digest = "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1"; - assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[3])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[3])); } @Test public void TestSha256Vector5() { String digest = "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"; - assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[4])); - } - - @Test - public void TestSha256Vector6() { - String digest = "50e72a0e26442fe2552dc3938ac58658228c0cbfb1d2ca872ae435266fcd055e"; - assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[5])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[4])); } @Test public void TestSha384Vector1() { String digest = "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7"; - assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[0])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[0])); } @Test public void TestSha384Vector2() { String digest = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"; - assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[1])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[1])); } @Test public void TestSha384Vector3() { String digest = "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b"; - assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[2])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[2])); } @Test public void TestSha384Vector4() { String digest = "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039"; - assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[3])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[3])); } @Test public void TestSha384Vector5() { String digest = "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985"; - assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[4])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[4])); } - @Test - public void TestSha384Vector6() { - String digest = "5441235cc0235341ed806a64fb354742b5e5c02a3c5cb71b5f63fb793458d8fdae599c8cd8884943c04f11b31b89f023"; - assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[5])); - } @Test public void TestSha512Vector1() { String digest = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"; - assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[0])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[0])); } @Test public void TestSha512Vector2() { String digest = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"; - assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[1])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[1])); } @Test public void TestSha512Vector3() { String digest = "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445"; - assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[2])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[2])); } @Test public void TestSha512Vector4() { String digest = "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909"; - assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[3])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[3])); } @Test public void TestSha512Vector5() { String digest = "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"; - assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[4])); - } - - @Test - public void TestSha512Vector6() { - String digest = "b47c933421ea2db149ad6e10fce6c7f93d0752380180ffd7f4629a712134831d77be6091b819ed352c2967a2e2d4fa5050723c9630691f1a05a7281dbe6c1086"; - assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[5])); + Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[4])); } @Test public void TestInputByteArrayNotAltered() { byte[] array = vector[2]; Sha2.SHA224(array); - assertEquals("user vector altered", array, vector[2]); + Assert.assertEquals("user vector altered", array, vector[2]); } } From afe5d241b91874c82a47331688c20db2fc560b70 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Mon, 27 May 2019 12:05:42 +0530 Subject: [PATCH 106/120] Added adapter pattern and its test case --- .../structural/adapter/BugattiVeyron.java | 8 ++++++++ .../structural/adapter/Movable.java | 6 ++++++ .../structural/adapter/MovableAdapter.java | 16 ++++++++++++++++ .../structural/adapter/MovableAdapterImpl.java | 18 ++++++++++++++++++ .../structural/MovableAdapterTest.java | 18 ++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java create mode 100644 src/main/java/com/designpatterns/structural/adapter/Movable.java create mode 100644 src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java create mode 100644 src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java create mode 100644 src/test/java/com/designpatterns/structural/MovableAdapterTest.java diff --git a/src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java b/src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java new file mode 100644 index 0000000..4cffba4 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java @@ -0,0 +1,8 @@ +package src.main.java.com.designpatterns.structural.adapter; + +public class BugattiVeyron implements Movable { + @Override + public double getSpeed() { + return 268; + } +} diff --git a/src/main/java/com/designpatterns/structural/adapter/Movable.java b/src/main/java/com/designpatterns/structural/adapter/Movable.java new file mode 100644 index 0000000..eeca412 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/adapter/Movable.java @@ -0,0 +1,6 @@ +package src.main.java.com.designpatterns.structural.adapter; + +public interface Movable { + // Returns the speed of the movable in MPH + double getSpeed(); +} diff --git a/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java b/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java new file mode 100644 index 0000000..3cd11ea --- /dev/null +++ b/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java @@ -0,0 +1,16 @@ +package src.main.java.com.designpatterns.structural.adapter; + +/** + * An Adapter pattern acts as a connector between two incompatible interfaces that otherwise cannot be connected + * directly. An Adapter wraps an existing class with a new interface so that it becomes compatible with the client’s + * interface. + *
+ * The main motive behind using this pattern is to convert an existing interface into another interface that the client + * expects. It’s usually implemented once the application is designed. + * + * @see Adapter Pattern + */ +public interface MovableAdapter { + // Returns the speed of the movable in KPH + double getSpeed(); +} diff --git a/src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java b/src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java new file mode 100644 index 0000000..c8d819a --- /dev/null +++ b/src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java @@ -0,0 +1,18 @@ +package src.main.java.com.designpatterns.structural.adapter; + +public class MovableAdapterImpl implements MovableAdapter { + private Movable luxuryCars; + + public MovableAdapterImpl(Movable luxuryCars) { + this.luxuryCars = luxuryCars; + } + + @Override + public double getSpeed() { + return convertMPHtoKMPH(luxuryCars.getSpeed()); + } + + private double convertMPHtoKMPH(double mph) { + return mph * 1.60934; + } +} diff --git a/src/test/java/com/designpatterns/structural/MovableAdapterTest.java b/src/test/java/com/designpatterns/structural/MovableAdapterTest.java new file mode 100644 index 0000000..bfec64b --- /dev/null +++ b/src/test/java/com/designpatterns/structural/MovableAdapterTest.java @@ -0,0 +1,18 @@ +package src.test.java.com.designpatterns.structural; + +import org.junit.Test; +import src.main.java.com.designpatterns.structural.adapter.BugattiVeyron; +import src.main.java.com.designpatterns.structural.adapter.Movable; +import src.main.java.com.designpatterns.structural.adapter.MovableAdapter; +import src.main.java.com.designpatterns.structural.adapter.MovableAdapterImpl; + +import static org.junit.Assert.assertEquals; + +public class MovableAdapterTest { + @Test + public void testMovableAdapter() { + Movable bugattiVeyron = new BugattiVeyron(); + MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron); + assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001); + } +} From a7a9abd8c0f40082f5df5845e6ecce32d3ed2e81 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Mon, 27 May 2019 12:06:39 +0530 Subject: [PATCH 107/120] Corrected the package for the JUnit --- .../structural/{ => adapter}/MovableAdapterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/java/com/designpatterns/structural/{ => adapter}/MovableAdapterTest.java (91%) diff --git a/src/test/java/com/designpatterns/structural/MovableAdapterTest.java b/src/test/java/com/designpatterns/structural/adapter/MovableAdapterTest.java similarity index 91% rename from src/test/java/com/designpatterns/structural/MovableAdapterTest.java rename to src/test/java/com/designpatterns/structural/adapter/MovableAdapterTest.java index bfec64b..17ff9e4 100644 --- a/src/test/java/com/designpatterns/structural/MovableAdapterTest.java +++ b/src/test/java/com/designpatterns/structural/adapter/MovableAdapterTest.java @@ -1,4 +1,4 @@ -package src.test.java.com.designpatterns.structural; +package src.test.java.com.designpatterns.structural.adapter; import org.junit.Test; import src.main.java.com.designpatterns.structural.adapter.BugattiVeyron; From c31c39a08e658ebf5218864cf1f6ef7658039ef2 Mon Sep 17 00:00:00 2001 From: Abhijay Kumar Date: Tue, 28 May 2019 17:45:32 +0530 Subject: [PATCH 108/120] Removed usage of BigInteger constructor for constants --- src/main/java/com/conversions/BinaryToHexadecimal.java | 2 +- src/main/java/com/conversions/DecimalToHexadecimal.java | 2 +- src/main/java/com/conversions/DecimalToOctal.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/conversions/BinaryToHexadecimal.java b/src/main/java/com/conversions/BinaryToHexadecimal.java index fc89157..c7810f1 100644 --- a/src/main/java/com/conversions/BinaryToHexadecimal.java +++ b/src/main/java/com/conversions/BinaryToHexadecimal.java @@ -36,7 +36,7 @@ public String binToHex(String binStr) { String hex = ""; int currentBit; - BigInteger tenValue = new BigInteger("10"); + BigInteger tenValue = BigInteger.valueOf(10); while (binary.compareTo(BigInteger.ZERO) != 0) { // to store decimal equivalent of number formed by 4 decimal digits int code4 = 0; diff --git a/src/main/java/com/conversions/DecimalToHexadecimal.java b/src/main/java/com/conversions/DecimalToHexadecimal.java index e0e9360..0c812f5 100644 --- a/src/main/java/com/conversions/DecimalToHexadecimal.java +++ b/src/main/java/com/conversions/DecimalToHexadecimal.java @@ -4,7 +4,7 @@ public class DecimalToHexadecimal { private static final char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - private static final BigInteger valueHex = new BigInteger("16"); + private static final BigInteger valueHex = BigInteger.valueOf(16); /** * This method converts and decimal number to a Hexadecimal number diff --git a/src/main/java/com/conversions/DecimalToOctal.java b/src/main/java/com/conversions/DecimalToOctal.java index 6ab6e72..6454229 100644 --- a/src/main/java/com/conversions/DecimalToOctal.java +++ b/src/main/java/com/conversions/DecimalToOctal.java @@ -4,7 +4,7 @@ public class DecimalToOctal { private static final char[] octalChars = {'0', '1', '2', '3', '4', '5', '6', '7'}; - private static final BigInteger valueOctal = new BigInteger("8"); + private static final BigInteger valueOctal = BigInteger.valueOf(8); /** * This method converts and decimal number to a octal number From d579b8e903b5dc8befc6a11474a2d4af96cf4456 Mon Sep 17 00:00:00 2001 From: laingke Date: Fri, 19 Jul 2019 14:16:37 +0800 Subject: [PATCH 109/120] feat: Add Maven frameworks support. 1. Add JUnit Jupiter dependency; 2. Add maven-resources-plugin to fix path problem in SimplexNoise testcase; 3. Add maven-compiler-plugin to tell the default compiler version; --- pom.xml | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4bba7c6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,64 @@ + + + 4.0.0 + + algorithm + java-algorithm + 1.0-SNAPSHOT + java-algorithm + All algorithms implemented in Java (for education) + + + UTF-8 + 3.1.0 + 3.8.0 + + 1.8 + UTF-8 + + 5.5.0 + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter-api.version} + test + + + + + + + org.apache.maven.plugins + maven-resources-plugin + ${resources.plugin.version} + + ${file.encoding} + + + + org.apache.maven.plugins + maven-compiler-plugin + ${compiler.plugin.version} + + ${java.version} + ${java.version} + ${file.encoding} + + + + + + + src/main/resources + + + src/test/resources + + + + From 87693f051ce160f8e30a414392edf6aa8a412224 Mon Sep 17 00:00:00 2001 From: laingke Date: Fri, 19 Jul 2019 14:32:02 +0800 Subject: [PATCH 110/120] fix: Correct the package path and reference --- .../com/conversions/AnyBaseToDecimal.java | 4 +- .../java/com/conversions/BinaryToGray.java | 2 +- .../com/conversions/BinaryToHexadecimal.java | 2 +- .../com/conversions/DecimalToAnyBase.java | 2 +- .../com/conversions/DecimalToHexadecimal.java | 2 +- .../java/com/conversions/DecimalToOctal.java | 2 +- src/main/java/com/crypto/codec/Base64.java | 2 +- src/main/java/com/crypto/hash/Sha2.java | 6 +- .../java/com/dataStructures/BinaryTree.java | 4 +- .../java/com/dataStructures/DisjointSet.java | 4 +- .../java/com/dataStructures/GeneralQueue.java | 4 +- src/main/java/com/dataStructures/Stack.java | 2 +- .../abstractfactory/AbstractShapeFactory.java | 2 +- .../creational/abstractfactory/Circle.java | 2 +- .../abstractfactory/FactoryProvider.java | 2 +- .../abstractfactory/FactoryType.java | 2 +- .../creational/abstractfactory/Line.java | 2 +- .../creational/abstractfactory/Shape.java | 2 +- .../creational/abstractfactory/ShapeType.java | 2 +- .../creational/abstractfactory/Sphere.java | 2 +- .../abstractfactory/ThreeDShapeFactory.java | 2 +- .../abstractfactory/TwoDShapeFactory.java | 2 +- .../creational/builder/Desktop.java | 2 +- .../creational/factory/Pentagon.java | 2 +- .../creational/factory/Polygon.java | 2 +- .../creational/factory/PolygonFactory.java | 2 +- .../creational/factory/Square.java | 2 +- .../creational/factory/Triangle.java | 2 +- .../creational/prototype/BlackColor.java | 4 +- .../creational/prototype/BlueColor.java | 2 +- .../creational/prototype/Color.java | 4 +- .../creational/prototype/ColorStore.java | 2 +- .../creational/prototype/RedColor.java | 2 +- .../creational/singleton/Singleton.java | 2 +- .../structural/adapter/BugattiVeyron.java | 2 +- .../structural/adapter/Movable.java | 2 +- .../structural/adapter/MovableAdapter.java | 2 +- .../adapter/MovableAdapterImpl.java | 2 +- .../java/com/generation/SimplexNoise.java | 2 +- .../com/generation/SimplexNoiseOctave.java | 2 +- .../matchings/stableMatching/GaleShapley.java | 4 +- src/main/java/com/others/FastPower.java | 2 +- src/main/java/com/search/BinarySearch.java | 2 +- src/main/java/com/search/BloomFilter.java | 2 +- .../java/com/search/ExponentialSearch.java | 2 +- src/main/java/com/search/FibonacciSearch.java | 2 +- .../java/com/search/InterpolationSearch.java | 4 +- src/main/java/com/search/JumpSearch.java | 4 +- src/main/java/com/search/LinearSearch.java | 2 +- src/main/java/com/sorts/BubbleSort.java | 6 +- src/main/java/com/sorts/CountingSort.java | 2 +- src/main/java/com/sorts/CycleSort.java | 2 +- src/main/java/com/sorts/HeapSort.java | 8 +- src/main/java/com/sorts/InsertionSort.java | 2 +- src/main/java/com/sorts/MergeSort.java | 2 +- src/main/java/com/sorts/PigeonholeSort.java | 2 +- src/main/java/com/sorts/QuickSort.java | 8 +- src/main/java/com/sorts/SelectionSort.java | 8 +- src/main/java/com/sorts/ShellSort.java | 8 +- src/main/java/com/sorts/SortUtils.java | 4 +- src/main/java/com/sorts/StoogeSort.java | 8 +- src/main/java/com/types/DataStructure.java | 2 +- src/main/java/com/types/Queue.java | 2 +- src/main/java/com/types/Sort.java | 2 +- .../com/conversions/AnyBaseToDecimalTest.java | 63 ++++++----- .../com/conversions/BinaryToGrayTest.java | 16 ++- .../conversions/BinaryToHexadecimalTest.java | 17 ++- .../com/conversions/DecimalToAnyBaseTest.java | 16 ++- .../conversions/DecimalToHexadecimalTest.java | 21 ++-- .../com/conversions/DecimalToOctalTest.java | 21 ++-- .../java/com/crypto/codec/Base64Test.java | 55 +++++----- src/test/java/com/crypto/hash/Sha2Test.java | 100 +++++++++--------- .../com/dataStructures/BinaryTreeTest.java | 24 ++--- .../com/dataStructures/DisjointSetTest.java | 22 ++-- .../com/dataStructures/GeneralQueueTest.java | 29 +++-- .../java/com/dataStructures/StackTest.java | 62 +++++------ .../AbstractShapeFactoryTest.java | 13 ++- .../builder/DesktopBuilderTest.java | 15 ++- .../factory/PolygonFactoryTest.java | 14 ++- .../creational/prototype/PrototypeTest.java | 13 ++- .../creational/singleton/SingletonTest.java | 13 ++- .../adapter/MovableAdapterTest.java | 17 ++- .../java/com/generation/SimplexNoiseTest.java | 27 +++-- .../stableMatching/GaleShapleyTest.java | 32 +++--- src/test/java/com/others/FastPowerTest.java | 16 ++- .../java/com/search/BinarySearchTest.java | 29 +++-- src/test/java/com/search/BloomFilterTest.java | 22 ++-- .../com/search/ExponentialSearchTest.java | 19 ++-- .../java/com/search/FibonacciSearchTest.java | 19 ++-- .../com/search/InterpolationSearchTest.java | 46 ++++---- src/test/java/com/search/JumpSearchTest.java | 46 ++++---- .../java/com/search/LinearSearchTest.java | 30 +++--- src/test/java/com/sorts/BubbleSortTest.java | 30 +++--- src/test/java/com/sorts/CountingSortTest.java | 13 ++- src/test/java/com/sorts/CycleSortTest.java | 19 ++-- src/test/java/com/sorts/HeapSortTest.java | 29 +++-- .../java/com/sorts/InsertionSortTest.java | 65 ++++++------ src/test/java/com/sorts/MergeSortTest.java | 47 ++++---- .../java/com/sorts/PigeonholeSortTest.java | 17 ++- src/test/java/com/sorts/QuickSortTest.java | 29 +++-- .../java/com/sorts/SelectionSortTest.java | 29 +++-- src/test/java/com/sorts/ShellSortTest.java | 29 +++-- src/test/java/com/sorts/StoogeSortTest.java | 43 ++++---- .../com/generation/expected-result.png | Bin 104 files changed, 648 insertions(+), 705 deletions(-) rename src/test/{java => resources}/com/generation/expected-result.png (100%) diff --git a/src/main/java/com/conversions/AnyBaseToDecimal.java b/src/main/java/com/conversions/AnyBaseToDecimal.java index 65f89f2..f997c11 100644 --- a/src/main/java/com/conversions/AnyBaseToDecimal.java +++ b/src/main/java/com/conversions/AnyBaseToDecimal.java @@ -1,4 +1,4 @@ -package src.main.java.com.conversions; +package com.conversions; public class AnyBaseToDecimal { /** @@ -37,4 +37,4 @@ private static int valOfChar(char c) { return (int) c - 'A' + 10; } } -} \ No newline at end of file +} diff --git a/src/main/java/com/conversions/BinaryToGray.java b/src/main/java/com/conversions/BinaryToGray.java index 60896e0..eb41d57 100644 --- a/src/main/java/com/conversions/BinaryToGray.java +++ b/src/main/java/com/conversions/BinaryToGray.java @@ -1,4 +1,4 @@ -package src.main.java.com.conversions; +package com.conversions; /** * Convert the binary number into gray code diff --git a/src/main/java/com/conversions/BinaryToHexadecimal.java b/src/main/java/com/conversions/BinaryToHexadecimal.java index c7810f1..2321ecf 100644 --- a/src/main/java/com/conversions/BinaryToHexadecimal.java +++ b/src/main/java/com/conversions/BinaryToHexadecimal.java @@ -1,4 +1,4 @@ -package src.main.java.com.conversions; +package com.conversions; import java.math.BigInteger; import java.util.HashMap; diff --git a/src/main/java/com/conversions/DecimalToAnyBase.java b/src/main/java/com/conversions/DecimalToAnyBase.java index 912d423..48cbbde 100644 --- a/src/main/java/com/conversions/DecimalToAnyBase.java +++ b/src/main/java/com/conversions/DecimalToAnyBase.java @@ -1,4 +1,4 @@ -package src.main.java.com.conversions; +package com.conversions; import java.util.ArrayList; diff --git a/src/main/java/com/conversions/DecimalToHexadecimal.java b/src/main/java/com/conversions/DecimalToHexadecimal.java index 0c812f5..c9b968b 100644 --- a/src/main/java/com/conversions/DecimalToHexadecimal.java +++ b/src/main/java/com/conversions/DecimalToHexadecimal.java @@ -1,4 +1,4 @@ -package src.main.java.com.conversions; +package com.conversions; import java.math.BigInteger; diff --git a/src/main/java/com/conversions/DecimalToOctal.java b/src/main/java/com/conversions/DecimalToOctal.java index 6454229..bf1cbff 100644 --- a/src/main/java/com/conversions/DecimalToOctal.java +++ b/src/main/java/com/conversions/DecimalToOctal.java @@ -1,4 +1,4 @@ -package src.main.java.com.conversions; +package com.conversions; import java.math.BigInteger; diff --git a/src/main/java/com/crypto/codec/Base64.java b/src/main/java/com/crypto/codec/Base64.java index f65faf9..b62d3e5 100644 --- a/src/main/java/com/crypto/codec/Base64.java +++ b/src/main/java/com/crypto/codec/Base64.java @@ -1,4 +1,4 @@ -package src.main.java.com.crypto.codec; +package com.crypto.codec; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/com/crypto/hash/Sha2.java b/src/main/java/com/crypto/hash/Sha2.java index d5d277c..47b88f3 100644 --- a/src/main/java/com/crypto/hash/Sha2.java +++ b/src/main/java/com/crypto/hash/Sha2.java @@ -1,4 +1,4 @@ -package src.main.java.com.crypto.hash; +package com.crypto.hash; import java.nio.ByteBuffer; @@ -52,7 +52,7 @@ public static String SHA224(byte[] data) { * * @param data the data/message to be digested * @return the message digest with a fixed length of 256 bit (32 byte) - * @see src.main.java.com.crypto.hash.Sha2#SHA224(byte[]) SHA224() + * @see com.crypto.hash.Sha2#SHA224(byte[]) SHA224() */ public static String SHA256(byte[] data) { final int[] initialHash = { @@ -100,7 +100,7 @@ public static String SHA384(byte[] data) { * * @param data the data/message to be digested * @return the message digest with a fixed length of 512 bit (64 byte) - * @see src.main.java.com.crypto.hash.Sha2#SHA384(byte[]) SHA384() + * @see com.crypto.hash.Sha2#SHA384(byte[]) SHA384() */ public static String SHA512(byte[] data) { final long[] initialHash = { diff --git a/src/main/java/com/dataStructures/BinaryTree.java b/src/main/java/com/dataStructures/BinaryTree.java index 3542bce..4aae62f 100644 --- a/src/main/java/com/dataStructures/BinaryTree.java +++ b/src/main/java/com/dataStructures/BinaryTree.java @@ -1,4 +1,4 @@ -package src.main.java.com.dataStructures; +package com.dataStructures; /** * Binary tree for general value type, without redundancy @@ -128,4 +128,4 @@ public BinaryTree getLeft() { public void setLeft(BinaryTree left) { this.left = left; } -} \ No newline at end of file +} diff --git a/src/main/java/com/dataStructures/DisjointSet.java b/src/main/java/com/dataStructures/DisjointSet.java index 3fb70f6..3cb0d69 100644 --- a/src/main/java/com/dataStructures/DisjointSet.java +++ b/src/main/java/com/dataStructures/DisjointSet.java @@ -1,4 +1,4 @@ -package src.main.java.com.dataStructures; +package com.dataStructures; import java.io.Serializable; import java.util.*; @@ -132,4 +132,4 @@ static class Node { } } -} \ No newline at end of file +} diff --git a/src/main/java/com/dataStructures/GeneralQueue.java b/src/main/java/com/dataStructures/GeneralQueue.java index a141ab1..3d09208 100644 --- a/src/main/java/com/dataStructures/GeneralQueue.java +++ b/src/main/java/com/dataStructures/GeneralQueue.java @@ -1,6 +1,6 @@ -package src.main.java.com.dataStructures; +package com.dataStructures; -import src.main.java.com.types.Queue; +import com.types.Queue; import java.util.Iterator; import java.util.LinkedList; diff --git a/src/main/java/com/dataStructures/Stack.java b/src/main/java/com/dataStructures/Stack.java index 0349a52..3b67501 100644 --- a/src/main/java/com/dataStructures/Stack.java +++ b/src/main/java/com/dataStructures/Stack.java @@ -1,4 +1,4 @@ -package src.main.java.com.dataStructures; +package com.dataStructures; import java.io.Serializable; import java.util.EmptyStackException; diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java b/src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java index f48f80c..9216a00 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactory.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; /** * The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Circle.java b/src/main/java/com/designpatterns/creational/abstractfactory/Circle.java index 47f277a..f8a980c 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/Circle.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Circle.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public class Circle implements Shape { @Override diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java index 40716aa..777aec4 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryProvider.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public class FactoryProvider { public static AbstractShapeFactory getShapeFactory(FactoryType factoryType) { diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java index 8ea56aa..63f4e8c 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/FactoryType.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public enum FactoryType { TWO_D_FACTORY, diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Line.java b/src/main/java/com/designpatterns/creational/abstractfactory/Line.java index 620037c..2c3ce0c 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/Line.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Line.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public class Line implements Shape { @Override diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Shape.java b/src/main/java/com/designpatterns/creational/abstractfactory/Shape.java index 5e74131..f32b72d 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/Shape.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Shape.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public interface Shape { /** diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java b/src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java index 8fc6ac9..464ba8c 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/ShapeType.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public enum ShapeType { LINE, diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java b/src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java index 01b530c..5482d4a 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/Sphere.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public class Sphere implements Shape { @Override diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java b/src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java index 2a23234..385a45c 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/ThreeDShapeFactory.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public class ThreeDShapeFactory extends AbstractShapeFactory { @Override diff --git a/src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java b/src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java index 5d553ef..34f00eb 100644 --- a/src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java +++ b/src/main/java/com/designpatterns/creational/abstractfactory/TwoDShapeFactory.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; public class TwoDShapeFactory extends AbstractShapeFactory { @Override diff --git a/src/main/java/com/designpatterns/creational/builder/Desktop.java b/src/main/java/com/designpatterns/creational/builder/Desktop.java index d66ecf3..c65ed03 100644 --- a/src/main/java/com/designpatterns/creational/builder/Desktop.java +++ b/src/main/java/com/designpatterns/creational/builder/Desktop.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.builder; +package com.designpatterns.creational.builder; /** * The Builder is a design pattern designed to provide a flexible solution to various object creation problems in diff --git a/src/main/java/com/designpatterns/creational/factory/Pentagon.java b/src/main/java/com/designpatterns/creational/factory/Pentagon.java index 2d70f0d..08ad798 100644 --- a/src/main/java/com/designpatterns/creational/factory/Pentagon.java +++ b/src/main/java/com/designpatterns/creational/factory/Pentagon.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.factory; +package com.designpatterns.creational.factory; public class Pentagon implements Polygon { @Override diff --git a/src/main/java/com/designpatterns/creational/factory/Polygon.java b/src/main/java/com/designpatterns/creational/factory/Polygon.java index 0d5b4c9..3551775 100644 --- a/src/main/java/com/designpatterns/creational/factory/Polygon.java +++ b/src/main/java/com/designpatterns/creational/factory/Polygon.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.factory; +package com.designpatterns.creational.factory; public interface Polygon { /** diff --git a/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java b/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java index 8b31472..bccaa6c 100644 --- a/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java +++ b/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.factory; +package com.designpatterns.creational.factory; /** * In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal diff --git a/src/main/java/com/designpatterns/creational/factory/Square.java b/src/main/java/com/designpatterns/creational/factory/Square.java index 562233c..fbb2ce2 100644 --- a/src/main/java/com/designpatterns/creational/factory/Square.java +++ b/src/main/java/com/designpatterns/creational/factory/Square.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.factory; +package com.designpatterns.creational.factory; public class Square implements Polygon { diff --git a/src/main/java/com/designpatterns/creational/factory/Triangle.java b/src/main/java/com/designpatterns/creational/factory/Triangle.java index d95228b..5c00cf4 100644 --- a/src/main/java/com/designpatterns/creational/factory/Triangle.java +++ b/src/main/java/com/designpatterns/creational/factory/Triangle.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.factory; +package com.designpatterns.creational.factory; public class Triangle implements Polygon { @Override diff --git a/src/main/java/com/designpatterns/creational/prototype/BlackColor.java b/src/main/java/com/designpatterns/creational/prototype/BlackColor.java index b70a182..ccb4349 100644 --- a/src/main/java/com/designpatterns/creational/prototype/BlackColor.java +++ b/src/main/java/com/designpatterns/creational/prototype/BlackColor.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.prototype; +package com.designpatterns.creational.prototype; class BlackColor extends Color { @@ -10,4 +10,4 @@ class BlackColor extends Color { public String addColor() { return "Black color added"; } -} \ No newline at end of file +} diff --git a/src/main/java/com/designpatterns/creational/prototype/BlueColor.java b/src/main/java/com/designpatterns/creational/prototype/BlueColor.java index 231103f..b9bfb25 100644 --- a/src/main/java/com/designpatterns/creational/prototype/BlueColor.java +++ b/src/main/java/com/designpatterns/creational/prototype/BlueColor.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.prototype; +package com.designpatterns.creational.prototype; class BlueColor extends Color { diff --git a/src/main/java/com/designpatterns/creational/prototype/Color.java b/src/main/java/com/designpatterns/creational/prototype/Color.java index 9706c2f..86e2818 100644 --- a/src/main/java/com/designpatterns/creational/prototype/Color.java +++ b/src/main/java/com/designpatterns/creational/prototype/Color.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.prototype; +package com.designpatterns.creational.prototype; /** * The prototype pattern is used when the type of objects to create is determined by a prototypical instance, which @@ -31,4 +31,4 @@ public Object clone() { } return clone; } -} \ No newline at end of file +} diff --git a/src/main/java/com/designpatterns/creational/prototype/ColorStore.java b/src/main/java/com/designpatterns/creational/prototype/ColorStore.java index fc6b519..9265466 100644 --- a/src/main/java/com/designpatterns/creational/prototype/ColorStore.java +++ b/src/main/java/com/designpatterns/creational/prototype/ColorStore.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.prototype; +package com.designpatterns.creational.prototype; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/designpatterns/creational/prototype/RedColor.java b/src/main/java/com/designpatterns/creational/prototype/RedColor.java index 96392c4..a895c45 100644 --- a/src/main/java/com/designpatterns/creational/prototype/RedColor.java +++ b/src/main/java/com/designpatterns/creational/prototype/RedColor.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.prototype; +package com.designpatterns.creational.prototype; class RedColor extends Color { diff --git a/src/main/java/com/designpatterns/creational/singleton/Singleton.java b/src/main/java/com/designpatterns/creational/singleton/Singleton.java index 9591303..8781845 100644 --- a/src/main/java/com/designpatterns/creational/singleton/Singleton.java +++ b/src/main/java/com/designpatterns/creational/singleton/Singleton.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.creational.singleton; +package com.designpatterns.creational.singleton; /** * The singleton pattern is a design pattern that restricts the instantiation of a class to one "single" instance. diff --git a/src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java b/src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java index 4cffba4..36f2eaa 100644 --- a/src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java +++ b/src/main/java/com/designpatterns/structural/adapter/BugattiVeyron.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.structural.adapter; +package com.designpatterns.structural.adapter; public class BugattiVeyron implements Movable { @Override diff --git a/src/main/java/com/designpatterns/structural/adapter/Movable.java b/src/main/java/com/designpatterns/structural/adapter/Movable.java index eeca412..266a297 100644 --- a/src/main/java/com/designpatterns/structural/adapter/Movable.java +++ b/src/main/java/com/designpatterns/structural/adapter/Movable.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.structural.adapter; +package com.designpatterns.structural.adapter; public interface Movable { // Returns the speed of the movable in MPH diff --git a/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java b/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java index 3cd11ea..b3c4964 100644 --- a/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java +++ b/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.structural.adapter; +package com.designpatterns.structural.adapter; /** * An Adapter pattern acts as a connector between two incompatible interfaces that otherwise cannot be connected diff --git a/src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java b/src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java index c8d819a..e77ebe8 100644 --- a/src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java +++ b/src/main/java/com/designpatterns/structural/adapter/MovableAdapterImpl.java @@ -1,4 +1,4 @@ -package src.main.java.com.designpatterns.structural.adapter; +package com.designpatterns.structural.adapter; public class MovableAdapterImpl implements MovableAdapter { private Movable luxuryCars; diff --git a/src/main/java/com/generation/SimplexNoise.java b/src/main/java/com/generation/SimplexNoise.java index fb4473d..e707119 100644 --- a/src/main/java/com/generation/SimplexNoise.java +++ b/src/main/java/com/generation/SimplexNoise.java @@ -1,4 +1,4 @@ -package src.main.java.com.generation; +package com.generation; import java.util.Random; diff --git a/src/main/java/com/generation/SimplexNoiseOctave.java b/src/main/java/com/generation/SimplexNoiseOctave.java index b1e281d..f236e7e 100644 --- a/src/main/java/com/generation/SimplexNoiseOctave.java +++ b/src/main/java/com/generation/SimplexNoiseOctave.java @@ -1,4 +1,4 @@ -package src.main.java.com.generation; +package com.generation; import java.util.Random; diff --git a/src/main/java/com/matchings/stableMatching/GaleShapley.java b/src/main/java/com/matchings/stableMatching/GaleShapley.java index 18624f9..1e1e1ab 100644 --- a/src/main/java/com/matchings/stableMatching/GaleShapley.java +++ b/src/main/java/com/matchings/stableMatching/GaleShapley.java @@ -1,4 +1,4 @@ -package src.main.java.com.matchings.stableMatching; +package com.matchings.stableMatching; public class GaleShapley { @@ -100,4 +100,4 @@ public int getUnengaged(int[] menMatching) { } return -1; } -} \ No newline at end of file +} diff --git a/src/main/java/com/others/FastPower.java b/src/main/java/com/others/FastPower.java index ef1bd89..5a941e8 100644 --- a/src/main/java/com/others/FastPower.java +++ b/src/main/java/com/others/FastPower.java @@ -1,4 +1,4 @@ -package src.main.java.com.others; +package com.others; import java.math.BigInteger; diff --git a/src/main/java/com/search/BinarySearch.java b/src/main/java/com/search/BinarySearch.java index d7d365d..c1ae44d 100644 --- a/src/main/java/com/search/BinarySearch.java +++ b/src/main/java/com/search/BinarySearch.java @@ -1,4 +1,4 @@ -package src.main.java.com.search; +package com.search; /** * Binary search is an algorithm which finds the position of a target value within a sorted array diff --git a/src/main/java/com/search/BloomFilter.java b/src/main/java/com/search/BloomFilter.java index 70a7f1c..2619e28 100644 --- a/src/main/java/com/search/BloomFilter.java +++ b/src/main/java/com/search/BloomFilter.java @@ -1,4 +1,4 @@ -package src.main.java.com.search; +package com.search; import java.io.Serializable; import java.util.ArrayList; diff --git a/src/main/java/com/search/ExponentialSearch.java b/src/main/java/com/search/ExponentialSearch.java index 0f30f09..178ab84 100644 --- a/src/main/java/com/search/ExponentialSearch.java +++ b/src/main/java/com/search/ExponentialSearch.java @@ -1,4 +1,4 @@ -package src.main.java.com.search; +package com.search; import java.util.Arrays; diff --git a/src/main/java/com/search/FibonacciSearch.java b/src/main/java/com/search/FibonacciSearch.java index 3bbcd0f..e443d02 100644 --- a/src/main/java/com/search/FibonacciSearch.java +++ b/src/main/java/com/search/FibonacciSearch.java @@ -1,4 +1,4 @@ -package src.main.java.com.search; +package com.search; import static java.lang.Math.min; diff --git a/src/main/java/com/search/InterpolationSearch.java b/src/main/java/com/search/InterpolationSearch.java index 4db1e3a..6cb2b72 100644 --- a/src/main/java/com/search/InterpolationSearch.java +++ b/src/main/java/com/search/InterpolationSearch.java @@ -1,4 +1,4 @@ -package src.main.java.com.search; +package com.search; public class InterpolationSearch { @@ -57,4 +57,4 @@ private int getPostion(T arr[], T key, int lowIndex, int highIndex) { int position = lowIndex + (((arrayIndexRangeDiff) / (arrayHighLowValuesDiff) * (keyMinusArrayLowValue))); return position; } -} \ No newline at end of file +} diff --git a/src/main/java/com/search/JumpSearch.java b/src/main/java/com/search/JumpSearch.java index 949619e..acdda6b 100644 --- a/src/main/java/com/search/JumpSearch.java +++ b/src/main/java/com/search/JumpSearch.java @@ -1,4 +1,4 @@ -package src.main.java.com.search; +package com.search; public class JumpSearch { @@ -81,4 +81,4 @@ public > int linearSearchBlock(T arr[], T key, int step, return previous; return -1; } -} \ No newline at end of file +} diff --git a/src/main/java/com/search/LinearSearch.java b/src/main/java/com/search/LinearSearch.java index 66db8aa..9e85569 100644 --- a/src/main/java/com/search/LinearSearch.java +++ b/src/main/java/com/search/LinearSearch.java @@ -1,4 +1,4 @@ -package src.main.java.com.search; +package com.search; /** * Linear search is an algorithm which finds the position of a target value within an array (Usually unsorted) diff --git a/src/main/java/com/sorts/BubbleSort.java b/src/main/java/com/sorts/BubbleSort.java index c532a64..f12504c 100644 --- a/src/main/java/com/sorts/BubbleSort.java +++ b/src/main/java/com/sorts/BubbleSort.java @@ -1,6 +1,6 @@ -package src.main.java.com.sorts; +package com.sorts; -import src.main.java.com.types.Sort; +import com.types.Sort; public class BubbleSort implements Sort { /** @@ -26,4 +26,4 @@ public > T[] sort(T[] array) { } while (swap); return array; } -} \ No newline at end of file +} diff --git a/src/main/java/com/sorts/CountingSort.java b/src/main/java/com/sorts/CountingSort.java index 987700e..32efbce 100644 --- a/src/main/java/com/sorts/CountingSort.java +++ b/src/main/java/com/sorts/CountingSort.java @@ -1,4 +1,4 @@ -package src.main.java.com.sorts; +package com.sorts; public class CountingSort { diff --git a/src/main/java/com/sorts/CycleSort.java b/src/main/java/com/sorts/CycleSort.java index 5804a7b..a1e5a5b 100644 --- a/src/main/java/com/sorts/CycleSort.java +++ b/src/main/java/com/sorts/CycleSort.java @@ -1,4 +1,4 @@ -package src.main.java.com.sorts; +package com.sorts; public class CycleSort { diff --git a/src/main/java/com/sorts/HeapSort.java b/src/main/java/com/sorts/HeapSort.java index 4135e5b..69f23d1 100644 --- a/src/main/java/com/sorts/HeapSort.java +++ b/src/main/java/com/sorts/HeapSort.java @@ -1,11 +1,11 @@ -package src.main.java.com.sorts; +package com.sorts; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static src.main.java.com.sorts.SortUtils.less; -import static src.main.java.com.sorts.SortUtils.swap; +import static com.sorts.SortUtils.less; +import static com.sorts.SortUtils.swap; public class HeapSort { @@ -111,4 +111,4 @@ private > List sort(List unsorted) { return sorted; } -} \ No newline at end of file +} diff --git a/src/main/java/com/sorts/InsertionSort.java b/src/main/java/com/sorts/InsertionSort.java index e7deb89..6ec4830 100644 --- a/src/main/java/com/sorts/InsertionSort.java +++ b/src/main/java/com/sorts/InsertionSort.java @@ -1,4 +1,4 @@ -package src.main.java.com.sorts; +package com.sorts; public class InsertionSort { diff --git a/src/main/java/com/sorts/MergeSort.java b/src/main/java/com/sorts/MergeSort.java index 6d6516b..851ff29 100644 --- a/src/main/java/com/sorts/MergeSort.java +++ b/src/main/java/com/sorts/MergeSort.java @@ -1,4 +1,4 @@ -package src.main.java.com.sorts; +package com.sorts; public class MergeSort { diff --git a/src/main/java/com/sorts/PigeonholeSort.java b/src/main/java/com/sorts/PigeonholeSort.java index 1f8b498..8080b58 100644 --- a/src/main/java/com/sorts/PigeonholeSort.java +++ b/src/main/java/com/sorts/PigeonholeSort.java @@ -1,4 +1,4 @@ -package src.main.java.com.sorts; +package com.sorts; public class PigeonholeSort { diff --git a/src/main/java/com/sorts/QuickSort.java b/src/main/java/com/sorts/QuickSort.java index e1a5f15..3fa990a 100644 --- a/src/main/java/com/sorts/QuickSort.java +++ b/src/main/java/com/sorts/QuickSort.java @@ -1,7 +1,7 @@ -package src.main.java.com.sorts; +package com.sorts; -import static src.main.java.com.sorts.SortUtils.less; -import static src.main.java.com.sorts.SortUtils.swap; +import static com.sorts.SortUtils.less; +import static com.sorts.SortUtils.swap; public class QuickSort { @@ -61,4 +61,4 @@ private static > int partition(T[] array, int left, int } return left; } -} \ No newline at end of file +} diff --git a/src/main/java/com/sorts/SelectionSort.java b/src/main/java/com/sorts/SelectionSort.java index b498aa7..c371b30 100644 --- a/src/main/java/com/sorts/SelectionSort.java +++ b/src/main/java/com/sorts/SelectionSort.java @@ -1,7 +1,7 @@ -package src.main.java.com.sorts; +package com.sorts; -import static src.main.java.com.sorts.SortUtils.less; -import static src.main.java.com.sorts.SortUtils.swap; +import static com.sorts.SortUtils.less; +import static com.sorts.SortUtils.swap; public class SelectionSort { @@ -29,4 +29,4 @@ public > T[] sort(T[] arr) { return arr; } -} \ No newline at end of file +} diff --git a/src/main/java/com/sorts/ShellSort.java b/src/main/java/com/sorts/ShellSort.java index 8ec8e41..b155dde 100644 --- a/src/main/java/com/sorts/ShellSort.java +++ b/src/main/java/com/sorts/ShellSort.java @@ -1,7 +1,7 @@ -package src.main.java.com.sorts; +package com.sorts; -import static src.main.java.com.sorts.SortUtils.less; -import static src.main.java.com.sorts.SortUtils.swap; +import static com.sorts.SortUtils.less; +import static com.sorts.SortUtils.swap; public class ShellSort { @@ -29,4 +29,4 @@ public > T[] sort(T[] array) { return array; } -} \ No newline at end of file +} diff --git a/src/main/java/com/sorts/SortUtils.java b/src/main/java/com/sorts/SortUtils.java index bd5e5a6..cbede54 100644 --- a/src/main/java/com/sorts/SortUtils.java +++ b/src/main/java/com/sorts/SortUtils.java @@ -1,4 +1,4 @@ -package src.main.java.com.sorts; +package com.sorts; final class SortUtils { @@ -42,4 +42,4 @@ static > void flip(T[] array, int left, int right) { swap(array, left++, right--); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/sorts/StoogeSort.java b/src/main/java/com/sorts/StoogeSort.java index b57d35d..2a42057 100644 --- a/src/main/java/com/sorts/StoogeSort.java +++ b/src/main/java/com/sorts/StoogeSort.java @@ -1,7 +1,7 @@ -package src.main.java.com.sorts; +package com.sorts; -import static src.main.java.com.sorts.SortUtils.swap; -import static src.main.java.com.sorts.SortUtils.less; +import static com.sorts.SortUtils.swap; +import static com.sorts.SortUtils.less; public class StoogeSort { @@ -36,4 +36,4 @@ public > T[] sort(T[] arr, int f, int l) { } return arr; } -} \ No newline at end of file +} diff --git a/src/main/java/com/types/DataStructure.java b/src/main/java/com/types/DataStructure.java index e1ffe04..c8151ea 100644 --- a/src/main/java/com/types/DataStructure.java +++ b/src/main/java/com/types/DataStructure.java @@ -1,4 +1,4 @@ -package src.main.java.com.types; +package com.types; import java.util.Iterator; diff --git a/src/main/java/com/types/Queue.java b/src/main/java/com/types/Queue.java index 19c74e6..5498d39 100644 --- a/src/main/java/com/types/Queue.java +++ b/src/main/java/com/types/Queue.java @@ -1,4 +1,4 @@ -package src.main.java.com.types; +package com.types; import java.util.NoSuchElementException; diff --git a/src/main/java/com/types/Sort.java b/src/main/java/com/types/Sort.java index e3316b4..cc9519c 100644 --- a/src/main/java/com/types/Sort.java +++ b/src/main/java/com/types/Sort.java @@ -1,4 +1,4 @@ -package src.main.java.com.types; +package com.types; @FunctionalInterface public interface Sort { diff --git a/src/test/java/com/conversions/AnyBaseToDecimalTest.java b/src/test/java/com/conversions/AnyBaseToDecimalTest.java index 2659234..96b5ef5 100644 --- a/src/test/java/com/conversions/AnyBaseToDecimalTest.java +++ b/src/test/java/com/conversions/AnyBaseToDecimalTest.java @@ -1,39 +1,38 @@ -package src.test.java.com.conversions; +package com.conversions; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.conversions.AnyBaseToDecimal; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class AnyBaseToDecimalTest { +class AnyBaseToDecimalTest { - @Test - public void testAnyBaseToDecimal() { - AnyBaseToDecimal anyBaseToDecimal = new AnyBaseToDecimal(); - Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("2", 2)); - Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("3", 2)); - Assert.assertEquals("3", anyBaseToDecimal.convertToDecimal("11", 2)); - Assert.assertEquals("4", anyBaseToDecimal.convertToDecimal("100", 2)); - Assert.assertEquals("5", anyBaseToDecimal.convertToDecimal("101", 2)); - Assert.assertEquals("10", anyBaseToDecimal.convertToDecimal("1010", 2)); - Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("10000000000", 2)); + @Test + void testAnyBaseToDecimal() { + AnyBaseToDecimal anyBaseToDecimal = new AnyBaseToDecimal(); + Assertions.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("2", 2)); + Assertions.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("3", 2)); + Assertions.assertEquals("3", anyBaseToDecimal.convertToDecimal("11", 2)); + Assertions.assertEquals("4", anyBaseToDecimal.convertToDecimal("100", 2)); + Assertions.assertEquals("5", anyBaseToDecimal.convertToDecimal("101", 2)); + Assertions.assertEquals("10", anyBaseToDecimal.convertToDecimal("1010", 2)); + Assertions.assertEquals("1024", anyBaseToDecimal.convertToDecimal("10000000000", 2)); - Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("8", 8)); - Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("9", 8)); - Assert.assertEquals("7", anyBaseToDecimal.convertToDecimal("7", 8)); - Assert.assertEquals("8", anyBaseToDecimal.convertToDecimal("10", 8)); - Assert.assertEquals("9", anyBaseToDecimal.convertToDecimal("11", 8)); - Assert.assertEquals("10", anyBaseToDecimal.convertToDecimal("12", 8)); - Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("2000", 8)); + Assertions.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("8", 8)); + Assertions.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("9", 8)); + Assertions.assertEquals("7", anyBaseToDecimal.convertToDecimal("7", 8)); + Assertions.assertEquals("8", anyBaseToDecimal.convertToDecimal("10", 8)); + Assertions.assertEquals("9", anyBaseToDecimal.convertToDecimal("11", 8)); + Assertions.assertEquals("10", anyBaseToDecimal.convertToDecimal("12", 8)); + Assertions.assertEquals("1024", anyBaseToDecimal.convertToDecimal("2000", 8)); - Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("A", 10)); - Assert.assertEquals("10", anyBaseToDecimal.convertToDecimal("10", 10)); - Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("1024", 10)); + Assertions.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("A", 10)); + Assertions.assertEquals("10", anyBaseToDecimal.convertToDecimal("10", 10)); + Assertions.assertEquals("1024", anyBaseToDecimal.convertToDecimal("1024", 10)); - Assert.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("G", 16)); - Assert.assertEquals("16", anyBaseToDecimal.convertToDecimal("10", 16)); - Assert.assertEquals("17", anyBaseToDecimal.convertToDecimal("11", 16)); - Assert.assertEquals("100", anyBaseToDecimal.convertToDecimal("64", 16)); - Assert.assertEquals("225", anyBaseToDecimal.convertToDecimal("E1", 16)); - Assert.assertEquals("1024", anyBaseToDecimal.convertToDecimal("400", 16)); - } + Assertions.assertEquals("Invalid Number", anyBaseToDecimal.convertToDecimal("G", 16)); + Assertions.assertEquals("16", anyBaseToDecimal.convertToDecimal("10", 16)); + Assertions.assertEquals("17", anyBaseToDecimal.convertToDecimal("11", 16)); + Assertions.assertEquals("100", anyBaseToDecimal.convertToDecimal("64", 16)); + Assertions.assertEquals("225", anyBaseToDecimal.convertToDecimal("E1", 16)); + Assertions.assertEquals("1024", anyBaseToDecimal.convertToDecimal("400", 16)); + } } diff --git a/src/test/java/com/conversions/BinaryToGrayTest.java b/src/test/java/com/conversions/BinaryToGrayTest.java index 64de892..55b7a3d 100644 --- a/src/test/java/com/conversions/BinaryToGrayTest.java +++ b/src/test/java/com/conversions/BinaryToGrayTest.java @@ -1,17 +1,15 @@ -package src.test.java.com.conversions; +package com.conversions; -import src.main.java.com.conversions.BinaryToGray; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; - -public class BinaryToGrayTest { +class BinaryToGrayTest { @Test - public void testBinaryToGray() { + void testBinaryToGray() { BinaryToGray binaryToGray = new BinaryToGray(); - assertEquals("1101", binaryToGray.binaryToGray("1001")); - assertEquals("11010011101", binaryToGray.binaryToGray("10011101001")); + Assertions.assertEquals("1101", binaryToGray.binaryToGray("1001")); + Assertions.assertEquals("11010011101", binaryToGray.binaryToGray("10011101001")); } } diff --git a/src/test/java/com/conversions/BinaryToHexadecimalTest.java b/src/test/java/com/conversions/BinaryToHexadecimalTest.java index 801366c..008969b 100644 --- a/src/test/java/com/conversions/BinaryToHexadecimalTest.java +++ b/src/test/java/com/conversions/BinaryToHexadecimalTest.java @@ -1,16 +1,15 @@ -package src.test.java.com.conversions; +package com.conversions; -import org.junit.Test; -import src.main.java.com.conversions.BinaryToHexadecimal; -import org.junit.Assert; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class BinaryToHexadecimalTest { +class BinaryToHexadecimalTest { @Test - public void testBinaryToHexadecimal(){ + void testBinaryToHexadecimal() { BinaryToHexadecimal binaryToHexadecimal = new BinaryToHexadecimal(); - Assert.assertEquals("Incorrect Conversion", "2A", binaryToHexadecimal.binToHex("101010")); - Assert.assertEquals("Incorrect Conversion", "24", binaryToHexadecimal.binToHex("100100")); - Assert.assertEquals("Incorrect Conversion", "AAAAAAAAAAAAAAAAAA1", binaryToHexadecimal.binToHex("1010101010101010101010101010101010101010101010101010101010101010101010100001")); + Assertions.assertEquals("2A", binaryToHexadecimal.binToHex("101010"), "Incorrect Conversion"); + Assertions.assertEquals("24", binaryToHexadecimal.binToHex("100100"), "Incorrect Conversion"); + Assertions.assertEquals("AAAAAAAAAAAAAAAAAA1", binaryToHexadecimal.binToHex("1010101010101010101010101010101010101010101010101010101010101010101010100001"), "Incorrect Conversion"); } } diff --git a/src/test/java/com/conversions/DecimalToAnyBaseTest.java b/src/test/java/com/conversions/DecimalToAnyBaseTest.java index f6166a6..b8a5eb6 100644 --- a/src/test/java/com/conversions/DecimalToAnyBaseTest.java +++ b/src/test/java/com/conversions/DecimalToAnyBaseTest.java @@ -1,16 +1,14 @@ -package src.test.java.com.conversions; +package com.conversions; -import src.main.java.com.conversions.DecimalToAnyBase; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import static junit.framework.Assert.assertEquals; - -public class DecimalToAnyBaseTest { +class DecimalToAnyBaseTest { @Test - public void testDecimalToAnyBase() { + void testDecimalToAnyBase() { DecimalToAnyBase decimalToAnyBase = new DecimalToAnyBase(); - assertEquals("Incorrect Conversion", "100", decimalToAnyBase.convertToAnyBase(4, 2)); - assertEquals("Incorrect Conversion", "11", decimalToAnyBase.convertToAnyBase(4, 3)); + Assertions.assertEquals("100", decimalToAnyBase.convertToAnyBase(4, 2), "Incorrect Conversion"); + Assertions.assertEquals("11", decimalToAnyBase.convertToAnyBase(4, 3), "Incorrect Conversion"); } } diff --git a/src/test/java/com/conversions/DecimalToHexadecimalTest.java b/src/test/java/com/conversions/DecimalToHexadecimalTest.java index 765acb8..f5a45b6 100644 --- a/src/test/java/com/conversions/DecimalToHexadecimalTest.java +++ b/src/test/java/com/conversions/DecimalToHexadecimalTest.java @@ -1,18 +1,17 @@ -package src.test.java.com.conversions; +package com.conversions; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.conversions.DecimalToHexadecimal; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class DecimalToHexadecimalTest { +class DecimalToHexadecimalTest { @Test - public void testDecimalToHexadecimalTest() { + void testDecimalToHexadecimalTest() { DecimalToHexadecimal decimalToHexadecimal = new DecimalToHexadecimal(); - Assert.assertEquals("Incorrect Conversion", "F", decimalToHexadecimal.decimalToHex("15")); - Assert.assertEquals("Incorrect Conversion", "121", decimalToHexadecimal.decimalToHex("289")); - Assert.assertEquals("Incorrect Conversion", "AAAAAAAAAAAAAAAAAA1", decimalToHexadecimal.decimalToHex("50371909150609548946081")); - Assert.assertEquals("Incorrect Conversion", "A", decimalToHexadecimal.decimalToHex("10")); - Assert.assertEquals("Incorrect Conversion", "8B2F", decimalToHexadecimal.decimalToHex("35631")); + Assertions.assertEquals("F", decimalToHexadecimal.decimalToHex("15"), "Incorrect Conversion"); + Assertions.assertEquals("121", decimalToHexadecimal.decimalToHex("289"), "Incorrect Conversion"); + Assertions.assertEquals("AAAAAAAAAAAAAAAAAA1", decimalToHexadecimal.decimalToHex("50371909150609548946081"), "Incorrect Conversion"); + Assertions.assertEquals("A", decimalToHexadecimal.decimalToHex("10"), "Incorrect Conversion"); + Assertions.assertEquals("8B2F", decimalToHexadecimal.decimalToHex("35631"), "Incorrect Conversion"); } } diff --git a/src/test/java/com/conversions/DecimalToOctalTest.java b/src/test/java/com/conversions/DecimalToOctalTest.java index 74a1094..c954169 100644 --- a/src/test/java/com/conversions/DecimalToOctalTest.java +++ b/src/test/java/com/conversions/DecimalToOctalTest.java @@ -1,17 +1,16 @@ -package src.test.java.com.conversions; +package com.conversions; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.conversions.DecimalToOctal; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class DecimalToOctalTest { +class DecimalToOctalTest { @Test - public void testDecimalToOctalTest() { + void testDecimalToOctalTest() { DecimalToOctal decimalToOctal = new DecimalToOctal(); - Assert.assertEquals("Incorrect Conversion", "41", decimalToOctal.decimalToOctal("33")); - Assert.assertEquals("Incorrect Conversion", "5512", decimalToOctal.decimalToOctal("2890")); - Assert.assertEquals("Incorrect Conversion", "12525252525252525252525241", decimalToOctal.decimalToOctal("50371909150609548946081")); - Assert.assertEquals("Incorrect Conversion", "13", decimalToOctal.decimalToOctal("11")); - Assert.assertEquals("Incorrect Conversion", "46703754", decimalToOctal.decimalToOctal("10192876")); + Assertions.assertEquals("41", decimalToOctal.decimalToOctal("33"), "Incorrect Conversion"); + Assertions.assertEquals("5512", decimalToOctal.decimalToOctal("2890"), "Incorrect Conversion"); + Assertions.assertEquals("12525252525252525252525241", decimalToOctal.decimalToOctal("50371909150609548946081"), "Incorrect Conversion"); + Assertions.assertEquals("13", decimalToOctal.decimalToOctal("11"), "Incorrect Conversion"); + Assertions.assertEquals("46703754", decimalToOctal.decimalToOctal("10192876"), "Incorrect Conversion"); } } diff --git a/src/test/java/com/crypto/codec/Base64Test.java b/src/test/java/com/crypto/codec/Base64Test.java index dcda19a..3b9dcda 100644 --- a/src/test/java/com/crypto/codec/Base64Test.java +++ b/src/test/java/com/crypto/codec/Base64Test.java @@ -1,12 +1,9 @@ -package src.test.java.com.crypto.codec; +package com.crypto.codec; -import src.main.java.com.crypto.codec.Base64; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import static junit.framework.Assert.*; -import static org.junit.Assert.assertArrayEquals; - -public class Base64Test { +class Base64Test { /* * Test vectors are taken from: @@ -14,34 +11,34 @@ public class Base64Test { */ @Test - public void TestBase64Encode() { - assertEquals("", Base64.encode("".getBytes())); - assertEquals("Zg==", Base64.encode("f".getBytes())); - assertEquals("Zm8=", Base64.encode("fo".getBytes())); - assertEquals("Zm9v", Base64.encode("foo".getBytes())); - assertEquals("Zm9vYg==", Base64.encode("foob".getBytes())); - assertEquals("Zm9vYmE=", Base64.encode("fooba".getBytes())); - assertEquals("Zm9vYmFy", Base64.encode("foobar".getBytes())); + void TestBase64Encode() { + Assertions.assertEquals("", Base64.encode("".getBytes())); + Assertions.assertEquals("Zg==", Base64.encode("f".getBytes())); + Assertions.assertEquals("Zm8=", Base64.encode("fo".getBytes())); + Assertions.assertEquals("Zm9v", Base64.encode("foo".getBytes())); + Assertions.assertEquals("Zm9vYg==", Base64.encode("foob".getBytes())); + Assertions.assertEquals("Zm9vYmE=", Base64.encode("fooba".getBytes())); + Assertions.assertEquals("Zm9vYmFy", Base64.encode("foobar".getBytes())); } @Test - public void TestBase64Decode() { - assertArrayEquals("".getBytes(), Base64.decode("")); - assertArrayEquals("f".getBytes(), Base64.decode("Zg==")); - assertArrayEquals("fo".getBytes(), Base64.decode("Zm8=")); - assertArrayEquals("foo".getBytes(), Base64.decode("Zm9v")); - assertArrayEquals("foob".getBytes(), Base64.decode("Zm9vYg==")); - assertArrayEquals("fooba".getBytes(), Base64.decode("Zm9vYmE=")); - assertArrayEquals("foobar".getBytes(), Base64.decode("Zm9vYmFy")); + void TestBase64Decode() { + Assertions.assertArrayEquals("".getBytes(), Base64.decode("")); + Assertions.assertArrayEquals("f".getBytes(), Base64.decode("Zg==")); + Assertions.assertArrayEquals("fo".getBytes(), Base64.decode("Zm8=")); + Assertions.assertArrayEquals("foo".getBytes(), Base64.decode("Zm9v")); + Assertions.assertArrayEquals("foob".getBytes(), Base64.decode("Zm9vYg==")); + Assertions.assertArrayEquals("fooba".getBytes(), Base64.decode("Zm9vYmE=")); + Assertions.assertArrayEquals("foobar".getBytes(), Base64.decode("Zm9vYmFy")); } - @Test(expected = IllegalArgumentException.class) - public void testInvalidBase64String() { - Base64.decode("Z/+v&mF="); + @Test + void testInvalidBase64String() { + Assertions.assertThrows(IllegalArgumentException.class, () -> Base64.decode("Z/+v&mF=")); } - @Test(expected = IllegalArgumentException.class) - public void testInvalidLengthOfBase64String() { - Base64.decode("Zm9v" + "YmFy" + "d"); + @Test + void testInvalidLengthOfBase64String() { + Assertions.assertThrows(IllegalArgumentException.class, () -> Base64.decode("Zm9v" + "YmFy" + "d")); } } diff --git a/src/test/java/com/crypto/hash/Sha2Test.java b/src/test/java/com/crypto/hash/Sha2Test.java index d684587..619ad43 100644 --- a/src/test/java/com/crypto/hash/Sha2Test.java +++ b/src/test/java/com/crypto/hash/Sha2Test.java @@ -1,12 +1,10 @@ -package src.test.java.com.crypto.hash; +package com.crypto.hash; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import src.main.java.com.crypto.hash.Sha2; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; - -public class Sha2Test { +class Sha2Test { /** * The following test vectors for the SHA-2 family are taken from: @@ -14,8 +12,8 @@ public class Sha2Test { */ private static byte[][] vector; - @BeforeClass - public static void setUpClass() { + @BeforeAll + static void setUpClass() { System.out.println("@BeforeClass setUpClass"); StringBuilder builder = new StringBuilder(); @@ -33,131 +31,131 @@ public static void setUpClass() { } @Test - public void TestSha224Vector1() { + void TestSha224Vector1() { String digest = "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[0])); + Assertions.assertEquals(digest, Sha2.SHA224(vector[0]), "message digests are not equal"); } @Test - public void TestSha224Vector2() { + void TestSha224Vector2() { String digest = "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[1])); + Assertions.assertEquals(digest, Sha2.SHA224(vector[1]), "message digests are not equal"); } @Test - public void TestSha224Vector3() { + void TestSha224Vector3() { String digest = "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[2])); + Assertions.assertEquals(digest, Sha2.SHA224(vector[2]), "message digests are not equal"); } @Test - public void TestSha224Vector4() { + void TestSha224Vector4() { String digest = "c97ca9a559850ce97a04a96def6d99a9e0e0e2ab14e6b8df265fc0b3"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[3])); + Assertions.assertEquals(digest, Sha2.SHA224(vector[3]), "message digests are not equal"); } @Test - public void TestSha224Vector5() { + void TestSha224Vector5() { String digest = "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA224(vector[4])); + Assertions.assertEquals(digest, Sha2.SHA224(vector[4]), "message digests are not equal"); } @Test - public void TestSha256Vector1() { + void TestSha256Vector1() { String digest = "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[0])); + Assertions.assertEquals(digest, Sha2.SHA256(vector[0]), "message digests are not equal"); } @Test - public void TestSha256Vector2() { + void TestSha256Vector2() { String digest = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[1])); + Assertions.assertEquals(digest, Sha2.SHA256(vector[1]), "message digests are not equal"); } @Test - public void TestSha256Vector3() { + void TestSha256Vector3() { String digest = "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[2])); + Assertions.assertEquals(digest, Sha2.SHA256(vector[2]), "message digests are not equal"); } @Test - public void TestSha256Vector4() { + void TestSha256Vector4() { String digest = "cf5b16a778af8380036ce59e7b0492370b249b11e8f07a51afac45037afee9d1"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[3])); + Assertions.assertEquals(digest, Sha2.SHA256(vector[3]), "message digests are not equal"); } @Test - public void TestSha256Vector5() { + void TestSha256Vector5() { String digest = "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA256(vector[4])); + Assertions.assertEquals(digest, Sha2.SHA256(vector[4]), "message digests are not equal"); } @Test - public void TestSha384Vector1() { + void TestSha384Vector1() { String digest = "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[0])); + Assertions.assertEquals(digest, Sha2.SHA384(vector[0]), "message digests are not equal"); } @Test - public void TestSha384Vector2() { + void TestSha384Vector2() { String digest = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[1])); + Assertions.assertEquals(digest, Sha2.SHA384(vector[1]), "message digests are not equal"); } @Test - public void TestSha384Vector3() { + void TestSha384Vector3() { String digest = "3391fdddfc8dc7393707a65b1b4709397cf8b1d162af05abfe8f450de5f36bc6b0455a8520bc4e6f5fe95b1fe3c8452b"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[2])); + Assertions.assertEquals(digest, Sha2.SHA384(vector[2]), "message digests are not equal"); } @Test - public void TestSha384Vector4() { + void TestSha384Vector4() { String digest = "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[3])); + Assertions.assertEquals(digest, Sha2.SHA384(vector[3]), "message digests are not equal"); } @Test - public void TestSha384Vector5() { + void TestSha384Vector5() { String digest = "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA384(vector[4])); + Assertions.assertEquals(digest, Sha2.SHA384(vector[4]), "message digests are not equal"); } @Test - public void TestSha512Vector1() { + void TestSha512Vector1() { String digest = "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[0])); + Assertions.assertEquals(digest, Sha2.SHA512(vector[0]), "message digests are not equal"); } @Test - public void TestSha512Vector2() { + void TestSha512Vector2() { String digest = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[1])); + Assertions.assertEquals(digest, Sha2.SHA512(vector[1]), "message digests are not equal"); } @Test - public void TestSha512Vector3() { + void TestSha512Vector3() { String digest = "204a8fc6dda82f0a0ced7beb8e08a41657c16ef468b228a8279be331a703c33596fd15c13b1b07f9aa1d3bea57789ca031ad85c7a71dd70354ec631238ca3445"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[2])); + Assertions.assertEquals(digest, Sha2.SHA512(vector[2]), "message digests are not equal"); } @Test - public void TestSha512Vector4() { + void TestSha512Vector4() { String digest = "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[3])); + Assertions.assertEquals(digest, Sha2.SHA512(vector[3]), "message digests are not equal"); } @Test - public void TestSha512Vector5() { + void TestSha512Vector5() { String digest = "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b"; - Assert.assertEquals("message digests are not equal", digest, Sha2.SHA512(vector[4])); + Assertions.assertEquals(digest, Sha2.SHA512(vector[4]), "message digests are not equal"); } @Test - public void TestInputByteArrayNotAltered() { + void TestInputByteArrayNotAltered() { byte[] array = vector[2]; Sha2.SHA224(array); - Assert.assertEquals("user vector altered", array, vector[2]); + Assertions.assertEquals(array, vector[2], "user vector altered"); } } diff --git a/src/test/java/com/dataStructures/BinaryTreeTest.java b/src/test/java/com/dataStructures/BinaryTreeTest.java index 383bc0a..1fcfeb7 100644 --- a/src/test/java/com/dataStructures/BinaryTreeTest.java +++ b/src/test/java/com/dataStructures/BinaryTreeTest.java @@ -1,20 +1,18 @@ -package src.test.java.com.dataStructures; +package com.dataStructures; -import org.junit.Test; -import src.main.java.com.dataStructures.BinaryTree; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; +class BinaryTreeTest { -public class BinaryTreeTest { - - public BinaryTreeTest() { + BinaryTreeTest() { } /** * Test of insert method, of class BinaryTree. */ @Test - public void testInsertBinaryTree() { + void testInsertBinaryTree() { System.out.println("insert"); BinaryTree lowerData = new BinaryTree<>("1"); BinaryTree upperData = new BinaryTree<>("3"); @@ -24,28 +22,28 @@ public void testInsertBinaryTree() { String proof = instance.getLeft().toString() + instance.toString() + instance.getRight().toString(); - assertEquals("123", proof); + Assertions.assertEquals("123", proof); } /** * Test of search method, of class BinaryTree. */ @Test - public void testSearch() { + void testSearch() { System.out.println("search"); BinaryTree instance = new BinaryTree<>(5); for (int i = 1; i < 10; i++) { instance.insert(i); } BinaryTree result = instance.search(1); - assertEquals(1, result.getData()); + Assertions.assertEquals(1, result.getData()); } /** * Test of contains method, of class BinaryTree. */ @Test - public void testContains() { + void testContains() { System.out.println("contains"); BinaryTree instance = new BinaryTree<>(5); for (int i = 1; i < 10; i++) { @@ -53,6 +51,6 @@ public void testContains() { } boolean result = instance.contains(2) && instance.contains(11); - assertFalse(result); + Assertions.assertFalse(result); } } diff --git a/src/test/java/com/dataStructures/DisjointSetTest.java b/src/test/java/com/dataStructures/DisjointSetTest.java index 5f13190..d85871a 100644 --- a/src/test/java/com/dataStructures/DisjointSetTest.java +++ b/src/test/java/com/dataStructures/DisjointSetTest.java @@ -1,13 +1,11 @@ -package src.test.java.com.dataStructures; +package com.dataStructures; -import org.junit.Test; -import src.main.java.com.dataStructures.DisjointSet; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.*; - -public class DisjointSetTest { +class DisjointSetTest { @Test - public void test() { + void test() { DisjointSet set = new DisjointSet<>(); set.makeSet("flink"); @@ -18,17 +16,17 @@ public void test() { set.union("java", "c++"); - assertTrue(set.isConnected("java", "c++")); - assertFalse(set.isConnected("java", "py")); + Assertions.assertTrue(set.isConnected("java", "c++")); + Assertions.assertFalse(set.isConnected("java", "py")); set.union("c++", "py"); - assertTrue(set.isConnected("java", "py")); + Assertions.assertTrue(set.isConnected("java", "py")); set.makeSet("lisp"); set.union("lisp", "py"); - assertTrue(set.isConnected("c++", "lisp")); + Assertions.assertTrue(set.isConnected("c++", "lisp")); set.show(); } -} \ No newline at end of file +} diff --git a/src/test/java/com/dataStructures/GeneralQueueTest.java b/src/test/java/com/dataStructures/GeneralQueueTest.java index 4bb07a3..3c4c3a7 100644 --- a/src/test/java/com/dataStructures/GeneralQueueTest.java +++ b/src/test/java/com/dataStructures/GeneralQueueTest.java @@ -1,15 +1,14 @@ -package src.test.java.com.dataStructures; +package com.dataStructures; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.dataStructures.GeneralQueue; -import src.main.java.com.types.Queue; +import com.types.Queue; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class GeneralQueueTest { +class GeneralQueueTest { @Test - public void testGeneralQueue() { + void testGeneralQueue() { Queue myQueue = new GeneralQueue<>(); myQueue.add(10); @@ -19,27 +18,27 @@ public void testGeneralQueue() { myQueue.add(50); - Object[] myArray = myQueue.toArray(); - Assert.assertEquals(myArray.length, myQueue.size()); + Object[] myArray = myQueue.toArray(); + Assertions.assertEquals(myArray.length, myQueue.size()); myQueue.remove(20); - Assert.assertEquals(myQueue.size(), 4); + Assertions.assertEquals(myQueue.size(), 4); Boolean isEmpty = myQueue.isEmpty(); - Assert.assertEquals(Boolean.valueOf("false"), Boolean.valueOf(isEmpty)); + Assertions.assertEquals(Boolean.valueOf("false"), isEmpty); myQueue.offer(60); - Assert.assertEquals(5, myQueue.size()); + Assertions.assertEquals(5, myQueue.size()); int polledElement = myQueue.poll(); - Assert.assertEquals(10, polledElement); + Assertions.assertEquals(10, polledElement); int element = myQueue.element(); - Assert.assertEquals(30, element); + Assertions.assertEquals(30, element); myQueue.poll(); int peekedElement = myQueue.peek(); - Assert.assertEquals(40, peekedElement); + Assertions.assertEquals(40, peekedElement); } } diff --git a/src/test/java/com/dataStructures/StackTest.java b/src/test/java/com/dataStructures/StackTest.java index 3cbbc86..6bf4868 100644 --- a/src/test/java/com/dataStructures/StackTest.java +++ b/src/test/java/com/dataStructures/StackTest.java @@ -1,34 +1,34 @@ -package src.test.java.com.dataStructures; +package com.dataStructures; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.dataStructures.Stack; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import java.util.EmptyStackException; -public class StackTest { +class StackTest { @Test - public void testEmpty() { + void testEmpty() { Stack myStack = new Stack<>(); boolean isEmpty = myStack.empty(); - Assert.assertTrue(isEmpty); + Assertions.assertTrue(isEmpty); myStack.push(10); isEmpty = myStack.empty(); - Assert.assertFalse(isEmpty); + Assertions.assertFalse(isEmpty); } - @Test(expected = EmptyStackException.class) - public void testPeekWithoutElements() { - - Stack myStack = new Stack<>(); - myStack.peek(); + @Test + void testPeekWithoutElements() { + Assertions.assertThrows(EmptyStackException.class, () -> { + Stack myStack = new Stack<>(); + myStack.peek(); + }); } @Test - public void testPeekWithElements() { + void testPeekWithElements() { Stack myStack = new Stack<>(); myStack.push(10); @@ -36,19 +36,19 @@ public void testPeekWithElements() { myStack.push(30); myStack.push(40); - Assert.assertEquals(40, myStack.peek()); + Assertions.assertEquals(40, myStack.peek()); } - @Test(expected = EmptyStackException.class) - public void testPopWithoutElements() { - - Stack myStack = new Stack<>(); - myStack.pop(); - + @Test + void testPopWithoutElements() { + Assertions.assertThrows(EmptyStackException.class, () -> { + Stack myStack = new Stack<>(); + myStack.pop(); + }); } @Test - public void testPopWithElements() { + void testPopWithElements() { Stack myStack = new Stack<>(); myStack.push(10); @@ -57,12 +57,12 @@ public void testPopWithElements() { myStack.push(40); myStack.push(50); - Assert.assertEquals(50, myStack.pop()); + Assertions.assertEquals(50, myStack.pop()); } @Test - public void testPushWithinInitialCapacity() { + void testPushWithinInitialCapacity() { Stack myStack = new Stack<>(); myStack.push(10); @@ -75,11 +75,11 @@ public void testPushWithinInitialCapacity() { myStack.push(80); myStack.push(90); myStack.push(100); - Assert.assertEquals(10, myStack.size()); + Assertions.assertEquals(10, myStack.size()); } @Test - public void testPushOutsideInitialCapacity() { + void testPushOutsideInitialCapacity() { Stack myStack = new Stack<>(); myStack.push(10); @@ -93,27 +93,27 @@ public void testPushOutsideInitialCapacity() { myStack.push(90); myStack.push(100); myStack.push(110); - Assert.assertEquals(11, myStack.size()); + Assertions.assertEquals(11, myStack.size()); } @Test - public void testSearchWithObjectUnavailable() { + void testSearchWithObjectUnavailable() { Stack myStack = new Stack<>(); myStack.push(10); myStack.push(20); myStack.push(30); - Assert.assertEquals(-1,myStack.search(50)); + Assertions.assertEquals(-1, myStack.search(50)); } @Test - public void testSearchWithObjectAvailable() { + void testSearchWithObjectAvailable() { Stack myStack = new Stack<>(); myStack.push(10); myStack.push(20); myStack.push(30); - Assert.assertEquals(3,myStack.search(10)); + Assertions.assertEquals(3, myStack.search(10)); } } diff --git a/src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java b/src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java index 96e4e34..d04cb21 100644 --- a/src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java +++ b/src/test/java/com/designpatterns/creational/abstractfactory/AbstractShapeFactoryTest.java @@ -1,12 +1,11 @@ -package src.test.java.com.designpatterns.creational.abstractfactory; +package com.designpatterns.creational.abstractfactory; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.designpatterns.creational.abstractfactory.*; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class AbstractShapeFactoryTest { +class AbstractShapeFactoryTest { @Test - public void testAbstractShapeFactory() { + void testAbstractShapeFactory() { String failReason = ""; // Tests for 2-D shape factory // Test for Line @@ -40,7 +39,7 @@ public void testAbstractShapeFactory() { failReason += "Surface area of Sphere is incorrect!.\n"; } - Assert.assertEquals(failReason, "", failReason); + Assertions.assertEquals(failReason, "", failReason); } } diff --git a/src/test/java/com/designpatterns/creational/builder/DesktopBuilderTest.java b/src/test/java/com/designpatterns/creational/builder/DesktopBuilderTest.java index 2f8e4ce..8178083 100644 --- a/src/test/java/com/designpatterns/creational/builder/DesktopBuilderTest.java +++ b/src/test/java/com/designpatterns/creational/builder/DesktopBuilderTest.java @@ -1,24 +1,23 @@ -package src.test.java.com.designpatterns.creational.builder; +package com.designpatterns.creational.builder; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.designpatterns.creational.builder.Desktop; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class DesktopBuilderTest { +class DesktopBuilderTest { private final String configOne = "Desktop{CPU='Intel i7', RAM='Corsair Vengeance 3000', isGraphicCardEnabled=true" + ", operatingSystem='Windows 10', diskSizeGB=16, graphicCard='NVIDIA GTX 1080'}"; private final String configTwo = "Desktop{CPU='Intel i5', RAM='HyperX Fury v5', isGraphicCardEnabled=true, " + "operatingSystem='Red Hat Enterprise', diskSizeGB=16, graphicCard='NVIDIA RTX 2080'}"; @Test - public void testDesktopBuilder() { + void testDesktopBuilder() { Desktop d1 = new Desktop.DesktopBuilder("Intel i7", "Corsair Vengeance 3000") .setDiskSizeGB(16) .setGraphicCard("NVIDIA GTX 1080") .setGraphicCardEnabled(true) .setOperatingSystem("Windows 10") .build(); - Assert.assertEquals(d1.toString(), configOne); + Assertions.assertEquals(d1.toString(), configOne); Desktop d2 = new Desktop.DesktopBuilder("Intel i5", "HyperX Fury v5") .setDiskSizeGB(16) @@ -26,7 +25,7 @@ public void testDesktopBuilder() { .setGraphicCardEnabled(true) .setOperatingSystem("Red Hat Enterprise") .build(); - Assert.assertEquals(d2.toString(), configTwo); + Assertions.assertEquals(d2.toString(), configTwo); } } diff --git a/src/test/java/com/designpatterns/creational/factory/PolygonFactoryTest.java b/src/test/java/com/designpatterns/creational/factory/PolygonFactoryTest.java index d8ea659..b917fd7 100644 --- a/src/test/java/com/designpatterns/creational/factory/PolygonFactoryTest.java +++ b/src/test/java/com/designpatterns/creational/factory/PolygonFactoryTest.java @@ -1,13 +1,11 @@ -package src.test.java.com.designpatterns.creational.factory; +package com.designpatterns.creational.factory; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.designpatterns.creational.factory.Polygon; -import src.main.java.com.designpatterns.creational.factory.PolygonFactory; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class PolygonFactoryTest { +class PolygonFactoryTest { @Test - public void testPolygonFactory() { + void testPolygonFactory() { String failReason = ""; PolygonFactory polFactory = new PolygonFactory(); @@ -40,6 +38,6 @@ public void testPolygonFactory() { failReason += "Pentagon area is incorrect!"; } - Assert.assertEquals(failReason, failReason, ""); + Assertions.assertEquals(failReason, failReason, ""); } } diff --git a/src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java b/src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java index e1a2c7a..5cb0a8f 100644 --- a/src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java +++ b/src/test/java/com/designpatterns/creational/prototype/PrototypeTest.java @@ -1,12 +1,11 @@ -package src.test.java.com.designpatterns.creational.prototype; +package com.designpatterns.creational.prototype; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.designpatterns.creational.prototype.ColorStore; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class PrototypeTest { +class PrototypeTest { @Test - public void testPrototype() { + void testPrototype() { String testFailReason = ""; String testOne = ColorStore.getColor("blue").addColor(); if (!"Blue color added".equals(testOne)) { @@ -24,6 +23,6 @@ public void testPrototype() { if (!"Blue color added".equals(testFour)) { testFailReason += "TC 4 Failed: Blue couldn't be added\n"; } - Assert.assertEquals(testFailReason, "", testFailReason); + Assertions.assertEquals(testFailReason, "", testFailReason); } } diff --git a/src/test/java/com/designpatterns/creational/singleton/SingletonTest.java b/src/test/java/com/designpatterns/creational/singleton/SingletonTest.java index 8374494..c874805 100644 --- a/src/test/java/com/designpatterns/creational/singleton/SingletonTest.java +++ b/src/test/java/com/designpatterns/creational/singleton/SingletonTest.java @@ -1,19 +1,18 @@ -package src.test.java.com.designpatterns.creational.singleton; +package com.designpatterns.creational.singleton; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.designpatterns.creational.singleton.Singleton; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; -public class SingletonTest { +class SingletonTest { private static volatile ArrayList hashCodeList = new ArrayList<>(); @Test - public void testSingleton() throws InterruptedException { + void testSingleton() throws InterruptedException { boolean testFailed = false; ExecutorService es = Executors.newCachedThreadPool(); // Creates 15 threads and makes all of them access the Singleton class @@ -38,7 +37,7 @@ public void testSingleton() throws InterruptedException { testFailed = true; } } - Assert.assertFalse(testFailed); + Assertions.assertFalse(testFailed); } } } diff --git a/src/test/java/com/designpatterns/structural/adapter/MovableAdapterTest.java b/src/test/java/com/designpatterns/structural/adapter/MovableAdapterTest.java index 17ff9e4..bca94e5 100644 --- a/src/test/java/com/designpatterns/structural/adapter/MovableAdapterTest.java +++ b/src/test/java/com/designpatterns/structural/adapter/MovableAdapterTest.java @@ -1,18 +1,13 @@ -package src.test.java.com.designpatterns.structural.adapter; +package com.designpatterns.structural.adapter; -import org.junit.Test; -import src.main.java.com.designpatterns.structural.adapter.BugattiVeyron; -import src.main.java.com.designpatterns.structural.adapter.Movable; -import src.main.java.com.designpatterns.structural.adapter.MovableAdapter; -import src.main.java.com.designpatterns.structural.adapter.MovableAdapterImpl; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import static org.junit.Assert.assertEquals; - -public class MovableAdapterTest { +class MovableAdapterTest { @Test - public void testMovableAdapter() { + void testMovableAdapter() { Movable bugattiVeyron = new BugattiVeyron(); MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron); - assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001); + Assertions.assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001); } } diff --git a/src/test/java/com/generation/SimplexNoiseTest.java b/src/test/java/com/generation/SimplexNoiseTest.java index 336289d..1a3aced 100644 --- a/src/test/java/com/generation/SimplexNoiseTest.java +++ b/src/test/java/com/generation/SimplexNoiseTest.java @@ -1,24 +1,24 @@ -package src.test.java.com.generation; +package com.generation; -import java.awt.Color; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import javax.imageio.ImageIO; +import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; -import javax.imageio.ImageIO; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.generation.SimplexNoise; -public class SimplexNoiseTest { +class SimplexNoiseTest { @Test - public void testGenerateHeightMap() { + void testGenerateHeightMap() { final int WIDTH = 256; final int HEIGHT = 256; final int X = 0; final int Y = 0; - final String RESOURCE_NAME = "src/test/java/com/generation/expected-result.png"; + final String RESOURCE_NAME = "com/generation/expected-result.png"; float[][] heightmap = new SimplexNoise(50, 0.3F, 1111111111111111L).generateHeightMap(X, Y, WIDTH, HEIGHT); BufferedImage image = null; @@ -27,18 +27,17 @@ public void testGenerateHeightMap() { image = ImageIO.read(in); - Assert.assertEquals(WIDTH, image.getWidth()); - Assert.assertEquals(HEIGHT, image.getHeight()); + Assertions.assertEquals(WIDTH, image.getWidth()); + Assertions.assertEquals(HEIGHT, image.getHeight()); } catch (IOException | IllegalArgumentException exception) { - Assert.fail(exception.toString()); + Assertions.fail(exception.toString()); } for (int x = 0; x < WIDTH; x++) { for (int y = 0; y < HEIGHT; y++) { - - Assert.assertEquals(new Color(image.getRGB(x, y)).getRed(), (int) (heightmap[x][y] * 255)); + Assertions.assertEquals(new Color(image.getRGB(x, y)).getRed(), (int) (heightmap[x][y] * 255)); } } } diff --git a/src/test/java/com/matchings/stableMatching/GaleShapleyTest.java b/src/test/java/com/matchings/stableMatching/GaleShapleyTest.java index 2e7d204..d23db53 100644 --- a/src/test/java/com/matchings/stableMatching/GaleShapleyTest.java +++ b/src/test/java/com/matchings/stableMatching/GaleShapleyTest.java @@ -1,16 +1,14 @@ -package src.test.java.com.matchings.stableMatching; +package com.matchings.stableMatching; -import src.main.java.com.matchings.stableMatching.GaleShapley; -import org.junit.Test; - -import static junit.framework.Assert.assertEquals; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.Random; -import java.util.Collections; // for shuffling -import java.util.ArrayList; // for shuffling -import java.util.List; // for shuffling -public class GaleShapleyTest { +class GaleShapleyTest { /** * Test a number of GaleShapley executions on pseudo-random instances of the @@ -18,7 +16,7 @@ public class GaleShapleyTest { */ @Test - public void testGaleShapley() { + void testGaleShapley() { GaleShapley galeShapley = new GaleShapley(); int N = 10; int[][] menPrefs; @@ -37,11 +35,11 @@ public void testGaleShapley() { womenPrefs[i][j] = j; } shuffleArray(menPrefs[i], i); - shuffleArray(womenPrefs[i], n+i); + shuffleArray(womenPrefs[i], n + i); } // Now we have pseudo-random preferences for each man and each woman. GaleShapleyMenMatching = galeShapley.GaleShapleyStableMarriage(menPrefs, womenPrefs); - assertEquals("Unstable matching", true, isStable(GaleShapleyMenMatching, menPrefs, womenPrefs)); + Assertions.assertTrue(isStable(GaleShapleyMenMatching, menPrefs, womenPrefs), "Unstable matching"); } } @@ -49,14 +47,14 @@ public void testGaleShapley() { * Determine if the proposed menMatching is stable, i.e. if there is no * potential couple in which both members would strictly prefer being with each * other than being with their current partner. - * + * * @param menMatching * @param menPrefs * @param womenPrefs * @return whether menMatching is stable according to menPrefs and womenPrefs */ - public boolean isStable(int[] menMatching, int[][] menPrefs, int[][] womenPrefs) { + private boolean isStable(int[] menMatching, int[][] menPrefs, int[][] womenPrefs) { int n = menMatching.length; // reconstruct womenMatching (for each woman, the associated man): int[] womenMatching = new int[n]; @@ -107,12 +105,12 @@ public boolean isStable(int[] menMatching, int[][] menPrefs, int[][] womenPrefs) /** * Shuffle an array using Collections.shuffle - * + * * @param array array to be shuffled * @param seed fixed seed, for reproducibility */ - public void shuffleArray(int[] array, long seed) { + private void shuffleArray(int[] array, long seed) { List list = new ArrayList<>(); for (int i : array) { list.add(i); @@ -122,4 +120,4 @@ public void shuffleArray(int[] array, long seed) { array[i] = list.get(i); } } -} \ No newline at end of file +} diff --git a/src/test/java/com/others/FastPowerTest.java b/src/test/java/com/others/FastPowerTest.java index 5824dae..95b0b5b 100644 --- a/src/test/java/com/others/FastPowerTest.java +++ b/src/test/java/com/others/FastPowerTest.java @@ -1,26 +1,24 @@ -package src.test.java.com.others; +package com.others; -import org.junit.Test; -import src.main.java.com.others.FastPower; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import java.math.BigInteger; -import static org.junit.Assert.*; - -public class FastPowerTest { +class FastPowerTest { private void testLong(long n, long k, long m) { long result = FastPower.calculate(n, k, m); - assertEquals(result, BigInteger.valueOf(n).modPow(BigInteger.valueOf(k), BigInteger.valueOf(m)).longValue()); + Assertions.assertEquals(result, BigInteger.valueOf(n).modPow(BigInteger.valueOf(k), BigInteger.valueOf(m)).longValue()); } private void testBigInteger(BigInteger n, BigInteger k, BigInteger m) { BigInteger result = FastPower.calculate(n, k, m); - assertEquals(result, n.modPow(k, m)); + Assertions.assertEquals(result, n.modPow(k, m)); } @Test - public void test() { + void test() { testLong(2, 2, 10); testLong(100, 1000, 20); testLong(123456, 123456789, 234); diff --git a/src/test/java/com/search/BinarySearchTest.java b/src/test/java/com/search/BinarySearchTest.java index 0d46287..65d3ece 100644 --- a/src/test/java/com/search/BinarySearchTest.java +++ b/src/test/java/com/search/BinarySearchTest.java @@ -1,25 +1,24 @@ -package src.test.java.com.search; +package com.search; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.search.BinarySearch; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class BinarySearchTest { +class BinarySearchTest { @Test - public void testBinarySearch() { - Integer[] arr1 = {1,2,3,4,5}; - Assert.assertEquals("Incorrect index", 2, BinarySearch.findIndex(arr1,3)); - Assert.assertEquals("Incorrect index", 0, BinarySearch.findIndex(arr1,1)); - Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr1,8)); - Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr1,-2)); + void testBinarySearch() { + Integer[] arr1 = {1, 2, 3, 4, 5}; + Assertions.assertEquals(2, BinarySearch.findIndex(arr1, 3), "Incorrect index"); + Assertions.assertEquals(0, BinarySearch.findIndex(arr1, 1), "Incorrect index"); + Assertions.assertEquals(-1, BinarySearch.findIndex(arr1, 8), "Incorrect index"); + Assertions.assertEquals(-1, BinarySearch.findIndex(arr1, -2), "Incorrect index"); String[] arr2 = {"A", "B", "C", "D"}; - Assert.assertEquals("Incorrect index", 2, BinarySearch.findIndex(arr2,"C")); - Assert.assertEquals("Incorrect index", 1, BinarySearch.findIndex(arr2,"B")); - Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr2,"F")); + Assertions.assertEquals(2, BinarySearch.findIndex(arr2, "C"), "Incorrect index"); + Assertions.assertEquals(1, BinarySearch.findIndex(arr2, "B"), "Incorrect index"); + Assertions.assertEquals(-1, BinarySearch.findIndex(arr2, "F"), "Incorrect index"); String[] arr3 = {}; - Assert.assertEquals("Incorrect index", -1, BinarySearch.findIndex(arr3, "")); + Assertions.assertEquals(-1, BinarySearch.findIndex(arr3, ""), "Incorrect index"); } } diff --git a/src/test/java/com/search/BloomFilterTest.java b/src/test/java/com/search/BloomFilterTest.java index 0d12b91..dcbccab 100644 --- a/src/test/java/com/search/BloomFilterTest.java +++ b/src/test/java/com/search/BloomFilterTest.java @@ -1,18 +1,16 @@ -package src.test.java.com.search; +package com.search; -import org.junit.Test; -import src.main.java.com.search.BloomFilter; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; -import static org.junit.Assert.*; - -public class BloomFilterTest { +class BloomFilterTest { @Test - public void test() { + void test() { int count = 100000; int low = 50, up = 100; BloomFilter filter = BloomFilter.builder(10000).build(); @@ -36,15 +34,15 @@ public void test() { error++; } } else { - assertFalse(dataSet.contains(str)); + Assertions.assertFalse(dataSet.contains(str)); } } System.out.println("error: " + error); System.out.println("total: " + total); System.out.println("error rate : " + (double) error / total); } - - public static String randomString(int minLength, int maxLength) { + + private static String randomString(int minLength, int maxLength) { ThreadLocalRandom r = ThreadLocalRandom.current(); int chLen = r.nextInt(minLength, maxLength), poolSize = CHAR_POOL.length; @@ -66,5 +64,5 @@ public static String randomString(int minLength, int maxLength) { CHAR_POOL[i++] = (char) (c - 32); } } - -} \ No newline at end of file + +} diff --git a/src/test/java/com/search/ExponentialSearchTest.java b/src/test/java/com/search/ExponentialSearchTest.java index 1023e8e..847810e 100644 --- a/src/test/java/com/search/ExponentialSearchTest.java +++ b/src/test/java/com/search/ExponentialSearchTest.java @@ -1,31 +1,30 @@ -package src.test.java.com.search; +package com.search; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.search.ExponentialSearch; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class ExponentialSearchTest { +class ExponentialSearchTest { @Test - public void testExponentialSearch() { + void testExponentialSearch() { ExponentialSearch expSearch = new ExponentialSearch(); Integer[] arr = {11, 14, 23, 29, 36, 40, 42, 52}; int x = 36; int index = expSearch.findIndex(arr, x); - Assert.assertEquals("Incorrect index", 4, index); + Assertions.assertEquals(4, index, "Incorrect index"); Integer[] arrTwo = {-210, -190, -180, -160, -130, -120, -100}; x = -120; index = expSearch.findIndex(arrTwo, x); - Assert.assertEquals("Incorrect index", 5, index); + Assertions.assertEquals(5, index, "Incorrect index"); String[] arrString = {"101", "122", "136", "165", "225", "251", "291"}; String stringX = "122"; index = expSearch.findIndex(arrString, stringX); - Assert.assertEquals("Incorrect index", 1, index); + Assertions.assertEquals(1, index, "Incorrect index"); String[] arrThree = {}; - Assert.assertEquals("Incorrect index", -1, expSearch.findIndex(arrThree, "")); + Assertions.assertEquals(-1, expSearch.findIndex(arrThree, ""), "Incorrect index"); } } diff --git a/src/test/java/com/search/FibonacciSearchTest.java b/src/test/java/com/search/FibonacciSearchTest.java index 2adae9d..e0e27cb 100644 --- a/src/test/java/com/search/FibonacciSearchTest.java +++ b/src/test/java/com/search/FibonacciSearchTest.java @@ -1,30 +1,29 @@ -package src.test.java.com.search; +package com.search; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.search.FibonacciSearch; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class FibonacciSearchTest { +class FibonacciSearchTest { @Test - public void testFibonacciSearch() { + void testFibonacciSearch() { FibonacciSearch fibonacciSearch = new FibonacciSearch(); Integer[] arr = {11, 14, 23, 32, 36, 40, 54, 69}; int x = 54; int index = fibonacciSearch.findIndex(arr, x); - Assert.assertEquals("Incorrect index", 6, index); + Assertions.assertEquals(6, index, "Incorrect index"); Integer[] arrTwo = {-400, -283, -180, -160, -129, -120, -30}; x = -120; index = fibonacciSearch.findIndex(arrTwo, x); - Assert.assertEquals("Incorrect index", 5, index); + Assertions.assertEquals(5, index, "Incorrect index"); String[] arrString = {"101", "122", "136", "165", "225", "351", "458"}; String stringX = "136"; index = fibonacciSearch.findIndex(arrString, stringX); - Assert.assertEquals("Incorrect index", 2, index); + Assertions.assertEquals(2, index, "Incorrect index"); String[] arrThree = {}; - Assert.assertEquals("Incorrect index", -1, fibonacciSearch.findIndex(arrThree, "")); + Assertions.assertEquals(-1, fibonacciSearch.findIndex(arrThree, ""), "Incorrect index"); } } diff --git a/src/test/java/com/search/InterpolationSearchTest.java b/src/test/java/com/search/InterpolationSearchTest.java index c3a9831..ad15ff0 100644 --- a/src/test/java/com/search/InterpolationSearchTest.java +++ b/src/test/java/com/search/InterpolationSearchTest.java @@ -1,29 +1,27 @@ -package src.test.java.com.search; +package com.search; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import src.main.java.com.search.InterpolationSearch; +class InterpolationSearchTest { -public class InterpolationSearchTest { + @Test + void testInterpolationSearch() { + InterpolationSearch interpolationSearch = new InterpolationSearch(); - @Test - public void testInterpolationSearch() { - InterpolationSearch interpolationSearch = new InterpolationSearch(); - - Integer arr[] = {10, 12, 13, 16, 18, 19, 21}; - int x = 18; - int index = interpolationSearch.findIndex(arr, x); - Assert.assertEquals("Incorrect index", 4, index); + Integer arr[] = {10, 12, 13, 16, 18, 19, 21}; + int x = 18; + int index = interpolationSearch.findIndex(arr, x); + Assertions.assertEquals(4, index, "Incorrect index"); - Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100}; - x = -190; - index = interpolationSearch.findIndex(arrTwo, x); - Assert.assertEquals("Incorrect index", 1, index); - - String arrString[] = {"10", "12", "13", "16", "22", "25","29"}; - String stringX = "13"; - index = interpolationSearch.findIndex(arrString, stringX); - Assert.assertEquals("Incorrect index", 2, index); - } -} \ No newline at end of file + Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100}; + x = -190; + index = interpolationSearch.findIndex(arrTwo, x); + Assertions.assertEquals(1, index, "Incorrect index"); + + String arrString[] = {"10", "12", "13", "16", "22", "25", "29"}; + String stringX = "13"; + index = interpolationSearch.findIndex(arrString, stringX); + Assertions.assertEquals(2, index, "Incorrect index"); + } +} diff --git a/src/test/java/com/search/JumpSearchTest.java b/src/test/java/com/search/JumpSearchTest.java index 6587107..b41faf5 100644 --- a/src/test/java/com/search/JumpSearchTest.java +++ b/src/test/java/com/search/JumpSearchTest.java @@ -1,29 +1,27 @@ -package src.test.java.com.search; +package com.search; -import org.junit.Test; -import org.junit.Assert; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import src.main.java.com.search.JumpSearch; +class JumpSearchTest { -public class JumpSearchTest { + @Test + void testJumpSearch() { + JumpSearch jumpSearch = new JumpSearch(); - @Test - public void testJumpSearch() { - JumpSearch jumpSearch = new JumpSearch(); - - Integer arr[] = {11, 15, 16, 29, 36, 40, 42, 52}; - int x = 36; - int index = jumpSearch.findIndex(arr, x); - Assert.assertEquals("Incorrect index", 4, index); + Integer arr[] = {11, 15, 16, 29, 36, 40, 42, 52}; + int x = 36; + int index = jumpSearch.findIndex(arr, x); + Assertions.assertEquals(4, index, "Incorrect index"); - Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100}; - x = -120; - index = jumpSearch.findIndex(arrTwo, x); - Assert.assertEquals("Incorrect index", 5, index); - - String arrString[] = {"101", "122", "136", "165", "225", "251","291"}; - String stringX = "122"; - index = jumpSearch.findIndex(arrString, stringX); - Assert.assertEquals("Incorrect index", 1, index); - } -} \ No newline at end of file + Integer arrTwo[] = {-210, -190, -180, -160, -130, -120, -100}; + x = -120; + index = jumpSearch.findIndex(arrTwo, x); + Assertions.assertEquals(5, index, "Incorrect index"); + + String arrString[] = {"101", "122", "136", "165", "225", "251", "291"}; + String stringX = "122"; + index = jumpSearch.findIndex(arrString, stringX); + Assertions.assertEquals(1, index, "Incorrect index"); + } +} diff --git a/src/test/java/com/search/LinearSearchTest.java b/src/test/java/com/search/LinearSearchTest.java index ff652b4..88b5fa7 100644 --- a/src/test/java/com/search/LinearSearchTest.java +++ b/src/test/java/com/search/LinearSearchTest.java @@ -1,26 +1,24 @@ -package src.test.java.com.search; +package com.search; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.search.LinearSearch; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class LinearSearchTest { +class LinearSearchTest { @Test - public void testLinearSearch() { - - Integer[] arr1 = {1,2,3,4,5}; - Assert.assertEquals("Incorrect index", 2, LinearSearch.findIndex(arr1,3)); - Assert.assertEquals("Incorrect index", 0, LinearSearch.findIndex(arr1,1)); - Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr1,8)); - Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr1,-2)); + void testLinearSearch() { + Integer[] arr1 = {1, 2, 3, 4, 5}; + Assertions.assertEquals(2, LinearSearch.findIndex(arr1, 3), "Incorrect index"); + Assertions.assertEquals(0, LinearSearch.findIndex(arr1, 1), "Incorrect index"); + Assertions.assertEquals(-1, LinearSearch.findIndex(arr1, 8), "Incorrect index"); + Assertions.assertEquals(-1, LinearSearch.findIndex(arr1, -2), "Incorrect index"); String[] arr2 = {"A", "B", "C", "D"}; - Assert.assertEquals("Incorrect index", 2, LinearSearch.findIndex(arr2,"C")); - Assert.assertEquals("Incorrect index", 1, LinearSearch.findIndex(arr2,"B")); - Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr2,"F")); + Assertions.assertEquals(2, LinearSearch.findIndex(arr2, "C"), "Incorrect index"); + Assertions.assertEquals(1, LinearSearch.findIndex(arr2, "B"), "Incorrect index"); + Assertions.assertEquals(-1, LinearSearch.findIndex(arr2, "F"), "Incorrect index"); String[] arr3 = {}; - Assert.assertEquals("Incorrect index", -1, LinearSearch.findIndex(arr3, "")); + Assertions.assertEquals(-1, LinearSearch.findIndex(arr3, ""), "Incorrect index"); } } diff --git a/src/test/java/com/sorts/BubbleSortTest.java b/src/test/java/com/sorts/BubbleSortTest.java index e58d086..4d153d1 100644 --- a/src/test/java/com/sorts/BubbleSortTest.java +++ b/src/test/java/com/sorts/BubbleSortTest.java @@ -1,24 +1,22 @@ -package src.test.java.com.sorts; +package com.sorts; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.BubbleSort; +class BubbleSortTest { -public class BubbleSortTest { + @Test + void bubbleSortTest() { + BubbleSort bubbleSort = new BubbleSort(); - @Test - public void bubbleSortTest() { - BubbleSort bubbleSort = new BubbleSort(); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assertions.assertArrayEquals(sortedInt, bubbleSort.sort(unsortedInt)); - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, bubbleSort.sort(unsortedInt)); + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assertions.assertArrayEquals(sortedChar, bubbleSort.sort(unsortedChar)); - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - Assert.assertArrayEquals(sortedChar, bubbleSort.sort(unsortedChar)); - - } + } } diff --git a/src/test/java/com/sorts/CountingSortTest.java b/src/test/java/com/sorts/CountingSortTest.java index d852e58..3bbeb7f 100644 --- a/src/test/java/com/sorts/CountingSortTest.java +++ b/src/test/java/com/sorts/CountingSortTest.java @@ -1,13 +1,12 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.CountingSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class CountingSortTest { +class CountingSortTest { @Test - public void testCountingSort() { + void testCountingSort() { CountingSort countingSort = new CountingSort(); @@ -18,6 +17,6 @@ public void testCountingSort() { Integer[] sorted = new Integer[]{1, 1, 2, 2, 4, 5, 7}; // Comparing the two integer arrays - Assert.assertArrayEquals(sorted, countingSort.sort(unsorted)); + Assertions.assertArrayEquals(sorted, countingSort.sort(unsorted)); } } diff --git a/src/test/java/com/sorts/CycleSortTest.java b/src/test/java/com/sorts/CycleSortTest.java index 4e12125..720e5e5 100644 --- a/src/test/java/com/sorts/CycleSortTest.java +++ b/src/test/java/com/sorts/CycleSortTest.java @@ -1,35 +1,34 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.CycleSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class CycleSortTest { +class CycleSortTest { @Test - public void cycleSortIntegerTest() { + void cycleSortIntegerTest() { CycleSort cycleSort = new CycleSort(); // Test case for integers Integer[] unsortedInt = new Integer[]{5, 1, 7, 0, 2, 9, 6, 3, 4, 8}; Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, cycleSort.sort(unsortedInt)); + Assertions.assertArrayEquals(sortedInt, cycleSort.sort(unsortedInt)); // Test case for floating point numbers Float[] unsortedFloat = new Float[]{6.7f, 21.1f, 0.9f, -3.2f, 5.9f, -21.3f}; Float[] sortedFloat = new Float[]{-21.3f, -3.2f, 0.9f, 5.9f, 6.7f, 21.1f}; - Assert.assertArrayEquals(sortedFloat, cycleSort.sort(unsortedFloat)); + Assertions.assertArrayEquals(sortedFloat, cycleSort.sort(unsortedFloat)); // Test case for characters Character[] unsortedChar = new Character[]{'c', 'a', 'b', 'A', 'C', 'B'}; Character[] sortedChar = new Character[]{'A', 'B', 'C', 'a', 'b', 'c'}; - Assert.assertArrayEquals(sortedChar, cycleSort.sort(unsortedChar)); + Assertions.assertArrayEquals(sortedChar, cycleSort.sort(unsortedChar)); // Test case for Strings String[] unsortedStr = new String[]{"Edward", "Linus", "David", "Alan", "Dennis", "Robert", "Ken"}; String[] sortedStr = new String[]{"Alan", "David", "Dennis", "Edward", "Ken", "Linus", "Robert"}; - Assert.assertArrayEquals(sortedStr, cycleSort.sort(unsortedStr)); + Assertions.assertArrayEquals(sortedStr, cycleSort.sort(unsortedStr)); } } diff --git a/src/test/java/com/sorts/HeapSortTest.java b/src/test/java/com/sorts/HeapSortTest.java index 9d7cd93..2983da7 100644 --- a/src/test/java/com/sorts/HeapSortTest.java +++ b/src/test/java/com/sorts/HeapSortTest.java @@ -1,22 +1,21 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.HeapSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class HeapSortTest { +class HeapSortTest { - @Test - public void heapSortTest() { - HeapSort heapSort = new HeapSort(); + @Test + void heapSortTest() { + HeapSort heapSort = new HeapSort(); - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, heapSort.sort(unsortedInt)); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assertions.assertArrayEquals(sortedInt, heapSort.sort(unsortedInt)); - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - Assert.assertArrayEquals(sortedChar, heapSort.sort(unsortedChar)); - } + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assertions.assertArrayEquals(sortedChar, heapSort.sort(unsortedChar)); + } } diff --git a/src/test/java/com/sorts/InsertionSortTest.java b/src/test/java/com/sorts/InsertionSortTest.java index 1dcc6fe..f2767b3 100644 --- a/src/test/java/com/sorts/InsertionSortTest.java +++ b/src/test/java/com/sorts/InsertionSortTest.java @@ -1,34 +1,33 @@ -package src.test.java.com.sorts; - - -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.InsertionSort; - -public class InsertionSortTest { - - @Test - public void insertionSortTest() { - InsertionSort insertionSort = new InsertionSort(); - - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); - - unsortedInt = new Integer[]{5,4,3,2,1,0}; - sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; - Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); - - unsortedInt = new Integer[]{-1,-2,-3,-4,-5}; - sortedInt = new Integer[]{-5,-4,-3,-2,-1}; - Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); - - unsortedInt = new Integer[]{-1,-5,-10,-990,990,1010}; - sortedInt = new Integer[]{-990,-10,-5,-1,990,1010}; - Assert.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); - - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - Assert.assertArrayEquals(sortedChar, insertionSort.sort(unsortedChar)); - } +package com.sorts; + + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class InsertionSortTest { + + @Test + void insertionSortTest() { + InsertionSort insertionSort = new InsertionSort(); + + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assertions.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + + unsortedInt = new Integer[]{5, 4, 3, 2, 1, 0}; + sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; + Assertions.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + + unsortedInt = new Integer[]{-1, -2, -3, -4, -5}; + sortedInt = new Integer[]{-5, -4, -3, -2, -1}; + Assertions.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + + unsortedInt = new Integer[]{-1, -5, -10, -990, 990, 1010}; + sortedInt = new Integer[]{-990, -10, -5, -1, 990, 1010}; + Assertions.assertArrayEquals(sortedInt, insertionSort.sort(unsortedInt)); + + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assertions.assertArrayEquals(sortedChar, insertionSort.sort(unsortedChar)); + } } diff --git a/src/test/java/com/sorts/MergeSortTest.java b/src/test/java/com/sorts/MergeSortTest.java index 2585152..1eee789 100644 --- a/src/test/java/com/sorts/MergeSortTest.java +++ b/src/test/java/com/sorts/MergeSortTest.java @@ -1,34 +1,33 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.MergeSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class MergeSortTest { +class MergeSortTest { - @Test - public void mergeSortTest() { - MergeSort mergeSort = new MergeSort(); + @Test + void mergeSortTest() { + MergeSort mergeSort = new MergeSort(); - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assertions.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); - unsortedInt = new Integer[]{5, 4, 3, 2, 1, 0}; - sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; - Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + unsortedInt = new Integer[]{5, 4, 3, 2, 1, 0}; + sortedInt = new Integer[]{0, 1, 2, 3, 4, 5}; + Assertions.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); - unsortedInt = new Integer[]{-1, -2, -3, -4, -5}; - sortedInt = new Integer[]{-5, -4, -3, -2, -1}; - Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + unsortedInt = new Integer[]{-1, -2, -3, -4, -5}; + sortedInt = new Integer[]{-5, -4, -3, -2, -1}; + Assertions.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); - unsortedInt = new Integer[]{-1, -5, -10, -990, 990, 1010}; - sortedInt = new Integer[]{-990, -10, -5, -1, 990, 1010}; - Assert.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); + unsortedInt = new Integer[]{-1, -5, -10, -990, 990, 1010}; + sortedInt = new Integer[]{-990, -10, -5, -1, 990, 1010}; + Assertions.assertArrayEquals(sortedInt, mergeSort.sort(unsortedInt)); - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - Assert.assertArrayEquals(sortedChar, mergeSort.sort(unsortedChar)); - } + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assertions.assertArrayEquals(sortedChar, mergeSort.sort(unsortedChar)); + } } diff --git a/src/test/java/com/sorts/PigeonholeSortTest.java b/src/test/java/com/sorts/PigeonholeSortTest.java index 5195fc5..1ad1bba 100644 --- a/src/test/java/com/sorts/PigeonholeSortTest.java +++ b/src/test/java/com/sorts/PigeonholeSortTest.java @@ -1,30 +1,29 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.PigeonholeSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class PigeonholeSortTest { +class PigeonholeSortTest { @Test - public void testPigeonholeSort() { + void testPigeonholeSort() { PigeonholeSort pigeonholeSort = new PigeonholeSort(); // Test Case 1 Integer[] unsorted1 = new Integer[]{5, 1, 7, 2, 9, 6, 3, 4, 8}; Integer[] sorted1 = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sorted1, pigeonholeSort.sort(unsorted1)); + Assertions.assertArrayEquals(sorted1, pigeonholeSort.sort(unsorted1)); // Test Case 2 Integer[] unsorted2 = new Integer[]{-5, 1, 7, 2, -9, 6, -3, 4, 8}; Integer[] sorted2 = new Integer[]{-9, -5, -3, 1, 2, 4, 6, 7, 8}; - Assert.assertArrayEquals(sorted2, pigeonholeSort.sort(unsorted2)); + Assertions.assertArrayEquals(sorted2, pigeonholeSort.sort(unsorted2)); // Test Case 3 Integer[] unsorted3 = new Integer[]{-5, 1, 7, 2, -9, 6, -3, 4, 1, 8, 1, 1}; Integer[] sorted3 = new Integer[]{-9, -5, -3, 1, 1, 1, 1, 2, 4, 6, 7, 8}; - Assert.assertArrayEquals(sorted3, pigeonholeSort.sort(unsorted3)); + Assertions.assertArrayEquals(sorted3, pigeonholeSort.sort(unsorted3)); } } diff --git a/src/test/java/com/sorts/QuickSortTest.java b/src/test/java/com/sorts/QuickSortTest.java index 00154c1..62f66a0 100644 --- a/src/test/java/com/sorts/QuickSortTest.java +++ b/src/test/java/com/sorts/QuickSortTest.java @@ -1,22 +1,21 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.QuickSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class QuickSortTest { +class QuickSortTest { - @Test - public void quickSortTest() { - QuickSort quickSort = new QuickSort(); + @Test + void quickSortTest() { + QuickSort quickSort = new QuickSort(); - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, quickSort.sort(unsortedInt)); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assertions.assertArrayEquals(sortedInt, quickSort.sort(unsortedInt)); - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - Assert.assertArrayEquals(sortedChar, quickSort.sort(unsortedChar)); - } + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assertions.assertArrayEquals(sortedChar, quickSort.sort(unsortedChar)); + } } diff --git a/src/test/java/com/sorts/SelectionSortTest.java b/src/test/java/com/sorts/SelectionSortTest.java index cb9411c..ee64b7d 100644 --- a/src/test/java/com/sorts/SelectionSortTest.java +++ b/src/test/java/com/sorts/SelectionSortTest.java @@ -1,21 +1,20 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.SelectionSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class SelectionSortTest { +class SelectionSortTest { - @Test - public void selectionSortTest() { - SelectionSort selectionSort = new SelectionSort(); + @Test + void selectionSortTest() { + SelectionSort selectionSort = new SelectionSort(); - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, selectionSort.sort(unsortedInt)); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assertions.assertArrayEquals(sortedInt, selectionSort.sort(unsortedInt)); - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - Assert.assertArrayEquals(sortedChar, selectionSort.sort(unsortedChar)); - } + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assertions.assertArrayEquals(sortedChar, selectionSort.sort(unsortedChar)); + } } diff --git a/src/test/java/com/sorts/ShellSortTest.java b/src/test/java/com/sorts/ShellSortTest.java index a473de6..bc8e1dc 100644 --- a/src/test/java/com/sorts/ShellSortTest.java +++ b/src/test/java/com/sorts/ShellSortTest.java @@ -1,21 +1,20 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.ShellSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class ShellSortTest { +class ShellSortTest { - @Test - public void shellSortTest() { - ShellSort shellSort = new ShellSort(); + @Test + void shellSortTest() { + ShellSort shellSort = new ShellSort(); - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; - Assert.assertArrayEquals(sortedInt, shellSort.sort(unsortedInt)); + Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Assertions.assertArrayEquals(sortedInt, shellSort.sort(unsortedInt)); - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - Assert.assertArrayEquals(sortedChar, shellSort.sort(unsortedChar)); - } + Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + Assertions.assertArrayEquals(sortedChar, shellSort.sort(unsortedChar)); + } } diff --git a/src/test/java/com/sorts/StoogeSortTest.java b/src/test/java/com/sorts/StoogeSortTest.java index 90ddbe6..2f01ba9 100644 --- a/src/test/java/com/sorts/StoogeSortTest.java +++ b/src/test/java/com/sorts/StoogeSortTest.java @@ -1,27 +1,26 @@ -package src.test.java.com.sorts; +package com.sorts; -import org.junit.Assert; -import org.junit.Test; -import src.main.java.com.sorts.StoogeSort; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; -public class StoogeSortTest { +class StoogeSortTest { - @Test - public void stoogeSortTest() { - StoogeSort stoogesort = new StoogeSort(); + @Test + void stoogeSortTest() { + StoogeSort stoogesort = new StoogeSort(); - Integer unsortedArr[] = { 2, 4, 5, 3, 1 }; - Integer n = unsortedArr.length; - Integer sortedArr[] = { 1, 2, 3, 4, 5 }; - Assert.assertArrayEquals(sortedArr, stoogesort.sort(unsortedArr, 0, n - 1)); + Integer unsortedArr[] = {2, 4, 5, 3, 1}; + Integer n = unsortedArr.length; + Integer sortedArr[] = {1, 2, 3, 4, 5}; + Assertions.assertArrayEquals(sortedArr, stoogesort.sort(unsortedArr, 0, n - 1)); - unsortedArr = new Integer[] { -22, -34, -25, -53, -11 }; - sortedArr = new Integer[] { -53, -34, -25, -22, -11 }; - Assert.assertArrayEquals(sortedArr, stoogesort.sort(unsortedArr, 0, n - 1)); - - Character[] unsortedCharArr = new Character[] { 'a', 'r', 'd', 'k', 'p' }; - n = unsortedCharArr.length; - Character[] sortedCharArr = new Character[] { 'a', 'd', 'k', 'p', 'r' }; - Assert.assertArrayEquals(sortedCharArr, stoogesort.sort(unsortedCharArr, 0, n - 1)); - } -} \ No newline at end of file + unsortedArr = new Integer[]{-22, -34, -25, -53, -11}; + sortedArr = new Integer[]{-53, -34, -25, -22, -11}; + Assertions.assertArrayEquals(sortedArr, stoogesort.sort(unsortedArr, 0, n - 1)); + + Character[] unsortedCharArr = new Character[]{'a', 'r', 'd', 'k', 'p'}; + n = unsortedCharArr.length; + Character[] sortedCharArr = new Character[]{'a', 'd', 'k', 'p', 'r'}; + Assertions.assertArrayEquals(sortedCharArr, stoogesort.sort(unsortedCharArr, 0, n - 1)); + } +} diff --git a/src/test/java/com/generation/expected-result.png b/src/test/resources/com/generation/expected-result.png similarity index 100% rename from src/test/java/com/generation/expected-result.png rename to src/test/resources/com/generation/expected-result.png From d6002f87da6e52a8a5b357e0a15c26ae411ecb95 Mon Sep 17 00:00:00 2001 From: laingke Date: Fri, 19 Jul 2019 14:40:15 +0800 Subject: [PATCH 111/120] docs: update README --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 1987471..21e9512 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,6 @@ Make it a working Java project with full fledged test cases for each algorithm a - Fork the [Java Repo](https://github.com/TheAlgorithms/Java) - Open the forked repo on your local machine - Switch to the ```Development``` branch by using the command ```git checkout Development``` -- Add the JAR for JUnit to your build path. Here is a link for the [JUnit JAR](http://www.java2s.com/Code/Jar/j/Downloadjunit410jar.htm) - Make the changes on your local machine - Push the changes to the forked repository - Raise a PR against the Development branch From 98982f8f251578d31c4ac947fdfeaf7d900b62cf Mon Sep 17 00:00:00 2001 From: Renjith Date: Fri, 27 Sep 2019 22:35:00 -0700 Subject: [PATCH 112/120] Converting to a gradle project --- .gitignore | 3 + build.gradle | 19 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55190 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ pom.xml | 64 ------- settings.gradle | 5 + .../creational/factory/PolygonFactory.java | 4 +- .../structural/adapter/MovableAdapter.java | 4 +- src/main/java/com/sorts/PigeonholeSort.java | 2 +- 11 files changed, 293 insertions(+), 69 deletions(-) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index c2e8de7..7a55c43 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ Java.iml .idea/* out/ *.iml +.gradle +target +build diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..eeebf86 --- /dev/null +++ b/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +repositories { + mavenLocal() + maven { + url = 'http://repo.maven.apache.org/maven2' + } +} + +dependencies { + testCompile 'org.junit.jupiter:junit-jupiter-api:5.5.0' +} + +group = 'algorithm' +version = '1.0-SNAPSHOT' +description = 'java-algorithm' +sourceCompatibility = '1.8' \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..87b738cbd051603d91cc39de6cb000dd98fe6b02 GIT binary patch literal 55190 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 z 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..0f8d593 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 4bba7c6..0000000 --- a/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - 4.0.0 - - algorithm - java-algorithm - 1.0-SNAPSHOT - java-algorithm - All algorithms implemented in Java (for education) - - - UTF-8 - 3.1.0 - 3.8.0 - - 1.8 - UTF-8 - - 5.5.0 - - - - - org.junit.jupiter - junit-jupiter-api - ${junit-jupiter-api.version} - test - - - - - - - org.apache.maven.plugins - maven-resources-plugin - ${resources.plugin.version} - - ${file.encoding} - - - - org.apache.maven.plugins - maven-compiler-plugin - ${compiler.plugin.version} - - ${java.version} - ${java.version} - ${file.encoding} - - - - - - - src/main/resources - - - src/test/resources - - - - diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..12387ff --- /dev/null +++ b/settings.gradle @@ -0,0 +1,5 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +rootProject.name = 'java-algorithm' diff --git a/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java b/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java index bccaa6c..da184df 100644 --- a/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java +++ b/src/main/java/com/designpatterns/creational/factory/PolygonFactory.java @@ -3,8 +3,8 @@ /** * In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal * with the problem of creating objects without having to specify the exact class of the object that will be created. - * This is done by creating objects by calling a factory method—either specified in an interface and implemented by - * child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling + * This is done by creating objects by calling a factory method-either specified in an interface and implemented by + * child classes, or implemented in a base class and optionally overridden by derived classes-rather than by calling * a constructor. * * @see Factory Pattern diff --git a/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java b/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java index b3c4964..15aa583 100644 --- a/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java +++ b/src/main/java/com/designpatterns/structural/adapter/MovableAdapter.java @@ -2,11 +2,11 @@ /** * An Adapter pattern acts as a connector between two incompatible interfaces that otherwise cannot be connected - * directly. An Adapter wraps an existing class with a new interface so that it becomes compatible with the client’s + * directly. An Adapter wraps an existing class with a new interface so that it becomes compatible with the client's * interface. *
* The main motive behind using this pattern is to convert an existing interface into another interface that the client - * expects. It’s usually implemented once the application is designed. + * expects. It's usually implemented once the application is designed. * * @see Adapter Pattern */ diff --git a/src/main/java/com/sorts/PigeonholeSort.java b/src/main/java/com/sorts/PigeonholeSort.java index 8080b58..8e2a149 100644 --- a/src/main/java/com/sorts/PigeonholeSort.java +++ b/src/main/java/com/sorts/PigeonholeSort.java @@ -8,7 +8,7 @@ public class PigeonholeSort { * Pigeonhole sorting is a sorting algorithms that is suitable for sorting lists of elements where the number * of elements and the number of possible key values are approximately the same. *

- * It requires O(n + Range) time where n is number of elements in input array and ‘Range’ is number of possible + * It requires O(n + Range) time where n is number of elements in input array and 'Range' is number of possible * values in array. * * @param arr The array to be sorted From 5d790266e7faa7113e3a308ac74ca169ef324351 Mon Sep 17 00:00:00 2001 From: ali4j Date: Sun, 3 Nov 2019 18:05:40 +0330 Subject: [PATCH 113/120] adds proxy design pattern. --- .../structural/proxy/Citizen.java | 11 ++++++ .../structural/proxy/president/President.java | 27 +++++++++++++ .../proxy/president/PresidentSecretary.java | 25 ++++++++++++ .../structural/proxy/Citizen.java | 39 +++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 src/main/java/com/designpatterns/structural/proxy/Citizen.java create mode 100644 src/main/java/com/designpatterns/structural/proxy/president/President.java create mode 100644 src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java create mode 100644 src/test/java/com/designpatterns/structural/proxy/Citizen.java diff --git a/src/main/java/com/designpatterns/structural/proxy/Citizen.java b/src/main/java/com/designpatterns/structural/proxy/Citizen.java new file mode 100644 index 0000000..3f34e5f --- /dev/null +++ b/src/main/java/com/designpatterns/structural/proxy/Citizen.java @@ -0,0 +1,11 @@ +package com.designpatterns.structural.proxy; + +import com.designpatterns.structural.proxy.president.PresidentSecretary; + +public class Citizen { + + public static void main(String[] args) { + PresidentSecretary presidentSecretary = new PresidentSecretary(); + presidentSecretary.leaveValidMessageForPresident("Hello president."); + } +} diff --git a/src/main/java/com/designpatterns/structural/proxy/president/President.java b/src/main/java/com/designpatterns/structural/proxy/president/President.java new file mode 100644 index 0000000..18d0e31 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/proxy/president/President.java @@ -0,0 +1,27 @@ +package com.designpatterns.structural.proxy.president; + +import com.designpatterns.creational.singleton.Singleton; + +public class President { + + private volatile static President instance = null; + + private President() {} + + static President getInstance() { + if (instance == null) { + synchronized (Singleton.class) { + if (instance == null) { + instance = new President(); + } + } + } + return instance; + } + + + + void talkToThePresident(String message){ + System.out.println("I, the President, have received this message:" + message); + } +} diff --git a/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java b/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java new file mode 100644 index 0000000..fd90a0b --- /dev/null +++ b/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java @@ -0,0 +1,25 @@ +package com.designpatterns.structural.proxy.president; + +public class PresidentSecretary { + + private President president; + + public PresidentSecretary() { + this.president = President.getInstance(); + } + + public void leaveValidMessageForPresident(String message){ + + if(!isMessageValid(message)) + throw new RuntimeException("invalid message"); + + System.out.println("message is being sent to the President..."); + president.talkToThePresident(message); + System.out.println("message is received by the President."); + + } + + private boolean isMessageValid(String message) { + return message != null && !message.isEmpty() && message.length() >= 10 && message.length() <= 100; + } +} diff --git a/src/test/java/com/designpatterns/structural/proxy/Citizen.java b/src/test/java/com/designpatterns/structural/proxy/Citizen.java new file mode 100644 index 0000000..7f2fc45 --- /dev/null +++ b/src/test/java/com/designpatterns/structural/proxy/Citizen.java @@ -0,0 +1,39 @@ +package com.designpatterns.structural.proxy; + +import com.designpatterns.structural.proxy.president.PresidentSecretary; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class Citizen { + + + private PresidentSecretary presidentSecretary = new PresidentSecretary(); + + @Test + public void talkToPresident_secretaryShouldRejectTooShortMessage() { + String message = "Hi there."; + + Assertions.assertThrows(RuntimeException.class, () -> { + presidentSecretary.leaveValidMessageForPresident(message); + }); + } + + @Test + public void talkToPresident_secretaryShouldRejectTooLongMessage() { + String message = "Hi there. this is a message about some personal issue which I have decided to share with Mr.President."; + + Assertions.assertThrows(RuntimeException.class, () -> { + presidentSecretary.leaveValidMessageForPresident(message); + }); + } + + @Test + public void talkToPresident_secretaryShouldAcceptTheMessage() { + String message = "Hello Mr.President"; + + presidentSecretary.leaveValidMessageForPresident(message); + Assertions.assertTrue(true); + } + + +} From e30d11545f7ad66af401a7e843cf2a30727aa93e Mon Sep 17 00:00:00 2001 From: Ehsan Date: Fri, 29 Nov 2019 02:59:56 +0330 Subject: [PATCH 114/120] removes the Citizen class in src directory. changes messages printed by the secretary and the president. --- .../com/designpatterns/structural/proxy/Citizen.java | 11 ----------- .../structural/proxy/president/President.java | 2 +- .../proxy/president/PresidentSecretary.java | 4 ++-- 3 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 src/main/java/com/designpatterns/structural/proxy/Citizen.java diff --git a/src/main/java/com/designpatterns/structural/proxy/Citizen.java b/src/main/java/com/designpatterns/structural/proxy/Citizen.java deleted file mode 100644 index 3f34e5f..0000000 --- a/src/main/java/com/designpatterns/structural/proxy/Citizen.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.designpatterns.structural.proxy; - -import com.designpatterns.structural.proxy.president.PresidentSecretary; - -public class Citizen { - - public static void main(String[] args) { - PresidentSecretary presidentSecretary = new PresidentSecretary(); - presidentSecretary.leaveValidMessageForPresident("Hello president."); - } -} diff --git a/src/main/java/com/designpatterns/structural/proxy/president/President.java b/src/main/java/com/designpatterns/structural/proxy/president/President.java index 18d0e31..50b712b 100644 --- a/src/main/java/com/designpatterns/structural/proxy/president/President.java +++ b/src/main/java/com/designpatterns/structural/proxy/president/President.java @@ -22,6 +22,6 @@ static President getInstance() { void talkToThePresident(String message){ - System.out.println("I, the President, have received this message:" + message); + System.out.println("President: I have received the message:" + message); } } diff --git a/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java b/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java index fd90a0b..fb951ed 100644 --- a/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java +++ b/src/main/java/com/designpatterns/structural/proxy/president/PresidentSecretary.java @@ -13,9 +13,9 @@ public void leaveValidMessageForPresident(String message){ if(!isMessageValid(message)) throw new RuntimeException("invalid message"); - System.out.println("message is being sent to the President..."); + System.out.println("Secretary: message is being sent to the President..."); president.talkToThePresident(message); - System.out.println("message is received by the President."); + System.out.println("Secretary: message is sent to the President."); } From 45fee1868e3f6c67aa74d344811dc1e69edf1d86 Mon Sep 17 00:00:00 2001 From: Ehsan Date: Fri, 29 Nov 2019 03:03:25 +0330 Subject: [PATCH 115/120] adds commit to the President class. --- .../designpatterns/structural/proxy/president/President.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/designpatterns/structural/proxy/president/President.java b/src/main/java/com/designpatterns/structural/proxy/president/President.java index 50b712b..2b3f35e 100644 --- a/src/main/java/com/designpatterns/structural/proxy/president/President.java +++ b/src/main/java/com/designpatterns/structural/proxy/president/President.java @@ -2,6 +2,10 @@ import com.designpatterns.creational.singleton.Singleton; +/** + * This is a class which is gonna be proxied by PresidentSecretary. + * Whenever any citizen decides to contact the President, they have to talk to the Secretary. + */ public class President { private volatile static President instance = null; From 56b374ce9fbae6a55fa895a26f6e91eb7cb062cf Mon Sep 17 00:00:00 2001 From: Rajkumar Date: Sun, 8 Dec 2019 01:03:31 +0530 Subject: [PATCH 116/120] Fixed 'Generics' issue of bubble sort since Sort class should accept only comparable datatype rather than just restricting sort method --- src/main/java/com/sorts/BubbleSort.java | 4 +-- src/main/java/com/types/DataStructure.java | 2 +- src/main/java/com/types/Sort.java | 4 +-- src/test/java/com/sorts/BubbleSortTest.java | 27 ++++++++++++++++----- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/sorts/BubbleSort.java b/src/main/java/com/sorts/BubbleSort.java index f12504c..a22737b 100644 --- a/src/main/java/com/sorts/BubbleSort.java +++ b/src/main/java/com/sorts/BubbleSort.java @@ -2,7 +2,7 @@ import com.types.Sort; -public class BubbleSort implements Sort { +public class BubbleSort> implements Sort { /** * This method implements the Generic Bubble Sort * @@ -11,7 +11,7 @@ public class BubbleSort implements Sort { **/ @Override - public > T[] sort(T[] array) { + public T[] sort(T[] array) { int last = array.length; //Sorting boolean swap; diff --git a/src/main/java/com/types/DataStructure.java b/src/main/java/com/types/DataStructure.java index c8151ea..d2a9050 100644 --- a/src/main/java/com/types/DataStructure.java +++ b/src/main/java/com/types/DataStructure.java @@ -3,7 +3,7 @@ import java.util.Iterator; /** - * This interface is to define bacis functionality expected out of any implementation class + * This interface is to define basic functionality expected out of any implementation class * Since this is a data structure it should have the flexibility to contain any kind of object hence it has been made generic * Any implementation class need not to be thread safe or it could be depending on the implementation class how does it want to behave. * diff --git a/src/main/java/com/types/Sort.java b/src/main/java/com/types/Sort.java index cc9519c..876b8ee 100644 --- a/src/main/java/com/types/Sort.java +++ b/src/main/java/com/types/Sort.java @@ -1,7 +1,7 @@ package com.types; @FunctionalInterface -public interface Sort { +public interface Sort> { - > T[] sort(T[] array); + T[] sort(T[] array); } diff --git a/src/test/java/com/sorts/BubbleSortTest.java b/src/test/java/com/sorts/BubbleSortTest.java index 4d153d1..3a9f6d3 100644 --- a/src/test/java/com/sorts/BubbleSortTest.java +++ b/src/test/java/com/sorts/BubbleSortTest.java @@ -6,17 +6,32 @@ class BubbleSortTest { @Test - void bubbleSortTest() { - BubbleSort bubbleSort = new BubbleSort(); + void bubbleSortTestIntegers() { + BubbleSort bubbleSort = new BubbleSort<>(); - Integer[] unsortedInt = new Integer[]{0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; - Integer[] sortedInt = new Integer[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; + Integer[] unsortedInt = {0, 5, 9, 2, 1, 3, 4, 8, 6, 7}; + Integer[] sortedInt = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; Assertions.assertArrayEquals(sortedInt, bubbleSort.sort(unsortedInt)); - Character[] unsortedChar = new Character[]{'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; - Character[] sortedChar = new Character[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + } + + @Test + void bubbleSortTestCharacters() { + BubbleSort bubbleSort = new BubbleSort<>(); + + Character[] unsortedChar = {'f', 'h', 'c', 'a', 'b', 'd', 'g', 'e'}; + Character[] sortedChar = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; Assertions.assertArrayEquals(sortedChar, bubbleSort.sort(unsortedChar)); } + @Test + void bubbleSortTestStrings() { + BubbleSort bubbleSort = new BubbleSort<>(); + + String[] unsortedChar = {"abc", "adc", "bcd", "abb", "abc", "acb"}; + String[] sortedChar = {"abb", "abc", "abc", "acb", "adc", "bcd"}; + Assertions.assertArrayEquals(sortedChar, bubbleSort.sort(unsortedChar)); + + } } From c52e12aa05edd5cb4c4e4caa095717d44ccf950c Mon Sep 17 00:00:00 2001 From: Ehsan Date: Fri, 13 Dec 2019 23:08:14 +0330 Subject: [PATCH 117/120] commits decorator design pattern. --- .../decorator/CompressingDecorator.java | 39 +++++++++++++++++++ .../structural/decorator/EmailSender.java | 12 ++++++ .../decorator/EncodingDecorator.java | 24 ++++++++++++ .../structural/decorator/Sender.java | 5 +++ .../structural/decorator/SenderDecorator.java | 17 ++++++++ 5 files changed, 97 insertions(+) create mode 100644 src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java create mode 100644 src/main/java/com/designpatterns/structural/decorator/EmailSender.java create mode 100644 src/main/java/com/designpatterns/structural/decorator/EncodingDecorator.java create mode 100644 src/main/java/com/designpatterns/structural/decorator/Sender.java create mode 100644 src/main/java/com/designpatterns/structural/decorator/SenderDecorator.java diff --git a/src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java b/src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java new file mode 100644 index 0000000..b4a5da4 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java @@ -0,0 +1,39 @@ +package com.designpatterns.structural.decorator; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.zip.GZIPOutputStream; + +/** + * this is one of the concrete decorators + */ +public class CompressingDecorator extends SenderDecorator { + + public CompressingDecorator(Sender sender) { + super(sender); + } + + @Override + public String send(String content) { + String compressedContent = new String(compressContent(content)); + super.send(compressedContent); + return compressedContent; + } + + private byte[] compressContent(String content) { + try{ + ByteArrayOutputStream baostream = new ByteArrayOutputStream(); + OutputStream outStream = new GZIPOutputStream(baostream); + outStream.write(content.getBytes("UTF-8")); + outStream.close(); + byte[] compressedBytes = baostream.toByteArray(); // toString not always possible + return compressedBytes; + } catch (IOException e) { + throw new RuntimeException("exception happened while compressing email content"); + + } + } + + +} diff --git a/src/main/java/com/designpatterns/structural/decorator/EmailSender.java b/src/main/java/com/designpatterns/structural/decorator/EmailSender.java new file mode 100644 index 0000000..64e0d51 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/decorator/EmailSender.java @@ -0,0 +1,12 @@ +package com.designpatterns.structural.decorator; + +/** + * this is the class which should be decorated without any modification + */ +public class EmailSender implements Sender { + @Override + public String send(String content) { + System.out.println("sending \"" + content + "\" as email"); + return content; + } +} diff --git a/src/main/java/com/designpatterns/structural/decorator/EncodingDecorator.java b/src/main/java/com/designpatterns/structural/decorator/EncodingDecorator.java new file mode 100644 index 0000000..8ffd1ff --- /dev/null +++ b/src/main/java/com/designpatterns/structural/decorator/EncodingDecorator.java @@ -0,0 +1,24 @@ +package com.designpatterns.structural.decorator; + +import java.util.Base64; + +/** + * this is another concrete decorator. + */ +public class EncodingDecorator extends SenderDecorator { + + public EncodingDecorator(Sender sender) { + super(sender); + } + + @Override + public String send(String content) { + String encodedContent = encodeContent(content); + super.send(encodedContent); + return encodedContent; + } + + private String encodeContent(String content){ + return Base64.getEncoder().encodeToString(content.getBytes()); + } +} diff --git a/src/main/java/com/designpatterns/structural/decorator/Sender.java b/src/main/java/com/designpatterns/structural/decorator/Sender.java new file mode 100644 index 0000000..cadb90c --- /dev/null +++ b/src/main/java/com/designpatterns/structural/decorator/Sender.java @@ -0,0 +1,5 @@ +package com.designpatterns.structural.decorator; + +public interface Sender { + String send(String content); +} diff --git a/src/main/java/com/designpatterns/structural/decorator/SenderDecorator.java b/src/main/java/com/designpatterns/structural/decorator/SenderDecorator.java new file mode 100644 index 0000000..2903e69 --- /dev/null +++ b/src/main/java/com/designpatterns/structural/decorator/SenderDecorator.java @@ -0,0 +1,17 @@ +package com.designpatterns.structural.decorator; + +/** + * this is the base decorator. + */ +public class SenderDecorator implements Sender { + private Sender sender; + + public SenderDecorator(Sender sender) { + this.sender = sender; + } + + @Override + public String send(String content) { + return this.sender.send(content); + } +} From 59eb36e4abaf671ea41153bc873c302dd8c8f38a Mon Sep 17 00:00:00 2001 From: ehsan Date: Fri, 13 Dec 2019 23:57:49 +0330 Subject: [PATCH 118/120] commits tests for testing decorator pattern. --- .../decorator/DecoratorDemo.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/com/designpatterns/decorator/DecoratorDemo.java diff --git a/src/test/java/com/designpatterns/decorator/DecoratorDemo.java b/src/test/java/com/designpatterns/decorator/DecoratorDemo.java new file mode 100644 index 0000000..08aaf02 --- /dev/null +++ b/src/test/java/com/designpatterns/decorator/DecoratorDemo.java @@ -0,0 +1,43 @@ +package com.designpatterns.decorator; + +import com.designpatterns.structural.decorator.EmailSender; +import com.designpatterns.structural.decorator.EncodingDecorator; +import com.designpatterns.structural.decorator.Sender; +import com.designpatterns.structural.decorator.SenderDecorator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Base64; + +public class DecoratorDemo { + + @Test + public void testDecorator_sendEmailAsPlainText() { + String message = "test message"; + EmailSender sender = new EmailSender(); + String content = sender.send(message); + + Assertions.assertEquals(content, message); + + } + + @Test + public void testDecorator_sendEmailAsEncodedTest() { + String message = "test message"; + Sender sender = new SenderDecorator( + new EncodingDecorator( + new EmailSender() + ) + ); + + String encodedContent = sender.send(message); + + Assertions.assertEquals( + new String(Base64.getDecoder().decode (encodedContent)), + message + ); + + + + } +} From 78f7a803eaafb0ee1770ce100f7be59905f583b1 Mon Sep 17 00:00:00 2001 From: ehsan Date: Sat, 14 Dec 2019 22:03:49 +0330 Subject: [PATCH 119/120] adds new test for testing encoding and compressing email. --- .../decorator/CompressingDecorator.java | 14 +++---- .../decorator/DecoratorDemo.java | 37 ++++++++++++++----- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java b/src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java index b4a5da4..f1cea07 100644 --- a/src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java +++ b/src/main/java/com/designpatterns/structural/decorator/CompressingDecorator.java @@ -16,22 +16,20 @@ public CompressingDecorator(Sender sender) { @Override public String send(String content) { - String compressedContent = new String(compressContent(content)); + byte[] compressedBytes = compressContent(content); + String compressedContent = new String(compressedBytes); super.send(compressedContent); return compressedContent; } private byte[] compressContent(String content) { - try{ - ByteArrayOutputStream baostream = new ByteArrayOutputStream(); - OutputStream outStream = new GZIPOutputStream(baostream); - outStream.write(content.getBytes("UTF-8")); + try (ByteArrayOutputStream baostream = new ByteArrayOutputStream(); + OutputStream outStream = new GZIPOutputStream(baostream)){ + outStream.write(content.getBytes()); outStream.close(); - byte[] compressedBytes = baostream.toByteArray(); // toString not always possible - return compressedBytes; + return baostream.toByteArray(); } catch (IOException e) { throw new RuntimeException("exception happened while compressing email content"); - } } diff --git a/src/test/java/com/designpatterns/decorator/DecoratorDemo.java b/src/test/java/com/designpatterns/decorator/DecoratorDemo.java index 08aaf02..d28f3f6 100644 --- a/src/test/java/com/designpatterns/decorator/DecoratorDemo.java +++ b/src/test/java/com/designpatterns/decorator/DecoratorDemo.java @@ -1,9 +1,6 @@ package com.designpatterns.decorator; -import com.designpatterns.structural.decorator.EmailSender; -import com.designpatterns.structural.decorator.EncodingDecorator; -import com.designpatterns.structural.decorator.Sender; -import com.designpatterns.structural.decorator.SenderDecorator; +import com.designpatterns.structural.decorator.*; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -16,28 +13,50 @@ public void testDecorator_sendEmailAsPlainText() { String message = "test message"; EmailSender sender = new EmailSender(); String content = sender.send(message); - Assertions.assertEquals(content, message); - } @Test - public void testDecorator_sendEmailAsEncodedTest() { + public void testDecorator_sendEmailAsEncodedText() { String message = "test message"; Sender sender = new SenderDecorator( new EncodingDecorator( new EmailSender() ) ); - String encodedContent = sender.send(message); - Assertions.assertEquals( new String(Base64.getDecoder().decode (encodedContent)), message ); + } + @Test + public void testDecorator_sendEmailAsCompressedText() { + String message = "Java is a general-purpose programming language that is class-based, object-oriented, and designed to have as few implementation dependencies as possible. It is intended to let application developers write once, run anywhere (WORA),[15] meaning that compiled Java code can run on all platforms that support Java without the need for recompilation.[16] Java applications are typically compiled to bytecode that can run on any Java virtual machine (JVM) regardless of the underlying computer architecture. The syntax of Java is similar to C and C++, but it has fewer low-level facilities than either of them. As of 2019, Java was one of the most popular programming languages in use according to GitHub,[17][18] particularly for client-server web applications, with a reported 9 million developers."; + Sender sender = new SenderDecorator( + new CompressingDecorator( + new EmailSender() + ) + ); + String compressedContent = sender.send(message); + Assertions.assertTrue(message.length()>= compressedContent.length()); + } + + @Test + public void testDecorator_sendEmailAsEncodedCompressedText() { + String message = "Java is a general-purpose programming language that is class-based, object-oriented, and designed to have as few implementation dependencies as possible. It is intended to let application developers write once, run anywhere (WORA),[15] meaning that compiled Java code can run on all platforms that support Java without the need for recompilation.[16] Java applications are typically compiled to bytecode that can run on any Java virtual machine (JVM) regardless of the underlying computer architecture. The syntax of Java is similar to C and C++, but it has fewer low-level facilities than either of them. As of 2019, Java was one of the most popular programming languages in use according to GitHub,[17][18] particularly for client-server web applications, with a reported 9 million developers."; + Sender sender = new SenderDecorator( + new EncodingDecorator( + new CompressingDecorator( + new EmailSender() + ) + ) + ); + String encodedCompressedContent = sender.send(message); + String decodedCompressed = new String( Base64.getDecoder().decode (encodedCompressedContent)); + Assertions.assertTrue(message.length()>= decodedCompressed.length()); } } From f01521038252c139f68e486de81b60a9adb8517b Mon Sep 17 00:00:00 2001 From: Myron Rotter Date: Sat, 4 Jan 2020 11:04:48 +0100 Subject: [PATCH 120/120] Add simple gradle workflow --- .github/workflows/gradle.yml | 38 ++++++++++++++++++++++++++++++++++++ .gitignore | 8 ++++++++ build.gradle | 12 ++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..3f635f4 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,38 @@ +name: Java gradle CI + +on: + push: + branches: + - Development + +jobs: + test: + name: Test algorithms + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + java-version: [1.8, 11] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout project + uses: actions/checkout@v2 + with: + ref: Development + - name: Set up jdk + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java-version }} + - name: JUnit5 tests on ubuntu + if: startsWith(matrix.os, 'ubuntu') + run: | + chmod +x gradlew + ./gradlew clean test + - name: JUnit5 tests on macos + if: startsWith(matrix.os, 'macos') + run: | + chmod +x gradlew + ./gradlew clean test + - name: JUnit5 tests on windows + if: startsWith(matrix.os, 'windows') + run: gradle clean test diff --git a/.gitignore b/.gitignore index 7a55c43..a143f23 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,15 @@ +.settings + +.classpath +.project + Java.iml .idea/* out/ *.iml + .gradle + +bin target build diff --git a/build.gradle b/build.gradle index eeebf86..04d375e 100644 --- a/build.gradle +++ b/build.gradle @@ -10,10 +10,18 @@ repositories { } dependencies { - testCompile 'org.junit.jupiter:junit-jupiter-api:5.5.0' + testImplementation('org.junit.jupiter:junit-jupiter-api:5.5.0') + testRuntime('org.junit.jupiter:junit-jupiter-engine:5.5.0') +} + +test { + useJUnitPlatform() + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + } } group = 'algorithm' version = '1.0-SNAPSHOT' description = 'java-algorithm' -sourceCompatibility = '1.8' \ No newline at end of file +sourceCompatibility = '1.8'